diff options
Diffstat (limited to 'js/dojo/dojox/mobile')
673 files changed, 40557 insertions, 0 deletions
diff --git a/js/dojo/dojox/mobile/Button.js b/js/dojo/dojox/mobile/Button.js new file mode 100644 index 0000000..b5d196a --- /dev/null +++ b/js/dojo/dojox/mobile/Button.js @@ -0,0 +1,78 @@ +//>>built +define("dojox/mobile/Button", [ + "dojo/_base/array", + "dojo/_base/declare", + "dojo/dom-class", + "dojo/dom-construct", + "dijit/_WidgetBase", + "dijit/form/_ButtonMixin", + "dijit/form/_FormWidgetMixin" +], + function(array, declare, domClass, domConstruct, WidgetBase, ButtonMixin, FormWidgetMixin){ + + /*===== + WidgetBase = dijit._WidgetBase; + FormWidgetMixin = dijit.form._FormWidgetMixin; + ButtonMixin = dijit.form._ButtonMixin; + =====*/ + return declare("dojox.mobile.Button", [WidgetBase, FormWidgetMixin, ButtonMixin], { + // summary: + // Non-templated BUTTON widget with a thin API wrapper for click events and setting the label + // + // 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 dojoType="dijit.form.Button" onClick="...">Hello world</button> + + baseClass: "mblButton", + + // Override automatic assigning type --> node, it causes exception on IE. + // Instead, type must be specified as this.type when the node is created, as part of the original DOM + _setTypeAttr: null, + + // duration: Number + // duration of selection, milliseconds or -1 for no post-click CSS styling + duration: 1000, + + _onClick: function(e){ + var ret = this.inherited(arguments); + if(ret && this.duration >= 0){ // if its not a button with a state, then emulate press styles + var button = this.focusNode || this.domNode; + var newStateClasses = (this.baseClass+' '+this["class"]).split(" "); + newStateClasses = array.map(newStateClasses, function(c){ return c+"Selected"; }); + domClass.add(button, newStateClasses); + setTimeout(function(){ + domClass.remove(button, newStateClasses); + }, this.duration); + } + return ret; + }, + + isFocusable: function(){ return false; }, + + buildRendering: function(){ + if(!this.srcNodeRef){ + this.srcNodeRef = domConstruct.create("button", {"type": this.type}); + }else if(this._cv){ + var n = this.srcNodeRef.firstChild; + if(n && n.nodeType === 3){ + n.nodeValue = this._cv(n.nodeValue); + } + } + this.inherited(arguments); + this.focusNode = this.domNode; + }, + + postCreate: function(){ + this.inherited(arguments); + this.connect(this.domNode, "onclick", "_onClick"); + }, + + _setLabelAttr: function(/*String*/ content){ + this.inherited(arguments, [this._cv ? this._cv(content) : content]); + } + }); + +}); diff --git a/js/dojo/dojox/mobile/Carousel.js b/js/dojo/dojox/mobile/Carousel.js new file mode 100644 index 0000000..cc2a2d1 --- /dev/null +++ b/js/dojo/dojox/mobile/Carousel.js @@ -0,0 +1,323 @@ +//>>built +define("dojox/mobile/Carousel", [ + "dojo/_base/kernel", + "dojo/_base/array", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/event", + "dojo/_base/lang", + "dojo/_base/sniff", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-style", + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase", + "./PageIndicator", + "./SwapView", + "require" +], function(kernel, array, connect, declare, event, lang, has, domClass, domConstruct, domStyle, Contained, Container, WidgetBase, PageIndicator, SwapView, require){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; + var PageIndicator = dojox.mobile.PageIndicator; + var SwapView = dojox.mobile.SwapView; +=====*/ + + // module: + // dojox/mobile/Carousel + // summary: + // A carousel widget that manages a list of images + + kernel.experimental("dojox.mobile.Carousel"); + + return declare("dojox.mobile.Carousel", [WidgetBase, Container, Contained], { + // summary: + // A carousel widget that manages a list of images + // description: + // The carousel widget manages a list of images that can be + // displayed horizontally, and allows the user to scroll through + // the list and select a single item. + + // numVisible: Number + // The number of visible items. + numVisible: 3, + + // title: String + // A title of the carousel to be displayed on the title bar. + title: "", + + // pageIndicator: Boolean + // If true, a page indicator, a series of small dots that indicate + // the current page, is displayed on the title bar. + pageIndicator: true, + + // navButton: Boolean + // If true, navigation buttons are displyaed on the title bar. + navButton: false, + + // height: String + // Explicitly specified height of the widget (ex. "300px"). If + // "inherit" is specified, the height is inherited from its offset + // parent. + height: "300px", + + // store: Object + // Reference to data provider object used by this widget. + store: null, + + // query: Object + // A query that can be passed to 'store' to initially filter the + // items. + query: null, + + // queryOptions: Object + // An optional parameter for the query. + queryOptions: null, + + buildRendering: function(){ + this.inherited(arguments); + this.domNode.className = "mblCarousel"; + var h; + if(this.height === "inherit"){ + if(this.domNode.offsetParent){ + h = this.domNode.offsetParent.offsetHeight + "px"; + } + }else if(this.height){ + h = this.height; + } + this.domNode.style.height = h; + this.headerNode = domConstruct.create("DIV", {className:"mblCarouselHeaderBar"}, this.domNode); + + if(this.navButton){ + this.btnContainerNode = domConstruct.create("DIV", { + className: "mblCarouselBtnContainer" + }, this.headerNode); + domStyle.set(this.btnContainerNode, "float", "right"); // workaround for webkit rendering problem + this.prevBtnNode = domConstruct.create("BUTTON", { + className: "mblCarouselBtn", + title: "Previous", + innerHTML: "<" + }, this.btnContainerNode); + this.nextBtnNode = domConstruct.create("BUTTON", { + className: "mblCarouselBtn", + title: "Next", + innerHTML: ">" + }, this.btnContainerNode); + this.connect(this.prevBtnNode, "onclick", "onPrevBtnClick"); + this.connect(this.nextBtnNode, "onclick", "onNextBtnClick"); + } + + if(this.pageIndicator){ + if(!this.title){ + this.title = " "; + } + this.piw = new PageIndicator(); + domStyle.set(this.piw, "float", "right"); // workaround for webkit rendering problem + this.headerNode.appendChild(this.piw.domNode); + } + + this.titleNode = domConstruct.create("DIV", { + className: "mblCarouselTitle" + }, this.headerNode); + + this.containerNode = domConstruct.create("DIV", {className:"mblCarouselPages"}, this.domNode); + connect.subscribe("/dojox/mobile/viewChanged", this, "handleViewChanged"); + }, + + startup: function(){ + if(this._started){ return; } + if(this.store){ + var store = this.store; + this.store = null; + this.setStore(store, this.query, this.queryOptions); + } + this.inherited(arguments); + }, + + setStore: function(store, query, queryOptions){ + // summary: + // Sets the store to use with this widget. + if(store === this.store){ return; } + this.store = store; + this.query = query; + this.queryOptions = queryOptions; + this.refresh(); + }, + + refresh: function(){ + if(!this.store){ return; } + this.store.fetch({ + query: this.query, + queryOptions: this.queryOptions, + onComplete: lang.hitch(this, "generate"), + onError: lang.hitch(this, "onError") + }); + }, + + generate: function(/*Array*/items, /*Object*/ dataObject){ + array.forEach(this.getChildren(), function(child){ + if(child instanceof SwapView){ + child.destroyRecursive(); + } + }); + this.items = items; + this.swapViews = []; + this.images = []; + var nPages = Math.ceil(items.length / this.numVisible); + var h = this.domNode.offsetHeight - this.headerNode.offsetHeight; + for(var i = 0; i < nPages; i++){ + var w = new SwapView({height:h+"px"}); + this.addChild(w); + this.swapViews.push(w); + w._carouselImages = []; + if(i === 0 && this.piw){ + this.piw.refId = w.id; + } + for(var j = 0; j < this.numVisible; j++){ + var idx = i * this.numVisible + j; + var item = idx < items.length ? items[idx] : + {src:require.toUrl("dojo/resources/blank.gif"), height:"1px"}; + var disp = w.domNode.style.display; + w.domNode.style.display = ""; // need to be visible during the size calculation + var box = this.createBox(item, h); + w.containerNode.appendChild(box); + box.appendChild(this.createHeaderText(item)); + var img = this.createContent(item, idx); + box.appendChild(img); + box.appendChild(this.createFooterText(item)); + this.resizeContent(item, box, img); + w.domNode.style.display = disp; + + if(item.height !== "1px"){ + this.images.push(img); + w._carouselImages.push(img); + } + } + } + if(this.swapViews[0]){ + this.loadImages(this.swapViews[0]); + } + if(this.swapViews[1]){ + this.loadImages(this.swapViews[1]); // pre-fetch the next view images + } + this.currentView = this.swapViews[0]; + if(this.piw){ + this.piw.reset(); + } + }, + + createBox: function(item, h){ + var width = item.width || (90/this.numVisible + "%"); + var height = item.height || h + "px"; + var m = has("ie") ? 5/this.numVisible-1 : 5/this.numVisible; + var margin = item.margin || (m + "%"); + var box = domConstruct.create("DIV", { + className: "mblCarouselBox" + }); + domStyle.set(box, { + margin: "0px " + margin, + width: width, + height: height + }); + return box; + }, + + createHeaderText: function(item){ + this.headerTextNode = domConstruct.create("DIV", { + className: "mblCarouselImgHeaderText", + innerHTML: item.headerText ? item.headerText : " " + }); + return this.headerTextNode; + }, + + createContent: function(item, idx){ + var props = { + alt: item.alt || "", + tabIndex: "0", // for keyboard navigation on a desktop browser + className: "mblCarouselImg" + }; + var img = domConstruct.create("IMG", props); + img._idx = idx; + if(item.height !== "1px"){ + this.connect(img, "onclick", "onClick"); + this.connect(img, "onkeydown", "onClick"); + connect.connect(img, "ondragstart", event.stop); + }else{ + img.style.visibility = "hidden"; + } + return img; + }, + + createFooterText: function(item){ + this.footerTextNode = domConstruct.create("DIV", { + className: "mblCarouselImgFooterText", + innerHTML: item.footerText ? item.footerText : " " + }); + return this.footerTextNode; + }, + + resizeContent: function(item, box, img){ + if(item.height !== "1px"){ + img.style.height = (box.offsetHeight - this.headerTextNode.offsetHeight - this.footerTextNode.offsetHeight) + "px"; + } + }, + + onError: function(errText){ + }, + + onPrevBtnClick: function(e){ + if(this.currentView){ + this.currentView.goTo(-1); + } + }, + + onNextBtnClick: function(e){ + if(this.currentView){ + this.currentView.goTo(1); + } + }, + + onClick: function(e){ + if(e && e.type === "keydown" && e.keyCode !== 13){ return; } + var img = e.currentTarget; + for(var i = 0; i < this.images.length; i++){ + if(this.images[i] === img){ + domClass.add(img, "mblCarouselImgSelected"); + }else{ + domClass.remove(this.images[i], "mblCarouselImgSelected"); + } + } + domStyle.set(img, "opacity", 0.4); + setTimeout(function(){ + domStyle.set(img, "opacity", 1); + }, 1000); + connect.publish("/dojox/mobile/carouselSelect", [this, img, this.items[img._idx], img._idx]); + }, + + loadImages: function(view){ + if(!view){ return; } + var imgs = view._carouselImages; + array.forEach(imgs, function(img){ + if(!img.src){ + var item = this.items[img._idx]; + img.src = item.src; + } + }, this); + }, + + handleViewChanged: function(view){ + if(view.getParent() !== this){ return; } + this.currentView = view; + // lazy-load images in the next view + this.loadImages(view.nextView(view.domNode)); + }, + + _setTitleAttr: function(/*String*/title){ + this.title = title; + this.titleNode.innerHTML = this._cv ? this._cv(title) : title; + } + }); +}); diff --git a/js/dojo/dojox/mobile/CheckBox.js b/js/dojo/dojox/mobile/CheckBox.js new file mode 100644 index 0000000..4d95c02 --- /dev/null +++ b/js/dojo/dojox/mobile/CheckBox.js @@ -0,0 +1,36 @@ +//>>built +define("dojox/mobile/CheckBox", [ + "dojo/_base/declare", + "dojo/dom-construct", + "dijit/form/_CheckBoxMixin", + "./ToggleButton" +], + function(declare, domConstruct, CheckBoxMixin, ToggleButton){ + + /*===== + ToggleButton = dojox.mobile.ToggleButton; + CheckBoxMixin = dijit.form._CheckBoxMixin; + =====*/ + return declare("dojox.mobile.CheckBox", [ToggleButton, CheckBoxMixin], { + // summary: + // A non-templated checkbox widget that can be in two states (checked or not). + + baseClass: "mblCheckBox", + + _setTypeAttr: function(){}, // cannot be changed: IE complains w/o this + + buildRendering: function(){ + if(!this.srcNodeRef){ + // The following doesn't work on IE < 8 if the default state is checked. + // You have to use "<input checked>" instead but it's not worth the bytes here. + this.srcNodeRef = domConstruct.create("input", {type: this.type}); + } + this.inherited(arguments); + this.focusNode = this.domNode; + }, + + _getValueAttr: function(){ + return (this.checked ? this.value : false); + } + }); +}); diff --git a/js/dojo/dojox/mobile/ComboBox.js b/js/dojo/dojox/mobile/ComboBox.js new file mode 100644 index 0000000..bdfad2c --- /dev/null +++ b/js/dojo/dojox/mobile/ComboBox.js @@ -0,0 +1,225 @@ +//>>built +define("dojox/mobile/ComboBox", [ + "dojo/_base/kernel", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom-geometry", + "dojo/dom-style", + "dojo/window", + "dijit/form/_AutoCompleterMixin", + "dijit/popup", + "./_ComboBoxMenu", + "./TextBox", + "./sniff" +], function(kernel, declare, lang, win, domGeometry, domStyle, windowUtils, AutoCompleterMixin, popup, ComboBoxMenu, TextBox, has){ + kernel.experimental("dojox.mobile.ComboBox"); // should be using a more native search-type UI + + /*===== + TextBox = dojox.mobile.TextBox; + AutoCompleterMixin = dijit.form._AutoCompleterMixin; + =====*/ + return declare("dojox.mobile.ComboBox", [TextBox, AutoCompleterMixin], { + // summary: + // A non-templated auto-completing text box widget + // + + // dropDownClass: [protected extension] String + // Name of the dropdown widget class used to select a date/time. + // Subclasses should specify this. + dropDownClass: "dojox.mobile._ComboBoxMenu", + + // initially disable selection since iphone displays selection handles that makes it hard to pick from the list + selectOnClick: false, + autoComplete: false, + + // dropDown: [protected] Widget + // The widget to display as a popup. This widget *must* be + // defined before the startup function is called. + dropDown: null, + + // maxHeight: [protected] Integer + // The max height for our dropdown. + // Any dropdown taller than this will have scrollbars. + // Set to -1 to limit height to available space in viewport + maxHeight: -1, + + // 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"], + + _throttleOpenClose: function(){ + // prevent open/close in rapid succession + if(this._throttleHandler){ + clearTimeout(this._throttleHandler); + } + this._throttleHandler = setTimeout(lang.hitch(this, function(){ this._throttleHandler = null; }), 500); + }, + + _onFocus: function(){ + this.inherited(arguments); + if(!this._opened && !this._throttleHandler){ + this._startSearchAll(); // show dropdown if user is selecting Next/Previous from virtual keyboard + } + }, + + onInput: function(e){ + this._onKey(e); + this.inherited(arguments); + }, + + _setListAttr: function(v){ + this._set('list', v); // needed for Firefox 4+ to prevent HTML5 mode + }, + + closeDropDown: function(){ + // summary: + // Closes the drop down on this widget + // tags: + // protected + + this._throttleOpenClose(); + if(this.startHandler){ + this.disconnect(this.startHandler); + this.startHandler = null; + if(this.moveHandler){ this.disconnect(this.moveHandler); } + if(this.endHandler){ this.disconnect(this.endHandler); } + } + this.inherited(arguments); + popup.close(this.dropDown); + this._opened = false; + }, + + 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 popup.open() + // tags: + // protected + + var wasClosed = !this._opened; + var dropDown = this.dropDown, + ddNode = dropDown.domNode, + aroundNode = this.domNode, + self = this; + + + // TODO: isn't maxHeight dependent on the return value from popup.open(), + // ie, dependent on how much space is available (BK) + + if(!this._preparedNode){ + this._preparedNode = true; + // Check if we have explicitly set width and height on the dropdown widget dom node + if(ddNode.style.width){ + this._explicitDDWidth = true; + } + if(ddNode.style.height){ + this._explicitDDHeight = true; + } + } + + // Code for resizing dropdown (height limitation, or increasing width to match my width) + var myStyle = { + display: "", + overflow: "hidden", + visibility: "hidden" + }; + if(!this._explicitDDWidth){ + myStyle.width = ""; + } + if(!this._explicitDDHeight){ + myStyle.height = ""; + } + domStyle.set(ddNode, myStyle); + + // Figure out maximum height allowed (if there is a height restriction) + var maxHeight = this.maxHeight; + if(maxHeight == -1){ + // limit height to space available in viewport either above or below my domNode + // (whichever side has more room) + var viewport = windowUtils.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); + + 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.position(this.dropDown.containerNode, false); + var overHeight = (maxHeight && mb.h > maxHeight); + if(overHeight){ + mb.h = maxHeight; + } + + // Adjust dropdown width to match or be larger than my width + mb.w = Math.max(mb.w, aroundNode.offsetWidth); + domGeometry.setMarginBox(ddNode, mb); + + var retVal = popup.open({ + parent: this, + popup: dropDown, + around: aroundNode, + orient: this.dropDownPosition, + onExecute: function(){ + self.closeDropDown(); + }, + onCancel: function(){ + self.closeDropDown(); + }, + onClose: function(){ + self._opened = false; + } + }); + this._opened=true; + + if(wasClosed){ + if(retVal.aroundCorner.charAt(0) == 'B'){ // is popup below? + this.domNode.scrollIntoView(true); // scroll to top + } + this.startHandler = this.connect(win.doc.documentElement, has("touch") ? "ontouchstart" : "onmousedown", + lang.hitch(this, function(){ + var isMove = false; + this.moveHandler = this.connect(win.doc.documentElement, has("touch") ? "ontouchmove" : "onmousemove", function(){ isMove = true; }); + this.endHandler = this.connect(win.doc.documentElement, has("touch") ? "ontouchend" : "onmouseup", function(){ if(!isMove){ this.closeDropDown(); } }); + }) + ); + } + return retVal; + }, + + postCreate: function(){ + this.inherited(arguments); + this.connect(this.domNode, "onclick", "_onClick"); + }, + + _onClick: function(/*Event*/ e){ + // throttle clicks to prevent double click from doing double actions + if(!this._throttleHandler){ + if(this.opened){ + this.closeDropDown(); + }else{ + this._startSearchAll(); + } + } + } + }); +}); diff --git a/js/dojo/dojox/mobile/ContentPane.js b/js/dojo/dojox/mobile/ContentPane.js new file mode 100644 index 0000000..9ce9b9d --- /dev/null +++ b/js/dojo/dojox/mobile/ContentPane.js @@ -0,0 +1,126 @@ +//>>built +define("dojox/mobile/ContentPane", [ + "dojo/_base/kernel", + "dojo/_base/array", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/window", + "dijit/_Contained", + "dijit/_WidgetBase", + "dojo/_base/xhr", + "./ProgressIndicator" +], function(dojo, array, declare, lang, win, Contained, WidgetBase, xhr, ProgressIndicator){ + +/*===== + var Contained = dijit._Contained; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/ContentPane + // summary: + // A very simple content pane to embed an HTML fragment. + + return declare("dojox.mobile.ContentPane", [WidgetBase, Contained],{ + // summary: + // A very simple content pane to embed an HTML fragment. + // description: + // This widget embeds an HTML fragment and run the parser. onLoad() + // is called when parsing is done and the content is ready. + // "dojo/_base/xhr" is in the dependency list. Usually this is not + // necessary, but there is a case where dojox.mobile custom build + // does not contain xhr. Note that this widget does not inherit + // from dijit._Container. + + // href: String + // URL of the content to embed. + href: "", + + // content: String + // An html fragment to embed. + content: "", + + // parseOnLoad: Boolean + // If true, runs the parser when the load completes. + parseOnLoad: true, + + // prog: Boolean + // If true, shows progress indicator. + prog: true, + + buildRendering: function(){ + this.inherited(arguments); + this.domNode.className = "mblContentPane"; + if(!this.containerNode){ + this.containerNode = this.domNode; + } + }, + + startup: function(){ + if(this._started){ return; } + if(this.prog){ + this._p = ProgressIndicator.getInstance(); + } + var parent = this.getParent && this.getParent(); + if(!parent || !parent.resize){ // top level widget + this.resize(); + } + this.inherited(arguments); + }, + + resize: function(){ + // summary: + // Calls resize() of each child widget. + array.forEach(this.getChildren(), function(child){ + if(child.resize){ child.resize(); } + }); + }, + + loadHandler: function(/*String*/response){ + // summary: + // A handler called when load completes. + this.set("content", response); + }, + + errorHandler: function(err){ + // summary: + // An error handler called when load fails. + if(this._p){ this._p.stop(); } + }, + + onLoad: function(){ + // summary: + // Stub method to allow the application to connect to. + // Called when parsing is done and the content is ready. + }, + + _setHrefAttr: function(/*String*/href){ + var p = this._p; + if(p){ + win.body().appendChild(p.domNode); + p.start(); + } + this.href = href; + xhr.get({ + url: href, + handleAs: "text", + load: lang.hitch(this, "loadHandler"), + error: lang.hitch(this, "errorHandler") + }); + }, + + _setContentAttr: function(/*String|DomNode*/data){ + this.destroyDescendants(); + if(typeof data === "object"){ + this.domNode.appendChild(data); + }else{ + this.domNode.innerHTML = data; + } + if(this.parseOnLoad){ + dojo.parser.parse(this.domNode); + } + if(this._p){ this._p.stop(); } + this.onLoad(); + } + }); +}); diff --git a/js/dojo/dojox/mobile/EdgeToEdgeCategory.js b/js/dojo/dojox/mobile/EdgeToEdgeCategory.js new file mode 100644 index 0000000..f5ef94a --- /dev/null +++ b/js/dojo/dojox/mobile/EdgeToEdgeCategory.js @@ -0,0 +1,24 @@ +//>>built +define("dojox/mobile/EdgeToEdgeCategory", [ + "dojo/_base/declare", + "./RoundRectCategory" +], function(declare, RoundRectCategory){ + +/*===== + var RoundRectCategory = dojox.mobile.RoundRectCategory; +=====*/ + + // module: + // dojox/mobile/EdgeToEdgeCategory + // summary: + // A category header for an edge-to-edge list. + + return declare("dojox.mobile.EdgeToEdgeCategory", RoundRectCategory, { + // summary: + // A category header for an edge-to-edge list. + buildRendering: function(){ + this.inherited(arguments); + this.domNode.className = "mblEdgeToEdgeCategory"; + } + }); +}); diff --git a/js/dojo/dojox/mobile/EdgeToEdgeDataList.js b/js/dojo/dojox/mobile/EdgeToEdgeDataList.js new file mode 100644 index 0000000..3efa80f --- /dev/null +++ b/js/dojo/dojox/mobile/EdgeToEdgeDataList.js @@ -0,0 +1,25 @@ +//>>built +define("dojox/mobile/EdgeToEdgeDataList", [ + "dojo/_base/declare", + "./EdgeToEdgeList", + "./_DataListMixin" +], function(declare, EdgeToEdgeList, DataListMixin){ + +/*===== + var EdgeToEdgeList = dojox.mobile.EdgeToEdgeList; + var DataListMixin = dojox.mobile._DataListMixin; +=====*/ + + // module: + // dojox/mobile/EdgeToEdgeDataList + // summary: + // An enhanced version of EdgeToEdgeList. + + return declare("dojox.mobile.EdgeToEdgeDataList", [EdgeToEdgeList, DataListMixin],{ + // summary: + // An enhanced version of EdgeToEdgeList. + // description: + // EdgeToEdgeDataList is an enhanced version of EdgeToEdgeList. It + // can generate ListItems according to the given dojo.data store. + }); +}); diff --git a/js/dojo/dojox/mobile/EdgeToEdgeList.js b/js/dojo/dojox/mobile/EdgeToEdgeList.js new file mode 100644 index 0000000..16ca81e --- /dev/null +++ b/js/dojo/dojox/mobile/EdgeToEdgeList.js @@ -0,0 +1,29 @@ +//>>built +define("dojox/mobile/EdgeToEdgeList", [ + "dojo/_base/declare", + "./RoundRectList" +], function(declare, RoundRectList){ + +/*===== + var RoundRectList = dojox.mobile.RoundRectList; +=====*/ + + // module: + // dojox/mobile/EdgeToEdgeCategory + // summary: + // An edge-to-edge layout list. + + return declare("dojox.mobile.EdgeToEdgeList", RoundRectList, { + // summary: + // An edge-to-edge layout list. + // description: + // EdgeToEdgeList is an edge-to-edge layout list, which displays + // all items in equally sized rows. Each item must be + // dojox.mobile.ListItem. + + buildRendering: function(){ + this.inherited(arguments); + this.domNode.className = "mblEdgeToEdgeList"; + } + }); +}); diff --git a/js/dojo/dojox/mobile/ExpandingTextArea.js b/js/dojo/dojox/mobile/ExpandingTextArea.js new file mode 100644 index 0000000..3c39d90 --- /dev/null +++ b/js/dojo/dojox/mobile/ExpandingTextArea.js @@ -0,0 +1,28 @@ +//>>built +define("dojox/mobile/ExpandingTextArea", [ + "dojo/_base/declare", + "dijit/form/_ExpandingTextAreaMixin", + "./TextArea" +], function(declare, ExpandingTextAreaMixin, TextArea){ + + /*===== + TextArea = dojox.mobile.TextArea; + ExpandingTextAreaMixin = dijit.form._ExpandingTextAreaMixin; + =====*/ + return declare("dojox.mobile.ExpandingTextArea", [TextArea, ExpandingTextAreaMixin], { + // summary: + // Non-templated TEXTAREA widget with the capability to adjust it's height according to the amount of data. + // + // description: + // A textarea that dynamically expands/contracts (changing it's height) as + // the user types, to display all the text without requiring a vertical scroll bar. + // + // Takes all the parameters (name, value, etc.) that a vanilla textarea takes. + // Rows is not supported since this widget adjusts the height. + // + // example: + // | <textarea dojoType="dojox.mobile.ExpandingTextArea">...</textarea> + + baseClass: "mblTextArea mblExpandingTextArea" + }); +}); diff --git a/js/dojo/dojox/mobile/FixedSplitter.js b/js/dojo/dojox/mobile/FixedSplitter.js new file mode 100644 index 0000000..e97b2f0 --- /dev/null +++ b/js/dojo/dojox/mobile/FixedSplitter.js @@ -0,0 +1,116 @@ +//>>built +define("dojox/mobile/FixedSplitter", [ + "dojo/_base/array", + "dojo/_base/declare", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-geometry", + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase", + "./FixedSplitterPane" +], function(array, declare, win, domClass, domGeometry, Contained, Container, WidgetBase, FixedSplitterPane){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/FixedSplitter + // summary: + // A layout container that splits the window horizontally or vertically. + + return declare("dojox.mobile.FixedSplitter", [WidgetBase, Container, Contained], { + // summary: + // A layout container that splits the window horizontally or + // vertically. + // description: + // FixedSplitter is a very simple container widget that layouts its + // child dom nodes side by side either horizontally or + // vertically. An example usage of this widget would be to realize + // the split view on iPad. There is no visual splitter between the + // children, and there is no function to resize the child panes + // with drag-and-drop. If you need a visual splitter, you can + // specify a border of a child dom node with CSS. + // A child of the widget should be FixedSplitterPane. + // + // example: + // | <div dojoType="dojox.mobile.FixedSplitter" orientation="H"> + // | <div dojoType="dojox.mobile.FixedSplitterPane" + // | style="width:200px;border-right:1px solid black;"> + // | pane #1 (width=200px) + // | </div> + // | <div dojoType="dojox.mobile.FixedSplitterPane"> + // | pane #2 + // | </div> + // | </div> + + // orientation: String + // The direction of split. If "H" is specified, panes are split + // horizontally. If "V" is specified, panes are split vertically. + orientation: "H", + + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef ? this.srcNodeRef : win.doc.createElement("DIV"); + domClass.add(this.domNode, "mblFixedSpliter"); + }, + + startup: function(){ + if(this._started){ return; } + var children = array.filter(this.domNode.childNodes, function(node){ return node.nodeType == 1; }); + array.forEach(children, function(node){ + domClass.add(node, "mblFixedSplitterPane"+this.orientation); + }, this); + this.inherited(arguments); + + var _this = this; + setTimeout(function(){ + var parent = _this.getParent && _this.getParent(); + if(!parent || !parent.resize){ // top level widget + _this.resize(); + } + }, 0); + }, + + resize: function(){ + this.layout(); + }, + + layout: function(){ + var sz = this.orientation == "H" ? "w" : "h"; + var children = array.filter(this.domNode.childNodes, function(node){ return node.nodeType == 1; }); + var offset = 0; + for(var i = 0; i < children.length; i++){ + domGeometry.setMarginBox(children[i], this.orientation == "H" ? {l:offset} : {t:offset}); + if(i < children.length - 1){ + offset += domGeometry.getMarginBox(children[i])[sz]; + } + } + + var h; + if(this.orientation == "V"){ + if(this.domNode.parentNode.tagName == "BODY"){ + if(array.filter(win.body().childNodes, function(node){ return node.nodeType == 1; }).length == 1){ + h = (win.global.innerHeight||win.doc.documentElement.clientHeight); + } + } + } + var l = (h || domGeometry.getMarginBox(this.domNode)[sz]) - offset; + var props = {}; + props[sz] = l; + domGeometry.setMarginBox(children[children.length - 1], props); + + array.forEach(this.getChildren(), function(child){ + if(child.resize){ child.resize(); } + }); + }, + + addChild: function(widget, /*Number?*/insertIndex){ + domClass.add(widget.domNode, "mblFixedSplitterPane"+this.orientation); + this.inherited(arguments); + } + }); +}); diff --git a/js/dojo/dojox/mobile/FixedSplitterPane.js b/js/dojo/dojox/mobile/FixedSplitterPane.js new file mode 100644 index 0000000..0599782 --- /dev/null +++ b/js/dojo/dojox/mobile/FixedSplitterPane.js @@ -0,0 +1,41 @@ +//>>built +define("dojox/mobile/FixedSplitterPane", [ + "dojo/_base/array", + "dojo/_base/declare", + "dojo/dom-class", + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase" +], function(array, declare, domClass, Contained, Container, WidgetBase){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/FixedSplitterPane + // summary: + // A pane widget that is used in a dojox.mobile.FixedSplitter. + + return declare("dojox.mobile.FixedSplitterPane",[WidgetBase, Container, Contained],{ + // summary: + // A pane widget that is used in a dojox.mobile.FixedSplitter. + // description: + // FixedSplitterPane is a pane widget that is used in a + // dojox.mobile.FixedSplitter. It is a widget, but can be regarded + // as a simple <div> element. + + buildRendering: function(){ + this.inherited(arguments); + domClass.add(this.domNode, "mblFixedSplitterPane"); + }, + + resize: function(){ + array.forEach(this.getChildren(), function(child){ + if(child.resize){ child.resize(); } + }); + } + }); +}); diff --git a/js/dojo/dojox/mobile/FlippableView.js b/js/dojo/dojox/mobile/FlippableView.js new file mode 100644 index 0000000..d5d9512 --- /dev/null +++ b/js/dojo/dojox/mobile/FlippableView.js @@ -0,0 +1,9 @@ +//>>built +define("dojox/mobile/FlippableView", [ + "dojo/_base/kernel", + "dojox/mobile/SwapView" +], function(kernel, SwapView){ + kernel.deprecated("dojox.mobile.FlippableView is deprecated", "dojox.mobile.FlippableView moved to dojox.mobile.SwapView", 1.7); + dojox.mobile.FlippableView = SwapView; + return SwapView; +}); diff --git a/js/dojo/dojox/mobile/Heading.js b/js/dojo/dojox/mobile/Heading.js new file mode 100644 index 0000000..63f7bf2 --- /dev/null +++ b/js/dojo/dojox/mobile/Heading.js @@ -0,0 +1,267 @@ +//>>built +define("dojox/mobile/Heading", [ + "dojo/_base/array", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-style", + "dijit/registry", // registry.byId + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase", + "./View" +], function(array, connect, declare, lang, win, domClass, domConstruct, domStyle, registry, Contained, Container, WidgetBase, View){ + + var dm = lang.getObject("dojox.mobile", true); + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/Heading + // summary: + // A widget that represents a navigation bar. + + return declare("dojox.mobile.Heading", [WidgetBase, Container, Contained],{ + // summary: + // A widget that represents a navigation bar. + // description: + // Heading is a widget that represents a navigation bar, which + // usually appears at the top of an application. It usually + // displays the title of the current view and can contain a + // navigational control. If you use it with + // dojox.mobile.ScrollableView, it can also be used as a fixed + // header bar or a fixed footer bar. In such cases, specify the + // fixed="top" attribute to be a fixed header bar or the + // fixed="bottom" attribute to be a fixed footer bar. Heading can + // have one or more ToolBarButton widgets as its children. + + // back: String + // A label for the navigational control to return to the previous + // View. + back: "", + + // href: String + // A URL to open when the navigational control is pressed. + href: "", + + // moveTo: String + // The id of the transition destination view which resides in the + // current page. + // + // If the value has a hash sign ('#') before the id (e.g. #view1) + // and the dojo.hash module is loaded by the user application, the + // view transition updates the hash in the browser URL so that the + // user can bookmark the destination view. In this case, the user + // can also use the browser's back/forward button to navigate + // through the views in the browser history. + // + // If null, transitions to a blank view. + // If '#', returns immediately without transition. + moveTo: "", + + // transition: String + // A type of animated transition effect. You can choose from the + // standard transition types, "slide", "fade", "flip", or from the + // extended transition types, "cover", "coverv", "dissolve", + // "reveal", "revealv", "scaleIn", "scaleOut", "slidev", + // "swirl", "zoomIn", "zoomOut". If "none" is specified, transition + // occurs immediately without animation. + transition: "slide", + + // label: String + // A title text of the heading. If the label is not specified, the + // innerHTML of the node is used as a label. + label: "", + + // iconBase: String + // The default icon path for child items. + iconBase: "", + + // backProp: Object + // Properties for the back button. + backProp: {className: "mblArrowButton"}, + + // tag: String + // A name of html tag to create as domNode. + tag: "H1", + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement(this.tag); + this.domNode.className = "mblHeading"; + if(!this.label){ + array.forEach(this.domNode.childNodes, function(n){ + if(n.nodeType == 3){ + var v = lang.trim(n.nodeValue); + if(v){ + this.label = v; + this.labelNode = domConstruct.create("SPAN", {innerHTML:v}, n, "replace"); + } + } + }, this); + } + if(!this.labelNode){ + this.labelNode = domConstruct.create("SPAN", null, this.domNode); + } + this.labelNode.className = "mblHeadingSpanTitle"; + this.labelDivNode = domConstruct.create("DIV", { + className: "mblHeadingDivTitle", + innerHTML: this.labelNode.innerHTML + }, this.domNode); + }, + + startup: function(){ + if(this._started){ return; } + var parent = this.getParent && this.getParent(); + if(!parent || !parent.resize){ // top level widget + var _this = this; + setTimeout(function(){ // necessary to render correctly + _this.resize(); + }, 0); + } + this.inherited(arguments); + }, + + resize: function(){ + if(this._btn){ + this._btn.style.width = this._body.offsetWidth + this._head.offsetWidth + "px"; + } + if(this.labelNode){ + // find the rightmost left button (B), and leftmost right button (C) + // +-----------------------------+ + // | |A| |B| |C| |D| | + // +-----------------------------+ + var leftBtn, rightBtn; + var children = this.containerNode.childNodes; + for(var i = children.length - 1; i >= 0; i--){ + var c = children[i]; + if(c.nodeType === 1){ + if(!rightBtn && domClass.contains(c, "mblToolBarButton") && domStyle.get(c, "float") === "right"){ + rightBtn = c; + } + if(!leftBtn && (domClass.contains(c, "mblToolBarButton") && domStyle.get(c, "float") === "left" || c === this._btn)){ + leftBtn = c; + } + } + } + + if(!this.labelNodeLen && this.label){ + this.labelNode.style.display = "inline"; + this.labelNodeLen = this.labelNode.offsetWidth; + this.labelNode.style.display = ""; + } + + var bw = this.domNode.offsetWidth; // bar width + var rw = rightBtn ? bw - rightBtn.offsetLeft + 5 : 0; // rightBtn width + var lw = leftBtn ? leftBtn.offsetLeft + leftBtn.offsetWidth + 5 : 0; // leftBtn width + var tw = this.labelNodeLen || 0; // title width + domClass[bw - Math.max(rw,lw)*2 > tw ? "add" : "remove"](this.domNode, "mblHeadingCenterTitle"); + } + array.forEach(this.getChildren(), function(child){ + if(child.resize){ child.resize(); } + }); + }, + + _setBackAttr: function(/*String*/back){ + if (!back){ + domConstruct.destroy(this._btn); + this._btn = null; + this.back = ""; + }else{ + if(!this._btn){ + var btn = domConstruct.create("DIV", this.backProp, this.domNode, "first"); + var head = domConstruct.create("DIV", {className:"mblArrowButtonHead"}, btn); + var body = domConstruct.create("DIV", {className:"mblArrowButtonBody mblArrowButtonText"}, btn); + + this._body = body; + this._head = head; + this._btn = btn; + this.backBtnNode = btn; + this.connect(body, "onclick", "onClick"); + } + this.back = back; + this._body.innerHTML = this._cv ? this._cv(this.back) : this.back; + } + this.resize(); + }, + + _setLabelAttr: function(/*String*/label){ + this.label = label; + this.labelNode.innerHTML = this.labelDivNode.innerHTML = this._cv ? this._cv(label) : label; + }, + + findCurrentView: function(){ + // summary: + // Search for the view widget that contains this widget. + var w = this; + while(true){ + w = w.getParent(); + if(!w){ return null; } + if(w instanceof View){ break; } + } + return w; + }, + + onClick: function(e){ + var h1 = this.domNode; + domClass.add(h1, "mblArrowButtonSelected"); + setTimeout(function(){ + domClass.remove(h1, "mblArrowButtonSelected"); + }, 1000); + + if(this.back && !this.moveTo && !this.href && history){ + history.back(); + return; + } + + // keep the clicked position for transition animations + var view = this.findCurrentView(); + if(view){ + view.clickedPosX = e.clientX; + view.clickedPosY = e.clientY; + } + this.goTo(this.moveTo, this.href); + }, + + goTo: function(moveTo, href){ + // summary: + // Given the destination, makes a view transition. + var view = this.findCurrentView(); + if(!view){ return; } + if(href){ + view.performTransition(null, -1, this.transition, this, function(){location.href = href;}); + }else{ + if(dm.app && dm.app.STAGE_CONTROLLER_ACTIVE){ + // If in a full mobile app, then use its mechanisms to move back a scene + connect.publish("/dojox/mobile/app/goback"); + }else{ + // Basically transition should be performed between two + // siblings that share the same parent. + // However, when views are nested and transition occurs from + // an inner view, search for an ancestor view that is a sibling + // of the target view, and use it as a source view. + var node = registry.byId(view.convertToId(moveTo)); + if(node){ + var parent = node.getParent(); + while(view){ + var myParent = view.getParent(); + if(parent === myParent){ + break; + } + view = myParent; + } + } + if(view){ + view.performTransition(moveTo, -1, this.transition); + } + } + } + } + }); +}); diff --git a/js/dojo/dojox/mobile/IconContainer.js b/js/dojo/dojox/mobile/IconContainer.js new file mode 100644 index 0000000..0bd667d --- /dev/null +++ b/js/dojo/dojox/mobile/IconContainer.js @@ -0,0 +1,185 @@ +//>>built +define("dojox/mobile/IconContainer", [ + "dojo/_base/array", + "dojo/_base/declare", + "dojo/_base/window", + "dojo/dom-construct", + "dojo/dom-style", + "dijit/registry", // registry.byNode + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase", + "./IconItem", + "./Heading", + "./View" +], function(array, declare, win, domConstruct, domStyle, registry, Contained, Container, WidgetBase, IconItem, Heading, View){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/IconContainer + // summary: + // A container widget that holds multiple icons. + + return declare("dojox.mobile.IconContainer", [WidgetBase, Container, Contained],{ + // summary: + // A container widget that holds multiple icons. + // description: + // IconContainer is a container widget that holds multiple icons + // each of which represents application component. + + // defaultIcon: String + // The default fall-back icon, which is displayed only when the + // specified icon has failed to load. + defaultIcon: "", + + // transition: String + // A type of animated transition effect. You can choose from the + // standard transition types, "slide", "fade", "flip", or from the + // extended transition types, "cover", "coverv", "dissolve", + // "reveal", "revealv", "scaleIn", "scaleOut", "slidev", + // "swirl", "zoomIn", "zoomOut". If "none" is specified, transition + // occurs immediately without animation. If "below" is specified, + // the application contents are displayed below the icons. + transition: "below", + + // pressedIconOpacity: Number + // The opacity of the pressed icon image. + pressedIconOpacity: 0.4, + + // iconBase: String + // The default icon path for child items. + iconBase: "", + + // iconPos: String + // The default icon position for child items. + iconPos: "", + + // back: String + // A label for the navigational control. + back: "Home", + + // label: String + // A title text of the heading. + label: "My Application", + + // single: Boolean + // If true, only one icon content can be opened at a time. + single: false, + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement("UL"); + this.domNode.className = "mblIconContainer"; + var t = this._terminator = domConstruct.create("LI"); + t.className = "mblIconItemTerminator"; + t.innerHTML = " "; + this.domNode.appendChild(t); + }, + + _setupSubNodes: function(ul){ + array.forEach(this.getChildren(), function(w){ + ul.appendChild(w.subNode); + }); + }, + + startup: function(){ + if(this._started){ return; } + if(this.transition === "below"){ + this._setupSubNodes(this.domNode); + }else{ + var view = this.appView = new View({id:this.id+"_mblApplView"}); + var _this = this; + view.onAfterTransitionIn = function(moveTo, dir, transition, context, method){ + _this._opening._open_1(); + }; + view.domNode.style.visibility = "hidden"; + var heading = view._heading + = new Heading({back: this._cv ? this._cv(this.back) : this.back, + label: this._cv ? this._cv(this.label) : this.label, + moveTo: this.domNode.parentNode.id, + transition: this.transition}); + view.addChild(heading); + var ul = view._ul = win.doc.createElement("UL"); + ul.className = "mblIconContainer"; + ul.style.marginTop = "0px"; + this._setupSubNodes(ul); + view.domNode.appendChild(ul); + + var target; + for(var w = this.getParent(); w; w = w.getParent()){ + if(w instanceof View){ + target = w.domNode.parentNode; + break; + } + } + if(!target){ target = win.body(); } + target.appendChild(view.domNode); + + view.startup(); + } + this.inherited(arguments); + }, + + closeAll: function(){ + // summary: + // Closes all the icon items. + var len = this.domNode.childNodes.length, child, w; + for(var i = 0; i < len; i++){ + var child = this.domNode.childNodes[i]; + if(child.nodeType !== 1){ continue; } + if(child === this._terminator){ break; } + var w = registry.byNode(child); + w.containerNode.parentNode.style.display = "none"; + domStyle.set(w.iconNode, "opacity", 1); + } + }, + + addChild: function(widget, /*Number?*/insertIndex){ + var children = this.getChildren(); + if(typeof insertIndex !== "number" || insertIndex > children.length){ + insertIndex = children.length; + } + var idx = insertIndex; + var refNode = this.containerNode; + if(idx > 0){ + refNode = children[idx - 1].domNode; + idx = "after"; + } + domConstruct.place(widget.domNode, refNode, idx); + + widget.transition = this.transition; + if(this.transition === "below"){ + for(var i = 0, refNode = this._terminator; i < insertIndex; i++){ + refNode = refNode.nextSibling; + } + domConstruct.place(widget.subNode, refNode, "after"); + }else{ + domConstruct.place(widget.subNode, this.appView._ul, insertIndex); + } + widget.inheritParams(); + widget._setIconAttr(widget.icon); + + if(this._started && !widget._started){ + widget.startup(); + } + }, + + removeChild: function(/*Widget|Number*/widget){ + if(typeof widget === "number"){ + widget = this.getChildren()[widget]; + } + if(widget){ + this.inherited(arguments); + if(this.transition === "below"){ + this.containerNode.removeChild(widget.subNode); + }else{ + this.appView._ul.removeChild(widget.subNode); + } + } + } + }); +}); diff --git a/js/dojo/dojox/mobile/IconItem.js b/js/dojo/dojox/mobile/IconItem.js new file mode 100644 index 0000000..a62bb37 --- /dev/null +++ b/js/dojo/dojox/mobile/IconItem.js @@ -0,0 +1,332 @@ +//>>built +define("dojox/mobile/IconItem", [ + "dojo/_base/kernel", + "dojo/_base/array", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/sniff", + "dojo/_base/window", + "dojo/dom-attr", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-style", + "dijit/registry", // registry.byId + "./common", + "./_ItemBase", + "./TransitionEvent" +], function(dojo, array, declare, lang, has, win, domAttr, domClass, domConstruct, domStyle, registry, common, ItemBase, TransitionEvent){ + +/*===== + var ItemBase = dojox.mobile._ItemBase; +=====*/ + + // module: + // dojox/mobile/IconItem + // summary: + // An icon item widget. + + return declare("dojox.mobile.IconItem", ItemBase, { + // summary: + // An icon item widget. + // description: + // IconItem represents an item that has an application component + // and its icon image. You can tap the icon to open the + // corresponding application component. You can also use the icon + // to move to a different view by specifying either of the moveTo, + // href or url parameters. + + // lazy: String + // If true, the content of the item, which includes dojo markup, is + // instantiated lazily. That is, only when the icon is opened by + // the user, the required modules are loaded and dojo widgets are + // instantiated. + lazy: false, + + // requires: String + // Comma-separated required module names to be loaded. All the + // modules specified with dojoType and their depending modules are + // automatically loaded by the IconItem. If you need other extra + // modules to be loaded, use this parameter. If lazy is true, the + // specified required modules are loaded when the user opens the + // icon for the first time. + requires: "", + + // timeout: String + // Duration of highlight in seconds. + timeout: 10, + + // closeBtnClass: String + // A class name of a DOM button to be used as a close button. + closeBtnClass: "mblDomButtonBlueMinus", + + // closeBtnProp: String + // Properties for the close button. + closeBtnProp: null, + + + templateString: '<div class="mblIconArea" dojoAttachPoint="iconDivNode">'+ + '<div><img src="${icon}" dojoAttachPoint="iconNode"></div><span dojoAttachPoint="labelNode1"></span>'+ + '</div>', + templateStringSub: '<li class="mblIconItemSub" lazy="${lazy}" style="display:none;" dojoAttachPoint="contentNode">'+ + '<h2 class="mblIconContentHeading" dojoAttachPoint="closeNode">'+ + '<div class="${closeBtnClass}" style="position:absolute;left:4px;top:2px;" dojoAttachPoint="closeIconNode"></div><span dojoAttachPoint="labelNode2"></span>'+ + '</h2>'+ + '<div class="mblContent" dojoAttachPoint="containerNode"></div>'+ + '</li>', + + createTemplate: function(s){ + array.forEach(["lazy","icon","closeBtnClass"], function(v){ + while(s.indexOf("${"+v+"}") != -1){ + s = s.replace("${"+v+"}", this[v]); + } + }, this); + var div = win.doc.createElement("DIV"); + div.innerHTML = s; + + /* + array.forEach(query("[dojoAttachPoint]", domNode), function(node){ + this[node.getAttribute("dojoAttachPoint")] = node; + }, this); + */ + + var nodes = div.getElementsByTagName("*"); + var i, len, s1; + len = nodes.length; + for(i = 0; i < len; i++){ + s1 = nodes[i].getAttribute("dojoAttachPoint"); + if(s1){ + this[s1] = nodes[i]; + } + } + if(this.closeIconNode && this.closeBtnProp){ + domAttr.set(this.closeIconNode, this.closeBtnProp); + } + var domNode = div.removeChild(div.firstChild); + div = null; + return domNode; + }, + + buildRendering: function(){ + this.inheritParams(); + var node = this.createTemplate(this.templateString); + this.subNode = this.createTemplate(this.templateStringSub); + this.subNode._parentNode = this.domNode; // [custom property] + + this.domNode = this.srcNodeRef || domConstruct.create("LI"); + domClass.add(this.domNode, "mblIconItem"); + if(this.srcNodeRef){ + // reparent + for(var i = 0, len = this.srcNodeRef.childNodes.length; i < len; i++){ + this.containerNode.appendChild(this.srcNodeRef.firstChild); + } + } + this.domNode.appendChild(node); + }, + + postCreate: function(){ + common.createDomButton(this.closeIconNode, { + top: "-2px", + left: "1px" + }); + this.connect(this.iconNode, "onmousedown", "onMouseDownIcon"); + this.connect(this.iconNode, "onclick", "iconClicked"); + this.connect(this.closeIconNode, "onclick", "closeIconClicked"); + this.connect(this.iconNode, "onerror", "onError"); + }, + + highlight: function(){ + // summary: + // Shakes the icon 10 seconds. + domClass.add(this.iconDivNode, "mblVibrate"); + if(this.timeout > 0){ + var _this = this; + setTimeout(function(){ + _this.unhighlight(); + }, this.timeout*1000); + } + }, + + unhighlight: function(){ + // summary: + // Stops shaking the icon. + domClass.remove(this.iconDivNode, "mblVibrate"); + }, + + instantiateWidget: function(e){ + // summary: + // Instantiates the icon content. + + // avoid use of query + /* + var list = query('[dojoType]', this.containerNode); + for(var i = 0, len = list.length; i < len; i++){ + dojo["require"](list[i].getAttribute("dojoType")); + } + */ + + var nodes = this.containerNode.getElementsByTagName("*"); + var len = nodes.length; + var s; + for(var i = 0; i < len; i++){ + s = nodes[i].getAttribute("dojoType"); + if(s){ + dojo["require"](s); + } + } + + if(len > 0){ + dojo.parser.parse(this.containerNode); + } + this.lazy = false; + }, + + isOpen: function(e){ + // summary: + // Returns true if the icon is open. + return this.containerNode.style.display != "none"; + }, + + onMouseDownIcon: function (e){ + domStyle.set(this.iconNode, "opacity", this.getParent().pressedIconOpacity); + }, + + iconClicked: function(e){ + if(e){ + this.setTransitionPos(e); + setTimeout(lang.hitch(this, function(d){ this.iconClicked(); }), 0); + return; + } + + if (this.href && this.hrefTarget) { + common.openWindow(this.href, this.hrefTarget); + dojo.style(this.iconNode, "opacity", 1); + return; + } + + var transOpts; + if(this.moveTo || this.href || this.url || this.scene){ + transOpts = {moveTo: this.moveTo, href: this.href, url: this.url, scene: this.scene, transitionDir: this.transitionDir, transition: this.transition}; + }else if(this.transitionOptions){ + transOpts = this.transitionOptions; + } + if(transOpts){ + setTimeout(lang.hitch(this, function(d){ + domStyle.set(this.iconNode, "opacity", 1); + }), 1500); + }else{ + return this.open(e); + } + + if(transOpts){ + return new TransitionEvent(this.domNode,transOpts,e).dispatch(); + } + }, + + closeIconClicked: function(e){ + if(e){ + setTimeout(lang.hitch(this, function(d){ this.closeIconClicked(); }), 0); + return; + } + this.close(); + }, + + open: function(e){ + // summary: + // Opens the icon content, or makes a transition. + var parent = this.getParent(); // IconContainer + if(this.transition == "below"){ + if(parent.single){ + parent.closeAll(); + domStyle.set(this.iconNode, "opacity", this.getParent().pressedIconOpacity); + } + this._open_1(); + }else{ + parent._opening = this; + if(parent.single){ + this.closeNode.style.display = "none"; + parent.closeAll(); + var view = registry.byId(parent.id+"_mblApplView"); + view._heading._setLabelAttr(this.label); + } + var transOpts = this.transitionOptions || {transition: this.transition, transitionDir: this.transitionDir, moveTo: parent.id + "_mblApplView"}; + new TransitionEvent(this.domNode, transOpts, e).dispatch(); + } + }, + + _open_1: function(){ + this.contentNode.style.display = ""; + this.unhighlight(); + if(this.lazy){ + if(this.requires){ + array.forEach(this.requires.split(/,/), function(c){ + dojo["require"](c); + }); + } + this.instantiateWidget(); + } + this.contentNode.scrollIntoView(); + this.onOpen(); + }, + + close: function(){ + // summary: + // Closes the icon content. + if(has("webkit")){ + var t = this.domNode.parentNode.offsetWidth/8; + var y = this.iconNode.offsetLeft; + var pos = 0; + for(var i = 1; i <= 3; i++){ + if(t*(2*i-1) < y && y <= t*(2*(i+1)-1)){ + pos = i; + break; + } + } + domClass.add(this.containerNode.parentNode, "mblCloseContent mblShrink"+pos); + }else{ + this.containerNode.parentNode.style.display = "none"; + } + domStyle.set(this.iconNode, "opacity", 1); + this.onClose(); + }, + + onOpen: function(){ + // summary: + // Stub method to allow the application to connect to. + }, + + onClose: function(){ + // summary: + // Stub method to allow the application to connect to. + }, + + onError: function(){ + var icon = this.getParent().defaultIcon; + if(icon){ + this.iconNode.src = icon; + } + }, + + _setIconAttr: function(icon){ + if(!this.getParent()){ return; } // icon may be invalid because inheritParams is not called yet + this.icon = icon; + common.createIcon(icon, this.iconPos, this.iconNode, this.alt); + if(this.iconPos){ + domClass.add(this.iconNode, "mblIconItemSpriteIcon"); + var arr = this.iconPos.split(/[ ,]/); + var p = this.iconNode.parentNode; + domStyle.set(p, { + width: arr[2] + "px", + top: Math.round((p.offsetHeight - arr[3]) / 2) + 1 + "px", + margin: "auto" + }); + } + }, + + _setLabelAttr: function(/*String*/text){ + this.label = text; + var s = this._cv ? this._cv(text) : text; + this.labelNode1.innerHTML = s; + this.labelNode2.innerHTML = s; + } + }); +}); diff --git a/js/dojo/dojox/mobile/ListItem.js b/js/dojo/dojox/mobile/ListItem.js new file mode 100644 index 0000000..f7244b1 --- /dev/null +++ b/js/dojo/dojox/mobile/ListItem.js @@ -0,0 +1,376 @@ +//>>built +define("dojox/mobile/ListItem", [ + "dojo/_base/array", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/has", + "./common", + "./_ItemBase", + "./TransitionEvent" +], function(array, connect, declare, lang, domClass, domConstruct, has, common, ItemBase, TransitionEvent){ + +/*===== + var ItemBase = dojox.mobile._ItemBase; +=====*/ + + // module: + // dojox/mobile/ListItem + // summary: + // An item of either RoundRectList or EdgeToEdgeList. + + return declare("dojox.mobile.ListItem", ItemBase, { + // summary: + // An item of either RoundRectList or EdgeToEdgeList. + // description: + // ListItem represents an item of either RoundRectList or + // EdgeToEdgeList. There are three ways to move to a different + // view, moveTo, href, and url. You can choose only one of them. + + // rightText: String + // A right-aligned text to display on the item. + rightText: "", + + // rightIcon: String + // An icon to display at the right hand side of the item. The value + // can be either a path for an image file or a class name of a DOM + // button. + rightIcon: "", + + // rightIcon2: String + // An icon to display at the left of the rightIcon. The value can + // be either a path for an image file or a class name of a DOM + // button. + rightIcon2: "", + + + // anchorLabel: Boolean + // If true, the label text becomes a clickable anchor text. When + // the user clicks on the text, the onAnchorLabelClicked handler is + // called. You can override or connect to the handler and implement + // any action. The handler has no default action. + anchorLabel: false, + + // noArrow: Boolean + // If true, the right hand side arrow is not displayed. + noArrow: false, + + // selected: Boolean + // If true, the item is highlighted to indicate it is selected. + selected: false, + + // checked: Boolean + // If true, a check mark is displayed at the right of the item. + checked: false, + + // arrowClass: String + // An icon to display as an arrow. The value can be either a path + // for an image file or a class name of a DOM button. + arrowClass: "mblDomButtonArrow", + + // checkClass: String + // An icon to display as a check mark. The value can be either a + // path for an image file or a class name of a DOM button. + checkClass: "mblDomButtonCheck", + + // variableHeight: Boolean + // If true, the height of the item varies according to its + // content. In dojo 1.6 or older, the "mblVariableHeight" class was + // used for this purpose. In dojo 1.7, adding the mblVariableHeight + // class still works for backward compatibility. + variableHeight: false, + + + // rightIconTitle: String + // An alt text for the right icon. + rightIconTitle: "", + + // rightIcon2Title: String + // An alt text for the right icon2. + rightIcon2Title: "", + + + // btnClass: String + // Deprecated. For backward compatibility. + btnClass: "", + + // btnClass2: String + // Deprecated. For backward compatibility. + btnClass2: "", + + // tag: String + // A name of html tag to create as domNode. + tag: "li", + + postMixInProperties: function(){ + // for backward compatibility + if(this.btnClass){ + this.rightIcon = this.btnClass; + } + this._setBtnClassAttr = this._setRightIconAttr; + this._setBtnClass2Attr = this._setRightIcon2Attr; + }, + + buildRendering: function(){ + this.domNode = this.srcNodeRef || domConstruct.create(this.tag); + this.inherited(arguments); + this.domNode.className = "mblListItem" + (this.selected ? " mblItemSelected" : ""); + + // label + var box = this.box = domConstruct.create("DIV"); + box.className = "mblListItemTextBox"; + if(this.anchorLabel){ + box.style.cursor = "pointer"; + } + var r = this.srcNodeRef; + if(r && !this.label){ + this.label = ""; + for(var i = 0, len = r.childNodes.length; i < len; i++){ + var n = r.firstChild; + if(n.nodeType === 3 && lang.trim(n.nodeValue) !== ""){ + n.nodeValue = this._cv ? this._cv(n.nodeValue) : n.nodeValue; + this.labelNode = domConstruct.create("SPAN", {className:"mblListItemLabel"}); + this.labelNode.appendChild(n); + n = this.labelNode; + } + box.appendChild(n); + } + } + if(!this.labelNode){ + this.labelNode = domConstruct.create("SPAN", {className:"mblListItemLabel"}, box); + } + if(this.anchorLabel){ + box.style.display = "inline"; // to narrow the text region + } + + var a = this.anchorNode = domConstruct.create("A"); + a.className = "mblListItemAnchor"; + this.domNode.appendChild(a); + a.appendChild(box); + }, + + startup: function(){ + if(this._started){ return; } + this.inheritParams(); + var parent = this.getParent(); + if(this.moveTo || this.href || this.url || this.clickable || (parent && parent.select)){ + this._onClickHandle = this.connect(this.anchorNode, "onclick", "onClick"); + } + this.setArrow(); + + if(domClass.contains(this.domNode, "mblVariableHeight")){ + this.variableHeight = true; + } + if(this.variableHeight){ + domClass.add(this.domNode, "mblVariableHeight"); + setTimeout(lang.hitch(this, "layoutVariableHeight")); + } + + this.set("icon", this.icon); // _setIconAttr may be called twice but this is necessary for offline instantiation + if(!this.checked && this.checkClass.indexOf(',') !== -1){ + this.set("checked", this.checked); + } + this.inherited(arguments); + }, + + resize: function(){ + if(this.variableHeight){ + this.layoutVariableHeight(); + } + }, + + onClick: function(e){ + var a = e.currentTarget; + var li = a.parentNode; + if(domClass.contains(li, "mblItemSelected")){ return; } // already selected + if(this.anchorLabel){ + for(var p = e.target; p.tagName !== this.tag.toUpperCase(); p = p.parentNode){ + if(p.className == "mblListItemTextBox"){ + domClass.add(p, "mblListItemTextBoxSelected"); + setTimeout(function(){ + domClass.remove(p, "mblListItemTextBoxSelected"); + }, has("android") ? 300 : 1000); + this.onAnchorLabelClicked(e); + return; + } + } + } + var parent = this.getParent(); + if(parent.select){ + if(parent.select === "single"){ + if(!this.checked){ + this.set("checked", true); + } + }else if(parent.select === "multiple"){ + this.set("checked", !this.checked); + } + } + this.select(); + + if (this.href && this.hrefTarget) { + common.openWindow(this.href, this.hrefTarget); + return; + } + var transOpts; + if(this.moveTo || this.href || this.url || this.scene){ + transOpts = {moveTo: this.moveTo, href: this.href, url: this.url, scene: this.scene, transition: this.transition, transitionDir: this.transitionDir}; + }else if(this.transitionOptions){ + transOpts = this.transitionOptions; + } + + if(transOpts){ + this.setTransitionPos(e); + return new TransitionEvent(this.domNode,transOpts,e).dispatch(); + } + }, + + select: function(){ + // summary: + // Makes this widget in the selected state. + var parent = this.getParent(); + if(parent.stateful){ + parent.deselectAll(); + }else{ + var _this = this; + setTimeout(function(){ + _this.deselect(); + }, has("android") ? 300 : 1000); + } + domClass.add(this.domNode, "mblItemSelected"); + }, + + deselect: function(){ + // summary: + // Makes this widget in the deselected state. + domClass.remove(this.domNode, "mblItemSelected"); + }, + + onAnchorLabelClicked: function(e){ + // summary: + // Stub function to connect to from your application. + }, + + layoutVariableHeight: function(){ + var h = this.anchorNode.offsetHeight; + if(h === this.anchorNodeHeight){ return; } + this.anchorNodeHeight = h; + array.forEach([ + this.rightTextNode, + this.rightIcon2Node, + this.rightIconNode, + this.iconNode + ], function(n){ + if(n){ + var t = Math.round((h - n.offsetHeight) / 2); + n.style.marginTop = t + "px"; + } + }); + }, + + setArrow: function(){ + // summary: + // Sets the arrow icon if necessary. + if(this.checked){ return; } + var c = ""; + var parent = this.getParent(); + if(this.moveTo || this.href || this.url || this.clickable){ + if(!this.noArrow && !(parent && parent.stateful)){ + c = this.arrowClass; + } + } + if(c){ + this._setRightIconAttr(c); + } + }, + + _setIconAttr: function(icon){ + if(!this.getParent()){ return; } // icon may be invalid because inheritParams is not called yet + this.icon = icon; + var a = this.anchorNode; + if(!this.iconNode){ + if(icon){ + var ref = this.rightIconNode || this.rightIcon2Node || this.rightTextNode || this.box; + this.iconNode = domConstruct.create("DIV", {className:"mblListItemIcon"}, ref, "before"); + } + }else{ + domConstruct.empty(this.iconNode); + } + if(icon && icon !== "none"){ + common.createIcon(icon, this.iconPos, null, this.alt, this.iconNode); + if(this.iconPos){ + domClass.add(this.iconNode.firstChild, "mblListItemSpriteIcon"); + } + domClass.remove(a, "mblListItemAnchorNoIcon"); + }else{ + domClass.add(a, "mblListItemAnchorNoIcon"); + } + }, + + _setCheckedAttr: function(/*Boolean*/checked){ + var parent = this.getParent(); + if(parent && parent.select === "single" && checked){ + array.forEach(parent.getChildren(), function(child){ + child.set("checked", false); + }); + } + this._setRightIconAttr(this.checkClass); + + var icons = this.rightIconNode.childNodes; + if(icons.length === 1){ + this.rightIconNode.style.display = checked ? "" : "none"; + }else{ + icons[0].style.display = checked ? "" : "none"; + icons[1].style.display = !checked ? "" : "none"; + } + + domClass.toggle(this.domNode, "mblListItemChecked", checked); + if(parent && this.checked !== checked){ + parent.onCheckStateChanged(this, checked); + } + this.checked = checked; + }, + + _setRightTextAttr: function(/*String*/text){ + if(!this.rightTextNode){ + this.rightTextNode = domConstruct.create("DIV", {className:"mblListItemRightText"}, this.box, "before"); + } + this.rightText = text; + this.rightTextNode.innerHTML = this._cv ? this._cv(text) : text; + }, + + _setRightIconAttr: function(/*String*/icon){ + if(!this.rightIconNode){ + var ref = this.rightIcon2Node || this.rightTextNode || this.box; + this.rightIconNode = domConstruct.create("DIV", {className:"mblListItemRightIcon"}, ref, "before"); + }else{ + domConstruct.empty(this.rightIconNode); + } + this.rightIcon = icon; + var arr = (icon || "").split(/,/); + if(arr.length === 1){ + common.createIcon(icon, null, null, this.rightIconTitle, this.rightIconNode); + }else{ + common.createIcon(arr[0], null, null, this.rightIconTitle, this.rightIconNode); + common.createIcon(arr[1], null, null, this.rightIconTitle, this.rightIconNode); + } + }, + + _setRightIcon2Attr: function(/*String*/icon){ + if(!this.rightIcon2Node){ + var ref = this.rightTextNode || this.box; + this.rightIcon2Node = domConstruct.create("DIV", {className:"mblListItemRightIcon2"}, ref, "before"); + }else{ + domConstruct.empty(this.rightIcon2Node); + } + this.rightIcon2 = icon; + common.createIcon(icon, null, null, this.rightIcon2Title, this.rightIcon2Node); + }, + + _setLabelAttr: function(/*String*/text){ + this.label = text; + this.labelNode.innerHTML = this._cv ? this._cv(text) : text; + } + }); +}); diff --git a/js/dojo/dojox/mobile/Opener.js b/js/dojo/dojox/mobile/Opener.js new file mode 100644 index 0000000..7c9c354 --- /dev/null +++ b/js/dojo/dojox/mobile/Opener.js @@ -0,0 +1,74 @@ +//>>built +define("dojox/mobile/Opener", [ + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-style", + "dojo/dom-geometry", + "./Tooltip", + "./Overlay" +], function(declare, lang, win, domClass, domConstruct, domStyle, domGeometry, Tooltip, Overlay){ + + /*===== + Tooltip = dojox.mobile.Tooltip; + Overlay = dojox.mobile.Overlay; + =====*/ + var isOverlay = domClass.contains(win.doc.documentElement, "dj_phone"); + var cls = declare("dojox.mobile.Opener", isOverlay ? Overlay : Tooltip, { + // summary: + // A non-templated popup widget that will use either Tooltip or Overlay depending on screen size + // + buildRendering: function(){ + this.inherited(arguments); + this.cover = domConstruct.create('div', { onclick: lang.hitch(this, '_onBlur'), 'class': 'mblOpenerUnderlay', style: { top:'0px', left:'0px', width:'0px', height:'0px', position: isOverlay ? 'absolute' : 'fixed', backgroundColor:'transparent', overflow:'hidden', zIndex:'-1' }}, this.domNode, 'first'); + this.connect(null, win.global.onorientationchange !== undefined ? "onorientationchange" : "onresize", lang.hitch(this, function(){ + if(domStyle.get(this.cover, "height") !== '0px'){ // resize cover when shown + this._resizeCover(); + } + })); + }, + + onShow: function(/*DomNode*/node){}, + onHide: function(/*DomNode*/node, /*Anything*/v){}, + + show: function(node, positions){ + this.node = node; + this.onShow(node); + this._resizeCover(); + return this.inherited(arguments); + }, + + hide: function(/*Anything*/ val){ + this.inherited(arguments); + domStyle.set(this.cover, { height:'0px' }); + this.onHide(this.node, val); + }, + + _resizeCover: function(){ + if(isOverlay){ + domStyle.set(this.cover, { height:'0px' }); // hide cover temporarily to calculate domNode size + setTimeout(lang.hitch(this, function(){ // show cover after positioning popup + var pos = domGeometry.position(this.domNode, false); + domStyle.set(this.cover, { top:-pos.y+'px', left:-pos.x+'px', width:(pos.w+pos.x)+'px', height:(pos.h+pos.y)+'px' }); + }), 0); + }else{ + domStyle.set(this.cover, { + width:Math.max(win.doc.documentElement.scrollWidth || win.body().scrollWidth || win.doc.documentElement.clientWidth)+'px', + height:Math.max(win.doc.documentElement.scrollHeight || win.body().scrollHeight || win.doc.documentElement.clientHeight)+'px' + }); + } + }, + + _onBlur: function(e){ + var ret = this.onBlur(e); + if(ret !== false){ // only exactly false prevents hide() + this.hide(e); + } + return ret; + } + }); + cls.prototype.baseClass += " mblOpener"; // add to either mblOverlay or mblTooltip + return cls; +}); diff --git a/js/dojo/dojox/mobile/Overlay.js b/js/dojo/dojox/mobile/Overlay.js new file mode 100644 index 0000000..625eb7b --- /dev/null +++ b/js/dojo/dojox/mobile/Overlay.js @@ -0,0 +1,96 @@ +//>>built +define("dojox/mobile/Overlay", [ + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/sniff", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-geometry", + "dojo/dom-style", + "dojo/window", + "dijit/_WidgetBase", + "dojo/_base/array", + "dijit/registry" +], function(declare, lang, has, win, domClass, domGeometry, domStyle, windowUtils, WidgetBase, array, registry){ + + /*===== + WidgetBase = dijit._WidgetBase; + =====*/ + return declare("dojox.mobile.Overlay", WidgetBase, { + // summary: + // A non-templated widget that animates up from the bottom, overlaying the current content + // + + baseClass: "mblOverlay mblOverlayHidden", + + show: function(/*DomNode?*/aroundNode){ + // summary: + // Scroll the overlay up into view + array.forEach(registry.findWidgets(this.domNode), function(w){ + if(w && w.height == "auto" && typeof w.resize == "function"){ + w.resize(); + } + }); + var vp, popupPos; + var reposition = lang.hitch(this, function(){ + domStyle.set(this.domNode, { position: "", top: "auto", bottom: "0px" }); + popupPos = domGeometry.position(this.domNode); + vp = windowUtils.getBox(); + if((popupPos.y+popupPos.h) != vp.h // TODO: should be a has() test for position:fixed not scrolling + || has("android") < 3){ // android 2.x supports position:fixed but child transforms don't persist + popupPos.y = vp.t + vp.h - popupPos.h; + domStyle.set(this.domNode, { position: "absolute", top: popupPos.y + "px", bottom: "auto" }); + } + }); + reposition(); + if(aroundNode){ + var aroundPos = domGeometry.position(aroundNode); + if(popupPos.y < aroundPos.y){ // if the aroundNode is under the popup, try to scroll it up + win.global.scrollBy(0, aroundPos.y + aroundPos.h - popupPos.y); + reposition(); + } + } + domClass.replace(this.domNode, ["mblCoverv", "mblIn"], ["mblOverlayHidden", "mblRevealv", "mblOut", "mblReverse"]); + var _domNode = this.domNode; + setTimeout(function(){ + domClass.add(_domNode, "mblTransition"); + }, 100); + var timeoutHandler = null; + this._moveHandle = this.connect(win.doc.documentElement, "ontouchmove", function(){ + if(timeoutHandler){ + clearTimeout(timeoutHandler); + } + timeoutHandler = setTimeout(function(){ + reposition(); + timeoutHandler = null; + }, 0); + }); + }, + + hide: function(){ + // summary: + // Scroll the overlay down and then make it invisible + if(this._moveHandle){ + this.disconnect(this._moveHandle); + this._moveHandle = null; + } + if(has("webkit")){ + var handler = this.connect(this.domNode, "webkitTransitionEnd", function(){ + this.disconnect(handler); + domClass.replace(this.domNode, ["mblOverlayHidden"], ["mblRevealv", "mblOut", "mblReverse", "mblTransition"]); + }); + domClass.replace(this.domNode, ["mblRevealv", "mblOut", "mblReverse"], ["mblCoverv", "mblIn", "mblTransition"]); + var _domNode = this.domNode; + setTimeout(function(){ + domClass.add(_domNode, "mblTransition"); + }, 100); + }else{ + domClass.replace(this.domNode, ["mblOverlayHidden"], ["mblCoverv", "mblIn", "mblRevealv", "mblOut", "mblReverse"]); + } + }, + + onBlur: function(/*Event*/e){ + return false; // touching outside the overlay area does not call hide() + } + }); +}); diff --git a/js/dojo/dojox/mobile/PageIndicator.js b/js/dojo/dojox/mobile/PageIndicator.js new file mode 100644 index 0000000..6d2f7ba --- /dev/null +++ b/js/dojo/dojox/mobile/PageIndicator.js @@ -0,0 +1,105 @@ +//>>built +define("dojox/mobile/PageIndicator", [ + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/window", + "dojo/dom", + "dojo/dom-class", + "dojo/dom-construct", + "dijit/registry", // registry.byNode + "dijit/_Contained", + "dijit/_WidgetBase" +], function(connect, declare, win, dom, domClass, domConstruct, registry, Contained, WidgetBase){ + +/*===== + var Contained = dijit._Contained; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/PageIndicator + // summary: + // A current page indicator. + + return declare("dojox.mobile.PageIndicator", [WidgetBase, Contained],{ + // summary: + // A current page indicator. + // description: + // PageIndicator displays a series of gray and white dots to + // indicate which page is currently being viewed. It can typically + // be used with dojox.mobile.SwapView. It is also internally used + // in dojox.mobile.Carousel. + + // refId: String + // An ID of a DOM node to be searched. Siblings of the reference + // node will be searched for views. If not specified, this.domNode + // will be the reference node. + refId: "", + + buildRendering: function(){ + this.domNode = this.srcNodeRef || win.doc.createElement("DIV"); + this.domNode.className = "mblPageIndicator"; + this._tblNode = domConstruct.create("TABLE", {className:"mblPageIndicatorContainer"}, this.domNode); + this._tblNode.insertRow(-1); + this.connect(this.domNode, "onclick", "onClick"); + connect.subscribe("/dojox/mobile/viewChanged", this, function(view){ + this.reset(); + }); + }, + + startup: function(){ + var _this = this; + setTimeout(function(){ // to wait until views' visibility is determined + _this.reset(); + }, 0); + }, + + reset: function(){ + // summary: + // Updates the indicator. + var r = this._tblNode.rows[0]; + var i, c, a = [], dot; + var refNode = (this.refId && dom.byId(this.refId)) || this.domNode; + var children = refNode.parentNode.childNodes; + for(i = 0; i < children.length; i++){ + c = children[i]; + if(this.isView(c)){ + a.push(c); + } + } + if(r.cells.length !== a.length){ + domConstruct.empty(r); + for(i = 0; i < a.length; i++){ + c = a[i]; + dot = domConstruct.create("DIV", {className:"mblPageIndicatorDot"}); + r.insertCell(-1).appendChild(dot); + } + } + if(a.length === 0){ return; } + var currentView = registry.byNode(a[0]).getShowingView(); + for(i = 0; i < r.cells.length; i++){ + dot = r.cells[i].firstChild; + if(a[i] === currentView.domNode){ + domClass.add(dot, "mblPageIndicatorDotSelected"); + }else{ + domClass.remove(dot, "mblPageIndicatorDotSelected"); + } + } + }, + + isView: function(node){ + // summary: + // Returns true if the given node is a view. + return (node && node.nodeType === 1 && domClass.contains(node, "mblView")); + }, + + onClick: function(e){ + if(e.target !== this.domNode){ return; } + if(e.layerX < this._tblNode.offsetLeft){ + connect.publish("/dojox/mobile/prevPage", [this]); + }else if(e.layerX > this._tblNode.offsetLeft + this._tblNode.offsetWidth){ + connect.publish("/dojox/mobile/nextPage", [this]); + } + } + }); +}); diff --git a/js/dojo/dojox/mobile/ProgressIndicator.js b/js/dojo/dojox/mobile/ProgressIndicator.js new file mode 100644 index 0000000..1fd52f3 --- /dev/null +++ b/js/dojo/dojox/mobile/ProgressIndicator.js @@ -0,0 +1,112 @@ +//>>built +define("dojox/mobile/ProgressIndicator", [ + "dojo/_base/config", + "dojo/_base/declare", + "dojo/dom-construct", + "dojo/dom-style", + "dojo/has" +], function(config, declare, domConstruct, domStyle, has){ + + // module: + // dojox/mobile/ProgressIndicator + // summary: + // A progress indication widget. + + var cls = declare("dojox.mobile.ProgressIndicator", null, { + // summary: + // A progress indication widget. + // description: + // ProgressIndicator is a round spinning graphical representation + // that indicates the current task is on-going. + + // interval: Number + // The time interval in milliseconds for updating the spinning + // indicator. + interval: 100, + + // colors: Array + // An array of indicator colors. + colors: [ + "#C0C0C0", "#C0C0C0", "#C0C0C0", "#C0C0C0", + "#C0C0C0", "#C0C0C0", "#B8B9B8", "#AEAFAE", + "#A4A5A4", "#9A9A9A", "#8E8E8E", "#838383" + ], + + constructor: function(){ + this._bars = []; + this.domNode = domConstruct.create("DIV"); + this.domNode.className = "mblProgContainer"; + if(config["mblAndroidWorkaround"] !== false && has("android") >= 2.2 && has("android") < 3){ + // workaround to avoid the side effects of the fixes for android screen flicker problem + domStyle.set(this.domNode, "webkitTransform", "translate3d(0,0,0)"); + } + this.spinnerNode = domConstruct.create("DIV", null, this.domNode); + for(var i = 0; i < this.colors.length; i++){ + var div = domConstruct.create("DIV", {className:"mblProg mblProg"+i}, this.spinnerNode); + this._bars.push(div); + } + }, + + start: function(){ + // summary: + // Starts the ProgressIndicator spinning. + if(this.imageNode){ + var img = this.imageNode; + var l = Math.round((this.domNode.offsetWidth - img.offsetWidth) / 2); + var t = Math.round((this.domNode.offsetHeight - img.offsetHeight) / 2); + img.style.margin = t+"px "+l+"px"; + return; + } + var cntr = 0; + var _this = this; + var n = this.colors.length; + this.timer = setInterval(function(){ + cntr--; + cntr = cntr < 0 ? n - 1 : cntr; + var c = _this.colors; + for(var i = 0; i < n; i++){ + var idx = (cntr + i) % n; + _this._bars[i].style.backgroundColor = c[idx]; + } + }, this.interval); + }, + + stop: function(){ + // summary: + // Stops the ProgressIndicator spinning. + if(this.timer){ + clearInterval(this.timer); + } + this.timer = null; + if(this.domNode.parentNode){ + this.domNode.parentNode.removeChild(this.domNode); + } + }, + + setImage: function(/*String*/file){ + // summary: + // Sets an indicator icon image file (typically animated GIF). + // If null is specified, restores the default spinner. + if(file){ + this.imageNode = domConstruct.create("IMG", {src:file}, this.domNode); + this.spinnerNode.style.display = "none"; + }else{ + if(this.imageNode){ + this.domNode.removeChild(this.imageNode); + this.imageNode = null; + } + this.spinnerNode.style.display = ""; + } + } + }); + + cls._instance = null; + cls.getInstance = function(){ + if(!cls._instance){ + cls._instance = new cls(); + } + return cls._instance; + }; + + return cls; +}); diff --git a/js/dojo/dojox/mobile/README b/js/dojo/dojox/mobile/README new file mode 100644 index 0000000..d9ede45 --- /dev/null +++ b/js/dojo/dojox/mobile/README @@ -0,0 +1,57 @@ +------------------------------------------------------------------------------- +Project Name: dojox.mobile +------------------------------------------------------------------------------- +Version 1.0 +Release date: 03/23/2010 +------------------------------------------------------------------------------- +Project state: +dojox.mobile: stable +dojox.mobile.app: experimental +------------------------------------------------------------------------------- +[ NO ] l18n support? +[ NO ] a11y support? +------------------------------------------------------------------------------- +Credits: + Jared Jurkiewicz (jared.jurkiewicz@gmail.com) + Yoshiroh Kamiyama (Contributor to Jared of base code). + Shane O'Sullivan (dojox.mobile.app) + +------------------------------------------------------------------------------- +Project description + +This project tries to solve an area lacking in dojo, namely better +support for mobile devices. This project provides through CSS3 and +custom styles, interfaces that display and work well on mobile devices +such as the Android and iPhone Smart Phones. + +The code is deliberately kept as lightweight as possible, using CSS3 animations +and the like to perform the effects. There is a compat.js, which will simulate +most of the effects using dojo.animateProperty and dojox.fx where possible on +browsers such as FireFox and IE. It will not load by default, it has to be +required in separately. +------------------------------------------------------------------------------- +Dependencies: + dojo base + dijit/_WidgetBase.js +------------------------------------------------------------------------------- +Documentation + Documentation resides at: + http://dojotoolkit.org/reference-guide/dojox/mobile.html + +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/src/dojox/trunk/mobile/* +http://svn.dojotoolkit.org/src/dojox/trunk/mobile.js + +Install into the following directory structure: +/dojox/mobile.js +/dojox/mobile/* + +...which should be at the same level as your Dojo checkout. + +then dojo.require("dojox.mobile") in your application to load it. + +------------------------------------------------------------------------------- + diff --git a/js/dojo/dojox/mobile/RadioButton.js b/js/dojo/dojox/mobile/RadioButton.js new file mode 100644 index 0000000..c02f768 --- /dev/null +++ b/js/dojo/dojox/mobile/RadioButton.js @@ -0,0 +1,21 @@ +//>>built +define("dojox/mobile/RadioButton", [ + "dojo/_base/declare", + "dijit/form/_RadioButtonMixin", + "./CheckBox" +], function(declare, RadioButtonMixin, CheckBox){ + /*===== + CheckBox = dojox.mobile.CheckBox; + RadioButtonMixin = dijit.form._RadioButtonMixin; + =====*/ + return declare("dojox.mobile.RadioButton", [CheckBox, RadioButtonMixin], { + // summary: + // A non-templated radiobutton widget that can be in two states (checked or not). + + // Override automatic assigning type --> node, it causes exception on IE8. + // Instead, type must be specified as this.type when the node is created, as part of the original DOM + _setTypeAttr: null, + + baseClass: "mblRadioButton" + }); +}); diff --git a/js/dojo/dojox/mobile/RoundRect.js b/js/dojo/dojox/mobile/RoundRect.js new file mode 100644 index 0000000..f962154 --- /dev/null +++ b/js/dojo/dojox/mobile/RoundRect.js @@ -0,0 +1,49 @@ +//>>built +define("dojox/mobile/RoundRect", [ + "dojo/_base/array", + "dojo/_base/declare", + "dojo/_base/window", + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase" +], function(array, declare, win, Contained, Container, WidgetBase){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/RoundRect + // summary: + // A simple round rectangle container. + + return declare("dojox.mobile.RoundRect", [WidgetBase, Container, Contained], { + // summary: + // A simple round rectangle container. + // description: + // RoundRect is a simple round rectangle container for any HTML + // and/or widgets. You can achieve the same appearance by just + // applying the -webkit-border-radius style to a div tag. However, + // if you use RoundRect, you can get a round rectangle even on + // non-CSS3 browsers such as (older) IE. + + // shadow: Boolean + // If true, adds a shadow effect to the container element. + shadow: false, + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement("DIV"); + this.domNode.className = this.shadow ? "mblRoundRect mblShadow" : "mblRoundRect"; + }, + + resize: function(){ + // summary: + // Calls resize() of each child widget. + array.forEach(this.getChildren(), function(child){ + if(child.resize){ child.resize(); } + }); + } + }); +}); diff --git a/js/dojo/dojox/mobile/RoundRectCategory.js b/js/dojo/dojox/mobile/RoundRectCategory.js new file mode 100644 index 0000000..7e2a1fc --- /dev/null +++ b/js/dojo/dojox/mobile/RoundRectCategory.js @@ -0,0 +1,41 @@ +//>>built +define("dojox/mobile/RoundRectCategory", [ + "dojo/_base/declare", + "dojo/_base/window", + "dijit/_Contained", + "dijit/_WidgetBase" +], function(declare, win, Contained, WidgetBase){ + +/*===== + var Contained = dijit._Contained; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/RoundRectCategory + // summary: + // A category header for a rounded rectangle list. + + return declare("dojox.mobile.RoundRectCategory", [WidgetBase, Contained],{ + // summary: + // A category header for a rounded rectangle list. + + // label: String + // A label text for the widget. + label: "", + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement("H2"); + this.domNode.className = "mblRoundRectCategory"; + if(!this.label){ + this.label = this.domNode.innerHTML; + } + }, + + _setLabelAttr: function(/*String*/label){ + this.label = label; + this.domNode.innerHTML = this._cv ? this._cv(label) : label; + } + }); + +}); diff --git a/js/dojo/dojox/mobile/RoundRectDataList.js b/js/dojo/dojox/mobile/RoundRectDataList.js new file mode 100644 index 0000000..136346f --- /dev/null +++ b/js/dojo/dojox/mobile/RoundRectDataList.js @@ -0,0 +1,25 @@ +//>>built +define("dojox/mobile/RoundRectDataList", [ + "dojo/_base/declare", + "./RoundRectList", + "./_DataListMixin" +], function(declare, RoundRectList, DataListMixin){ + +/*===== + var RoundRectList = dojox.mobile.RoundRectList; + var DataListMixin = dojox.mobile._DataListMixin; +=====*/ + + // module: + // dojox/mobile/RoundRectDataList + // summary: + // An enhanced version of RoundRectList. + + return declare("dojox.mobile.RoundRectDataList", [RoundRectList, DataListMixin], { + // summary: + // An enhanced version of RoundRectList. + // description: + // RoundRectDataList is an enhanced version of RoundRectList. It + // can generate ListItems according to the given dojo.data store. + }); +}); diff --git a/js/dojo/dojox/mobile/RoundRectList.js b/js/dojo/dojox/mobile/RoundRectList.js new file mode 100644 index 0000000..a361b01 --- /dev/null +++ b/js/dojo/dojox/mobile/RoundRectList.js @@ -0,0 +1,100 @@ +//>>built +define("dojox/mobile/RoundRectList", [ + "dojo/_base/array", + "dojo/_base/declare", + "dojo/_base/window", + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase" +], function(array, declare, win, Contained, Container, WidgetBase){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/RoundRectList + // summary: + // A rounded rectangle list. + + return declare("dojox.mobile.RoundRectList", [WidgetBase, Container, Contained], { + // summary: + // A rounded rectangle list. + // description: + // RoundRectList is a rounded rectangle list, which can be used to + // display a group of items. Each item must be + // dojox.mobile.ListItem. + + // transition: String + // The default animated transition effect for child items. + transition: "slide", + + // iconBase: String + // The default icon path for child items. + iconBase: "", + + // iconPos: String + // The default icon position for child items. + iconPos: "", + + // select: String + // Selection mode of the list. The check mark is shown for the + // selected list item(s). The value can be "single", "multiple", or + // "". If "single", there can be only one selected item at a time. + // If "multiple", there can be multiple selected items at a time. + select: "", + + // stateful: String + // If true, the last selected item remains highlighted. + stateful: false, + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement("UL"); + this.domNode.className = "mblRoundRectList"; + }, + + resize: function(){ + // summary: + // Calls resize() of each child widget. + array.forEach(this.getChildren(), function(child){ + if(child.resize){ child.resize(); } + }); + }, + + onCheckStateChanged: function(/*Widget*/listItem, /*String*/newState){ + // summary: + // Stub function to connect to from your application. + // description: + // Called when the check state has been changed. + }, + + _setStatefulAttr: function(stateful){ + this.stateful = stateful; + array.forEach(this.getChildren(), function(child){ + child.setArrow && child.setArrow(); + }); + }, + + deselectItem: function(/*ListItem*/item){ + // summary: + // Deselects the given item. + item.deselect(); + }, + + deselectAll: function(){ + // summary: + // Deselects all the items. + array.forEach(this.getChildren(), function(child){ + child.deselect && child.deselect(); + }); + }, + + selectItem: function(/*ListItem*/item){ + // summary: + // Selects the given item. + item.select(); + } + }); +}); diff --git a/js/dojo/dojox/mobile/ScrollableView.js b/js/dojo/dojox/mobile/ScrollableView.js new file mode 100644 index 0000000..fb2e7da --- /dev/null +++ b/js/dojo/dojox/mobile/ScrollableView.js @@ -0,0 +1,140 @@ +//>>built +define("dojox/mobile/ScrollableView", [ + "dojo/_base/array", + "dojo/_base/declare", + "dojo/dom-class", + "dojo/dom-construct", + "dijit/registry", // registry.byNode + "./View", + "./_ScrollableMixin" +], function(array, declare, domClass, domConstruct, registry, View, ScrollableMixin){ + + /*===== + var View = dojox.mobile.View; + var ScrollableMixin = dojox.mobile._ScrollableMixin; + =====*/ + + // module: + // dojox/mobile/ScrollableView + // summary: + // A container that has a touch scrolling capability. + + return declare("dojox.mobile.ScrollableView", [View, ScrollableMixin], { + // summary: + // A container that has a touch scrolling capability. + // description: + // ScrollableView is a subclass of View (=dojox.mobile.View). + // Unlike the base View class, ScrollableView's domNode always stays + // at the top of the screen and its height is "100%" of the screen. + // In this fixed domNode, containerNode scrolls. Browser's default + // scrolling behavior is disabled, and the scrolling machinery is + // re-implemented with JavaScript. Thus the user does not need to use the + // two-finger operation to scroll an inner DIV (containerNode). + // The main purpose of this widget is to realize fixed-positioned header + // and/or footer bars. + + // scrollableParams: Object + // Parameters for dojox.mobile.scrollable.init(). + scrollableParams: null, + + // keepScrollPos: Boolean + // Overrides dojox.mobile.View.keepScrollPos. + keepScrollPos: false, + + constructor: function(){ + this.scrollableParams = {noResize: true}; + }, + + buildRendering: function(){ + this.inherited(arguments); + domClass.add(this.domNode, "mblScrollableView"); + this.domNode.style.overflow = "hidden"; + this.domNode.style.top = "0px"; + this.containerNode = domConstruct.create("DIV", + {className:"mblScrollableViewContainer"}, this.domNode); + this.containerNode.style.position = "absolute"; + this.containerNode.style.top = "0px"; // view bar is relative + if(this.scrollDir === "v"){ + this.containerNode.style.width = "100%"; + } + this.reparent(); + this.findAppBars(); + }, + + resize: function(){ + // summary: + // Calls resize() of each child widget. + this.inherited(arguments); // scrollable#resize() will be called + array.forEach(this.getChildren(), function(child){ + if(child.resize){ child.resize(); } + }); + }, + + isTopLevel: function(e){ + // summary: + // Returns true if this is a top-level widget. + // Overrides dojox.mobile.scrollable. + var parent = this.getParent && this.getParent(); + return (!parent || !parent.resize); // top level widget + }, + + addChild: function(widget, /*Number?*/insertIndex){ + var c = widget.domNode; + var fixed = this.checkFixedBar(c, true); + if(fixed){ + // Addition of a fixed bar is an exceptional case. + // It has to be added to domNode, not containerNode. + // In this case, insertIndex is ignored. + this.domNode.appendChild(c); + if(fixed === "top"){ + this.fixedHeaderHeight = c.offsetHeight; + this.isLocalHeader = true; + }else if(fixed === "bottom"){ + this.fixedFooterHeight = c.offsetHeight; + this.isLocalFooter = true; + c.style.bottom = "0px"; + } + this.resize(); + if(this._started && !widget._started){ + widget.startup(); + } + }else{ + this.inherited(arguments); + } + }, + + reparent: function(){ + // summary: + // Moves all the children, except header and footer, to + // containerNode. + var i, idx, len, c; + for(i = 0, idx = 0, len = this.domNode.childNodes.length; i < len; i++){ + c = this.domNode.childNodes[idx]; + // search for view-specific header or footer + if(c === this.containerNode || this.checkFixedBar(c, true)){ + idx++; + continue; + } + this.containerNode.appendChild(this.domNode.removeChild(c)); + } + }, + + onAfterTransitionIn: function(moveTo, dir, transition, context, method){ + this.flashScrollBar(); + }, + + getChildren: function(){ + // summary: + // Overrides _WidgetBase#getChildren to add local fixed bars, + // which are not under containerNode, to the children array. + var children = this.inherited(arguments); + if(this.fixedHeader && this.fixedHeader.parentNode === this.domNode){ + children.push(registry.byNode(this.fixedHeader)); + } + if(this.fixedFooter && this.fixedFooter.parentNode === this.domNode){ + children.push(registry.byNode(this.fixedFooter)); + } + return children; + } + }); +}); diff --git a/js/dojo/dojox/mobile/Slider.js b/js/dojo/dojox/mobile/Slider.js new file mode 100644 index 0000000..29616db --- /dev/null +++ b/js/dojo/dojox/mobile/Slider.js @@ -0,0 +1,164 @@ +//>>built +define("dojox/mobile/Slider", [ + "dojo/_base/array", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-geometry", + "dojo/dom-style", + "dijit/_WidgetBase", + "dijit/form/_FormValueMixin" +], + function(array, connect, declare, lang, win, domClass, domConstruct, domGeometry, domStyle, WidgetBase, FormValueMixin){ + + /*===== + WidgetBase = dijit._WidgetBase; + FormValueMixin = dijit.form._FormValueMixin; + =====*/ + return declare("dojox.mobile.Slider", [WidgetBase, FormValueMixin], { + // summary: + // A non-templated Slider widget similar to the HTML5 INPUT type=range. + // + + // value: [const] Number + // The current slider value. + value: 0, + + // min: [const] Number + // The first value the slider can be set to. + min: 0, + + // max: [const] Number + // The last value the slider can be set to. + max: 100, + + // step: [const] Number + // The delta from 1 value to another. + // This causes the slider handle to snap/jump to the closest possible value. + // A value of 0 means continuous (as much as allowed by pixel resolution). + step: 1, + + baseClass: "mblSlider", + + // flip: [const] Boolean + // Specifies if the slider should change its default: ascending <--> descending. + flip: false, + + // orientation: [const] String + // The slider direction. + // "H": horizontal + // "V": vertical + // "auto": use width/height comparison at instantiation time (default is "H" if width/height are 0) + orientation: "auto", + + // halo: Number + // Size of the boundary that extends beyond the edges of the slider + // to make it easier to touch. + halo: "8pt", + + buildRendering: function(){ + this.focusNode = this.domNode = domConstruct.create("div", {}); + this.valueNode = domConstruct.create("input", (this.srcNodeRef && this.srcNodeRef.name) ? { type: "hidden", name: this.srcNodeRef.name } : { type: "hidden" }, this.domNode, "last"); + var relativeParent = domConstruct.create("div", { style: { position:"relative", height:"100%", width:"100%" } }, this.domNode, "last"); + this.progressBar = domConstruct.create("div", { style:{ position:"absolute" }, "class":"mblSliderProgressBar" }, relativeParent, "last"); + this.touchBox = domConstruct.create("div", { style:{ position:"absolute" }, "class":"mblSliderTouchBox" }, relativeParent, "last"); + this.handle = domConstruct.create("div", { style:{ position:"absolute" }, "class":"mblSliderHandle" }, relativeParent, "last"); + this.inherited(arguments); + }, + + _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){ + // summary: + // Hook so set('value', value) works. + var fromPercent = (this.value - this.min) * 100 / (this.max - this.min); + this.valueNode.value = value; + this.inherited(arguments); + if(!this._started){ return; } // don't move images until all the properties are set + this.focusNode.setAttribute("aria-valuenow", value); + var toPercent = (value - this.min) * 100 / (this.max - this.min); + // now perform visual slide + var horizontal = this.orientation != "V"; + if(priorityChange === true){ + domClass.add(this.handle, "mblSliderTransition"); + domClass.add(this.progressBar, "mblSliderTransition"); + }else{ + domClass.remove(this.handle, "mblSliderTransition"); + domClass.remove(this.progressBar, "mblSliderTransition"); + } + domStyle.set(this.handle, this._attrs.handleLeft, (this._reversed ? (100-toPercent) : toPercent) + "%"); + domStyle.set(this.progressBar, this._attrs.width, toPercent + "%"); + }, + + postCreate: function(){ + this.inherited(arguments); + + function beginDrag(e){ + function getEventData(e){ + point = isMouse ? e[this._attrs.pageX] : (e.touches ? e.touches[0][this._attrs.pageX] : e[this._attrs.clientX]); + pixelValue = point - startPixel; + pixelValue = Math.min(Math.max(pixelValue, 0), maxPixels); + var discreteValues = this.step ? ((this.max - this.min) / this.step) : maxPixels; + if(discreteValues <= 1 || discreteValues == Infinity ){ discreteValues = maxPixels; } + var wholeIncrements = Math.round(pixelValue * discreteValues / maxPixels); + value = (this.max - this.min) * wholeIncrements / discreteValues; + value = this._reversed ? (this.max - value) : (this.min + value); + } + function continueDrag(e){ + e.preventDefault(); + lang.hitch(this, getEventData)(e); + this.set('value', value, false); + } + + function endDrag(e){ + e.preventDefault(); + array.forEach(actionHandles, lang.hitch(this, "disconnect")); + actionHandles = []; + this.set('value', this.value, true); + } + + e.preventDefault(); + var isMouse = e.type == "mousedown"; + var box = domGeometry.position(node, false); // can't use true since the added docScroll and the returned x are body-zoom incompatibile + var bodyZoom = domStyle.get(win.body(), "zoom") || 1; + if(isNaN(bodyZoom)){ bodyZoom = 1; } + var nodeZoom = domStyle.get(node, "zoom") || 1; + if(isNaN(nodeZoom)){ nodeZoom = 1; } + var startPixel = box[this._attrs.x] * nodeZoom * bodyZoom + domGeometry.docScroll()[this._attrs.x]; + var maxPixels = box[this._attrs.w] * nodeZoom * bodyZoom; + lang.hitch(this, getEventData)(e); + if(e.target == this.touchBox){ + this.set('value', value, true); + } + array.forEach(actionHandles, connect.disconnect); + var root = win.doc.documentElement; + var actionHandles = [ + this.connect(root, isMouse ? "onmousemove" : "ontouchmove", continueDrag), + this.connect(root, isMouse ? "onmouseup" : "ontouchend", endDrag) + ]; + } + + var point, pixelValue, value; + var node = this.domNode; + if(this.orientation == "auto"){ + this.orientation = node.offsetHeight <= node.offsetWidth ? "H" : "V"; + } + // add V or H suffix to baseClass for styling purposes + domClass.add(this.domNode, array.map(this.baseClass.split(" "), lang.hitch(this, function(c){ return c+this.orientation; }))); + var horizontal = this.orientation != "V"; + var ltr = horizontal ? this.isLeftToRight() : false; + var flip = this.flip; + // _reversed is complicated since you can have flipped right-to-left and vertical is upside down by default + this._reversed = !(horizontal && ((ltr && !flip) || (!ltr && flip))) || (!horizontal && !flip); + this._attrs = horizontal ? { x:'x', w:'w', l:'l', r:'r', pageX:'pageX', clientX:'clientX', handleLeft:"left", left:this._reversed ? "right" : "left", width:"width" } : { x:'y', w:'h', l:'t', r:'b', pageX:'pageY', clientX:'clientY', handleLeft:"top", left:this._reversed ? "bottom" : "top", width:"height" }; + this.progressBar.style[this._attrs.left] = "0px"; + this.connect(this.touchBox, "touchstart", beginDrag); + this.connect(this.touchBox, "onmousedown", beginDrag); // in case this works + this.connect(this.handle, "touchstart", beginDrag); + this.connect(this.handle, "onmousedown", beginDrag); // in case this works + this.startup(); + this.set('value', this.value); + } + }); +}); diff --git a/js/dojo/dojox/mobile/SpinWheel.js b/js/dojo/dojox/mobile/SpinWheel.js new file mode 100644 index 0000000..05a7150 --- /dev/null +++ b/js/dojo/dojox/mobile/SpinWheel.js @@ -0,0 +1,98 @@ +//>>built +define("dojox/mobile/SpinWheel", [ + "dojo/_base/array", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/dom-class", + "dojo/dom-construct", + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase", + "./SpinWheelSlot" +], function(array, declare, lang, domClass, domConstruct, Contained, Container, WidgetBase, SpinWheelSlot){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/SpinWheel + // summary: + // A value picker widget that has spin wheels. + + return declare("dojox.mobile.SpinWheel", [WidgetBase, Container, Contained],{ + // summary: + // A value picker widget that has spin wheels. + // description: + // SpinWheel is a value picker component. It is a sectioned wheel + // that can be used to pick up some values from the wheel slots by + // spinning them. + + // slotClasses: Array + // An array of slot classes to be this SpinWheel's slots. + slotClasses: [], + + // slotProps: Array + // An array of property objects for each slot class specified in + // slotClasses. + slotProps: [], + + /* internal properties */ + centerPos: 0, + + buildRendering: function(){ + this.inherited(arguments); + domClass.add(this.domNode, "mblSpinWheel"); + this.centerPos = Math.round(this.domNode.offsetHeight / 2); + + this.slots = []; + for(var i = 0; i < this.slotClasses.length; i++){ + this.slots.push(((typeof this.slotClasses[i] =='string') ? lang.getObject(this.slotClasses[i]) : this.slotClasses[i])(this.slotProps[i])); + this.addChild(this.slots[i]); + } + domConstruct.create("DIV", {className: "mblSpinWheelBar"}, this.domNode); + }, + + startup: function(){ + this.inherited(arguments); + this.reset(); + }, + + getValue: function(){ + // summary: + // Returns an array of slot values. + var a = []; + array.forEach(this.getChildren(), function(w){ + if(w instanceof SpinWheelSlot){ + a.push(w.getValue()); + } + }, this); + return a; + }, + + setValue: function(/*Array*/a){ + // summary: + // Sets the slot values. + var i = 0; + array.forEach(this.getChildren(), function(w){ + if(w instanceof SpinWheelSlot){ + w.setValue(a[i]); + w.setColor(a[i]); + i++; + } + }, this); + }, + + reset: function(){ + // summary: + // Resets the SpinWheel to show the initial values. + array.forEach(this.getChildren(), function(w){ + if(w instanceof SpinWheelSlot){ + w.setInitialValue(); + } + }, this); + } + }); +}); diff --git a/js/dojo/dojox/mobile/SpinWheelDatePicker.js b/js/dojo/dojox/mobile/SpinWheelDatePicker.js new file mode 100644 index 0000000..bdaed07 --- /dev/null +++ b/js/dojo/dojox/mobile/SpinWheelDatePicker.js @@ -0,0 +1,110 @@ +//>>built +define("dojox/mobile/SpinWheelDatePicker", [ + "dojo/_base/declare", + "dojo/dom-class", + "dojo/date", + "dojo/date/locale", + "./SpinWheel", + "./SpinWheelSlot" +], function(declare, domClass, ddate, datelocale, SpinWheel, SpinWheelSlot){ + +/*===== + var SpinWheel = dojox.mobile.SpinWheel; + var SpinWheelSlot = dojox.mobile.SpinWheelSlot; +=====*/ + + // module: + // dojox/mobile/SpinWheelDatePicker + // summary: + // A SpinWheel-based date picker widget. + + //TODO: the api doc parser seems to fail if the 1st arg for declare (=class name) is missing.. + var SpinWheelYearSlot = declare(/*===== "dojox.mobile.SpinWheelYearSlot", =====*/ SpinWheelSlot, { + buildRendering: function(){ + this.labels = []; + if(this.labelFrom !== this.labelTo){ + var dtA = new Date(this.labelFrom, 0, 1); + var i, idx; + for(i = this.labelFrom, idx = 0; i <= this.labelTo; i++, idx++){ + dtA.setFullYear(i); + this.labels.push(datelocale.format(dtA, {datePattern:"yyyy", selector:"date"})); + } + } + this.inherited(arguments); + } + }); + + var SpinWheelMonthSlot = declare(/*===== "dojox.mobile.SpinWheelMonthSlot", =====*/ SpinWheelSlot, { + buildRendering: function(){ + this.labels = []; + var dtA = new Date(2000, 0, 1); + var monthStr; + for(var i = 0; i < 12; i++){ + dtA.setMonth(i); + monthStr = datelocale.format(dtA, {datePattern:"MMM", selector:"date"}); + this.labels.push(monthStr); + } + this.inherited(arguments); + } + }); + + var SpinWheelDaySlot = declare(/*===== "dojox.mobile.SpinWheelDaySlot", =====*/ SpinWheelSlot, { + }); + + return declare("dojox.mobile.SpinWheelDatePicker", SpinWheel, { + // summary: + // A SpinWheel-based date picker widget. + // description: + // SpinWheelDatePicker is a date picker widget. It is a subclass of + // dojox.mobile.SpinWheel. It has the year, month, and day slots. + + slotClasses: [ + SpinWheelYearSlot, + SpinWheelMonthSlot, + SpinWheelDaySlot + ], + slotProps: [ + {labelFrom:1970, labelTo:2038}, + {}, + {labelFrom:1, labelTo:31} + ], + + buildRendering: function(){ + this.inherited(arguments); + domClass.add(this.domNode, "mblSpinWheelDatePicker"); + this.connect(this.slots[1], "onFlickAnimationEnd", "onMonthSet"); + this.connect(this.slots[2], "onFlickAnimationEnd", "onDaySet"); + }, + + reset: function(){ + // summary: + // Goes to today. + var slots = this.slots; + var now = new Date(); + var monthStr = datelocale.format(now, {datePattern:"MMM", selector:"date"}); + this.setValue([now.getFullYear(), monthStr, now.getDate()]); + }, + + onMonthSet: function(){ + // summary: + // A handler called when the month value is changed. + var daysInMonth = this.onDaySet(); + var disableValuesTable = {28:[29,30,31], 29:[30,31], 30:[31], 31:[]}; + this.slots[2].disableValues(disableValuesTable[daysInMonth]); + }, + + onDaySet: function(){ + // summary: + // A handler called when the day value is changed. + var y = this.slots[0].getValue(); + var m = this.slots[1].getValue(); + var newMonth = datelocale.parse(y+"/"+m, {datePattern:'yyyy/MMM', selector:'date'}); + var daysInMonth = ddate.getDaysInMonth(newMonth); + var d = this.slots[2].getValue(); + if(daysInMonth < d){ + this.slots[2].setValue(daysInMonth); + } + return daysInMonth; + } + }); +}); diff --git a/js/dojo/dojox/mobile/SpinWheelSlot.js b/js/dojo/dojox/mobile/SpinWheelSlot.js new file mode 100644 index 0000000..d6322db --- /dev/null +++ b/js/dojo/dojox/mobile/SpinWheelSlot.js @@ -0,0 +1,328 @@ +//>>built +define("dojox/mobile/SpinWheelSlot", [ + "dojo/_base/declare", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-construct", + "dijit/_Contained", + "dijit/_WidgetBase", + "./_ScrollableMixin" +], function(declare, win, domClass, domConstruct, Contained, WidgetBase, ScrollableMixin){ + +/*===== + var Contained = dijit._Contained; + var WidgetBase = dijit._WidgetBase; + var ScrollableMixin = dojox.mobile._ScrollableMixin; +=====*/ + + // module: + // dojox/mobile/SpinWheelSlot + // summary: + // A slot of a SpinWheel. + + return declare("dojox.mobile.SpinWheelSlot", [WidgetBase, Contained, ScrollableMixin], { + // summary: + // A slot of a SpinWheel. + // description: + // SpinWheelSlot is a slot that is placed in the SpinWheel widget. + + // items: Array + // An array of array of key-label paris. + // (e.g. [[0,"Jan"],[1,"Feb"],...] ) If key values for each label + // are not necessary, labels can be used instead. + items: [], + + // labels: Array + // An array of labels to be displayed on the slot. + // (e.g. ["Jan","Feb",...] ) This is a simplified version of the + // items property. + labels: [], + + // labelFrom: Number + // The start value of display values of the slot. This parameter is + // especially useful when slot has serial values. + labelFrom: 0, + + // labelTo: Number + // The end value of display values of the slot. + labelTo: 0, + + // value: String + // The initial value of the slot. + value: "", + + /* internal properties */ + maxSpeed: 500, + minItems: 15, + centerPos: 0, + scrollBar: false, + constraint: false, + allowNestedScrolls: false, + androidWorkaroud: false, // disable workaround in SpinWheel + + buildRendering: function(){ + this.inherited(arguments); + domClass.add(this.domNode, "mblSpinWheelSlot"); + + var i, j, idx; + if(this.labelFrom !== this.labelTo){ + this.labels = []; + for(i = this.labelFrom, idx = 0; i <= this.labelTo; i++, idx++){ + this.labels[idx] = String(i); + } + } + if(this.labels.length > 0){ + this.items = []; + for(i = 0; i < this.labels.length; i++){ + this.items.push([i, this.labels[i]]); + } + } + + this.containerNode = domConstruct.create("DIV", {className:"mblSpinWheelSlotContainer"}); + this.containerNode.style.height + = (win.global.innerHeight||win.doc.documentElement.clientHeight) * 2 + "px"; // must bigger than the screen + this.panelNodes = []; + for(var k = 0; k < 3; k++){ + this.panelNodes[k] = domConstruct.create("DIV", {className:"mblSpinWheelSlotPanel"}); + var len = this.items.length; + var n = Math.ceil(this.minItems / len); + for(j = 0; j < n; j++){ + for(i = 0; i < len; i++){ + domConstruct.create("DIV", { + className: "mblSpinWheelSlotLabel", + name: this.items[i][0], + innerHTML: this._cv ? this._cv(this.items[i][1]) : this.items[i][1] + }, this.panelNodes[k]); + } + } + this.containerNode.appendChild(this.panelNodes[k]); + } + this.domNode.appendChild(this.containerNode); + this.touchNode = domConstruct.create("DIV", {className:"mblSpinWheelSlotTouch"}, this.domNode); + this.setSelectable(this.domNode, false); + }, + + startup: function(){ + this.inherited(arguments); + this.centerPos = this.getParent().centerPos; + var items = this.panelNodes[1].childNodes; + this._itemHeight = items[0].offsetHeight; + this.adjust(); + }, + + adjust: function(){ + // summary: + // Adjusts the position of slot panels. + var items = this.panelNodes[1].childNodes; + var adjustY; + for(var i = 0, len = items.length; i < len; i++){ + var item = items[i]; + if(item.offsetTop <= this.centerPos && this.centerPos < item.offsetTop + item.offsetHeight){ + adjustY = this.centerPos - (item.offsetTop + Math.round(item.offsetHeight/2)); + break; + } + } + var h = this.panelNodes[0].offsetHeight; + this.panelNodes[0].style.top = -h + adjustY + "px"; + this.panelNodes[1].style.top = adjustY + "px"; + this.panelNodes[2].style.top = h + adjustY + "px"; + }, + + setInitialValue: function(){ + // summary: + // Sets the initial value using this.value or the first item. + if(this.items.length > 0){ + var val = (this.value !== "") ? this.value : this.items[0][1]; + this.setValue(val); + } + }, + + getCenterPanel: function(){ + // summary: + // Gets a panel that contains the currently selected item. + var pos = this.getPos(); + for(var i = 0, len = this.panelNodes.length; i < len; i++){ + var top = pos.y + this.panelNodes[i].offsetTop; + if(top <= this.centerPos && this.centerPos < top + this.panelNodes[i].offsetHeight){ + return this.panelNodes[i]; + } + } + return null; + }, + + setColor: function(/*String*/value){ + // summary: + // Sets the color of the specified item as blue. + for(var i = 0, len = this.panelNodes.length; i < len; i++){ + var items = this.panelNodes[i].childNodes; + for(var j = 0; j < items.length; j++){ + if(items[j].innerHTML === String(value)){ + domClass.add(items[j], "mblSpinWheelSlotLabelBlue"); + }else{ + domClass.remove(items[j], "mblSpinWheelSlotLabelBlue"); + } + } + } + }, + + disableValues: function(/*Array*/values){ + // summary: + // Makes the specified items grayed out. + for(var i = 0, len = this.panelNodes.length; i < len; i++){ + var items = this.panelNodes[i].childNodes; + for(var j = 0; j < items.length; j++){ + domClass.remove(items[j], "mblSpinWheelSlotLabelGray"); + for(var k = 0; k < values.length; k++){ + if(items[j].innerHTML === String(values[k])){ + domClass.add(items[j], "mblSpinWheelSlotLabelGray"); + break; + } + } + } + } + }, + + getCenterItem: function(){ + // summary: + // Gets the currently selected item. + var pos = this.getPos(); + var centerPanel = this.getCenterPanel(); + if(centerPanel){ + var top = pos.y + centerPanel.offsetTop; + var items = centerPanel.childNodes; + for(var i = 0, len = items.length; i < len; i++){ + if(top + items[i].offsetTop <= this.centerPos && this.centerPos < top + items[i].offsetTop + items[i].offsetHeight){ + return items[i]; + } + } + } + return null; + + }, + + getValue: function(){ + // summary: + // Gets the currently selected value. + var item = this.getCenterItem(); + return (item && item.innerHTML); + }, + + getKey: function(){ + // summary: + // Gets the key for the currently selected value. + return this.getCenterItem().getAttribute("name"); + }, + + setValue: function(newValue){ + // summary: + // Sets the newValue to this slot. + var idx0, idx1; + var curValue = this.getValue(); + if(!curValue){ + this._penddingValue = newValue; + return; + } + this._penddingValue = undefined; + var n = this.items.length; + for(var i = 0; i < n; i++){ + if(this.items[i][1] === String(curValue)){ + idx0 = i; + } + if(this.items[i][1] === String(newValue)){ + idx1 = i; + } + if(idx0 !== undefined && idx1 !== undefined){ + break; + } + } + var d = idx1 - (idx0 || 0); + var m; + if(d > 0){ + m = (d < n - d) ? -d : n - d; + }else{ + m = (-d < n + d) ? -d : -(n + d); + } + var to = this.getPos(); + to.y += m * this._itemHeight; + this.slideTo(to, 1); + }, + + getSpeed: function(){ + // summary: + // Overrides dojox.mobile.scrollable.getSpeed(). + var y = 0, n = this._time.length; + var delta = (new Date()).getTime() - this.startTime - this._time[n - 1]; + if(n >= 2 && delta < 200){ + var dy = this._posY[n - 1] - this._posY[(n - 6) >= 0 ? n - 6 : 0]; + var dt = this._time[n - 1] - this._time[(n - 6) >= 0 ? n - 6 : 0]; + y = this.calcSpeed(dy, dt); + } + return {x:0, y:y}; + }, + + calcSpeed: function(/*Number*/d, /*Number*/t){ + // summary: + // Overrides dojox.mobile.scrollable.calcSpeed(). + var speed = this.inherited(arguments); + if(!speed){ return 0; } + var v = Math.abs(speed); + var ret = speed; + if(v > this.maxSpeed){ + ret = this.maxSpeed*(speed/v); + } + return ret; + }, + + adjustDestination: function(to, pos){ + // summary: + // Overrides dojox.mobile.scrollable.adjustDestination(). + var h = this._itemHeight; + var j = to.y + Math.round(h/2); + var a = Math.abs(j); + var r = j >= 0 ? j % h : j % h + h; + to.y = j - r; + }, + + resize: function(e){ + if(this._penddingValue){ + this.setValue(this._penddingValue); + } + }, + + slideTo: function(/*Object*/to, /*Number*/duration, /*String*/easing){ + // summary: + // Overrides dojox.mobile.scrollable.slideTo(). + var pos = this.getPos(); + var top = pos.y + this.panelNodes[1].offsetTop; + var bottom = top + this.panelNodes[1].offsetHeight; + var vh = this.domNode.parentNode.offsetHeight; + var t; + if(pos.y < to.y){ // going down + if(bottom > vh){ + // move up the bottom panel + t = this.panelNodes[2]; + t.style.top = this.panelNodes[0].offsetTop - this.panelNodes[0].offsetHeight + "px"; + this.panelNodes[2] = this.panelNodes[1]; + this.panelNodes[1] = this.panelNodes[0]; + this.panelNodes[0] = t; + } + }else if(pos.y > to.y){ // going up + if(top < 0){ + // move down the top panel + t = this.panelNodes[0]; + t.style.top = this.panelNodes[2].offsetTop + this.panelNodes[2].offsetHeight + "px"; + this.panelNodes[0] = this.panelNodes[1]; + this.panelNodes[1] = this.panelNodes[2]; + this.panelNodes[2] = t; + } + } + if(!this._initialized){ + duration = 0; // to reduce flickers at start-up especially on android + this._initialized = true; + }else if(Math.abs(this._speed.y) < 40){ + duration = 0.2; + } + this.inherited(arguments, [to, duration, easing]); // 2nd arg is to avoid excessive optimization by closure compiler + } + }); +}); diff --git a/js/dojo/dojox/mobile/SpinWheelTimePicker.js b/js/dojo/dojox/mobile/SpinWheelTimePicker.js new file mode 100644 index 0000000..1c059b5 --- /dev/null +++ b/js/dojo/dojox/mobile/SpinWheelTimePicker.js @@ -0,0 +1,58 @@ +//>>built +define("dojox/mobile/SpinWheelTimePicker", [ + "dojo/_base/declare", + "dojo/dom-class", + "./SpinWheel", + "./SpinWheelSlot" +], function(declare, domClass, SpinWheel, SpinWheelSlot){ + +/*===== + var SpinWheel = dojox.mobile.SpinWheel; +=====*/ + + // module: + // dojox/mobile/SpinWheelTimePicker + // summary: + // A SpinWheel-based time picker widget. + + return declare("dojox.mobile.SpinWheelTimePicker", SpinWheel, { + // summary: + // A SpinWheel-based time picker widget. + // description: + // SpinWheelTimePicker is a time picker widget. It is a subclass of + // dojox.mobile.SpinWheel. It has the hour and minute slots. + + slotClasses: [ + SpinWheelSlot, + SpinWheelSlot + ], + slotProps: [ + {labelFrom:0, labelTo:23}, + {labels:["00","01","02","03","04","05","06","07","08","09", + "10","11","12","13","14","15","16","17","18","19", + "20","21","22","23","24","25","26","27","28","29", + "30","31","32","33","34","35","36","37","38","39", + "40","41","42","43","44","45","46","47","48","49", + "50","51","52","53","54","55","56","57","58","59"]} + ], + + buildRendering: function(){ + this.inherited(arguments); + domClass.add(this.domNode, "mblSpinWheelTimePicker"); + }, + + reset: function(){ + // summary: + // Goes to now. + var slots = this.slots; + var now = new Date(); + var _h = now.getHours() + ""; + slots[0].setValue(_h); + slots[0].setColor(_h); + var m = now.getMinutes(); + var _m = (m < 10 ? "0" : "") + m; + slots[1].setValue(_m); + slots[1].setColor(_m); + } + }); +}); diff --git a/js/dojo/dojox/mobile/SwapView.js b/js/dojo/dojox/mobile/SwapView.js new file mode 100644 index 0000000..32ebdb9 --- /dev/null +++ b/js/dojo/dojox/mobile/SwapView.js @@ -0,0 +1,229 @@ +//>>built +define("dojox/mobile/SwapView", [ + "dojo/_base/array", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/dom", + "dojo/dom-class", + "dijit/registry", // registry.byNode + "./View", + "./_ScrollableMixin" +], function(array, connect, declare, dom, domClass, registry, View, ScrollableMixin){ + +/*===== + var View = dojox.mobile.View; + var ScrollableMixin = dojox.mobile._ScrollableMixin; +=====*/ + + // module: + // dojox/mobile/SwapView + // summary: + // A container that can be flipped horizontally. + + return declare("dojox.mobile.SwapView", [View, ScrollableMixin], { + // summary: + // A container that can be flipped horizontally. + // description: + // SwapView is a container widget that represents entire mobile + // device screen, and can be swiped horizontally. (In dojo-1.6, it + // was called 'FlippableView'.) SwapView is a subclass of + // dojox.mobile.View. SwapView allows the user to swipe the screen + // left or right to move between the views. When SwapView is + // swiped, it finds an adjacent SwapView to open it. + + /* internal properties */ + scrollDir: "f", + weight: 1.2, + + buildRendering: function(){ + this.inherited(arguments); + domClass.add(this.domNode, "mblSwapView"); + this.setSelectable(this.domNode, false); + this.containerNode = this.domNode; + connect.subscribe("/dojox/mobile/nextPage", this, "handleNextPage"); + connect.subscribe("/dojox/mobile/prevPage", this, "handlePrevPage"); + this.findAppBars(); + }, + + resize: function(){ + // summary: + // Calls resize() of each child widget. + this.inherited(arguments); // scrollable#resize() will be called + array.forEach(this.getChildren(), function(child){ + if(child.resize){ child.resize(); } + }); + }, + + onTouchStart: function(e){ + // summary: + // Internal function to handle touchStart events. + var fromTop = this.domNode.offsetTop; + var nextView = this.nextView(this.domNode); + if(nextView){ + nextView.stopAnimation(); + domClass.add(nextView.domNode, "mblIn"); + // Temporarily add padding to align with the fromNode while transition + nextView.containerNode.style.paddingTop = fromTop + "px"; + } + var prevView = this.previousView(this.domNode); + if(prevView){ + prevView.stopAnimation(); + domClass.add(prevView.domNode, "mblIn"); + // Temporarily add padding to align with the fromNode while transition + prevView.containerNode.style.paddingTop = fromTop + "px"; + } + this.inherited(arguments); + }, + + handleNextPage: function(/*Widget*/w){ + // summary: + // Called when the "/dojox/mobile/nextPage" topic is published. + var refNode = w.refId && dom.byId(w.refId) || w.domNode; + if(this.domNode.parentNode !== refNode.parentNode){ return; } + if(this.getShowingView() !== this){ return; } + this.goTo(1); + }, + + handlePrevPage: function(/*Widget*/w){ + // summary: + // Called when the "/dojox/mobile/prevPage" topic is published. + var refNode = w.refId && dom.byId(w.refId) || w.domNode; + if(this.domNode.parentNode !== refNode.parentNode){ return; } + if(this.getShowingView() !== this){ return; } + this.goTo(-1); + }, + + goTo: function(/*Number*/dir){ + // summary: + // Moves to the next or previous view. + var w = this.domNode.offsetWidth; + var view = (dir == 1) ? this.nextView(this.domNode) : this.previousView(this.domNode); + if(!view){ return; } + view._beingFlipped = true; + view.scrollTo({x:w*dir}); + view._beingFlipped = false; + view.domNode.style.display = ""; + domClass.add(view.domNode, "mblIn"); + this.slideTo({x:0}, 0.5, "ease-out", {x:-w*dir}); + }, + + isSwapView: function(node){ + // summary: + // Returns true if the given node is a SwapView widget. + return (node && node.nodeType === 1 && domClass.contains(node, "mblSwapView")); + }, + + nextView: function(node){ + // summary: + // Returns the next view. + for(var n = node.nextSibling; n; n = n.nextSibling){ + if(this.isSwapView(n)){ return registry.byNode(n); } + } + return null; + }, + + previousView: function(node){ + // summary: + // Returns the previous view. + for(var n = node.previousSibling; n; n = n.previousSibling){ + if(this.isSwapView(n)){ return registry.byNode(n); } + } + return null; + }, + + scrollTo: function(/*Object*/to){ + // summary: + // Overrides dojox.mobile.scrollable.scrollTo(). + if(!this._beingFlipped){ + var newView, x; + if(to.x < 0){ + newView = this.nextView(this.domNode); + x = to.x + this.domNode.offsetWidth; + }else{ + newView = this.previousView(this.domNode); + x = to.x - this.domNode.offsetWidth; + } + if(newView){ + newView.domNode.style.display = ""; + newView._beingFlipped = true; + newView.scrollTo({x:x}); + newView._beingFlipped = false; + } + } + this.inherited(arguments); + }, + + slideTo: function(/*Object*/to, /*Number*/duration, /*String*/easing, fake_pos){ + // summary: + // Overrides dojox.mobile.scrollable.slideTo(). + if(!this._beingFlipped){ + var w = this.domNode.offsetWidth; + var pos = fake_pos || this.getPos(); + var newView, newX; + if(pos.x < 0){ // moving to left + newView = this.nextView(this.domNode); + if(pos.x < -w/4){ // slide to next + if(newView){ + to.x = -w; + newX = 0; + } + }else{ // go back + if(newView){ + newX = w; + } + } + }else{ // moving to right + newView = this.previousView(this.domNode); + if(pos.x > w/4){ // slide to previous + if(newView){ + to.x = w; + newX = 0; + } + }else{ // go back + if(newView){ + newX = -w; + } + } + } + + if(newView){ + newView._beingFlipped = true; + newView.slideTo({x:newX}, duration, easing); + newView._beingFlipped = false; + + if(newX === 0){ // moving to another view + dojox.mobile.currentView = newView; + } + newView.domNode._isShowing = (newView && newX === 0); + } + this.domNode._isShowing = !(newView && newX === 0); + } + this.inherited(arguments); + }, + + onFlickAnimationEnd: function(e){ + // summary: + // Overrides dojox.mobile.scrollable.onFlickAnimationEnd(). + if(e && e.animationName && e.animationName !== "scrollableViewScroll2"){ return; } + // Hide all the views other than the currently showing one. + // Otherwise, when the orientation is changed, other views + // may appear unexpectedly. + var children = this.domNode.parentNode.childNodes; + for(var i = 0; i < children.length; i++){ + var c = children[i]; + if(this.isSwapView(c)){ + domClass.remove(c, "mblIn"); + if(!c._isShowing){ + c.style.display = "none"; + } + } + } + this.inherited(arguments); + if(this.getShowingView() === this){ + connect.publish("/dojox/mobile/viewChanged", [this]); + // Reset the temporary padding + this.containerNode.style.paddingTop = ""; + } + } + }); +}); diff --git a/js/dojo/dojox/mobile/Switch.js b/js/dojo/dojox/mobile/Switch.js new file mode 100644 index 0000000..eb6492c --- /dev/null +++ b/js/dojo/dojox/mobile/Switch.js @@ -0,0 +1,223 @@ +//>>built +define("dojox/mobile/Switch", [ + "dojo/_base/array", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/event", + "dojo/_base/window", + "dojo/dom-class", + "dijit/_Contained", + "dijit/_WidgetBase", + "./sniff" +], function(array, connect, declare, event, win, domClass, Contained, WidgetBase, has){ + +/*===== + Contained = dijit._Contained; + WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/Switch + // summary: + // A toggle switch with a sliding knob. + + return declare("dojox.mobile.Switch", [WidgetBase, Contained],{ + // summary: + // A toggle switch with a sliding knob. + // description: + // Switch is a toggle switch with a sliding knob. You can either + // tap or slide the knob to toggle the switch. The onStateChanged + // handler is called when the switch is manipulated. + + // value: String + // The initial state of the switch. "on" or "off". The default + // value is "on". + value: "on", + + // name: String + // A name for a hidden input field, which holds the current value. + name: "", + + // leftLabel: String + // The left-side label of the switch. + leftLabel: "ON", + + // rightLabel: String + // The right-side label of the switch. + rightLabel: "OFF", + + /* internal properties */ + _width: 53, + + buildRendering: function(){ + this.domNode = win.doc.createElement("DIV"); + var c = (this.srcNodeRef && this.srcNodeRef.className) || this.className || this["class"]; + this._swClass = (c || "").replace(/ .*/,""); + this.domNode.className = "mblSwitch"; + var nameAttr = this.name ? " name=\"" + this.name + "\"" : ""; + this.domNode.innerHTML = + '<div class="mblSwitchInner">' + + '<div class="mblSwitchBg mblSwitchBgLeft">' + + '<div class="mblSwitchText mblSwitchTextLeft"></div>' + + '</div>' + + '<div class="mblSwitchBg mblSwitchBgRight">' + + '<div class="mblSwitchText mblSwitchTextRight"></div>' + + '</div>' + + '<div class="mblSwitchKnob"></div>' + + '<input type="hidden"'+nameAttr+'></div>' + + '</div>'; + var n = this.inner = this.domNode.firstChild; + this.left = n.childNodes[0]; + this.right = n.childNodes[1]; + this.knob = n.childNodes[2]; + this.input = n.childNodes[3]; + }, + + postCreate: function(){ + this.connect(this.domNode, "onclick", "onClick"); + this.connect(this.domNode, has("touch") ? "touchstart" : "onmousedown", "onTouchStart"); + this._initialValue = this.value; // for reset() + }, + + _changeState: function(/*String*/state, /*Boolean*/anim){ + var on = (state === "on"); + this.left.style.display = ""; + this.right.style.display = ""; + this.inner.style.left = ""; + if(anim){ + domClass.add(this.domNode, "mblSwitchAnimation"); + } + domClass.remove(this.domNode, on ? "mblSwitchOff" : "mblSwitchOn"); + domClass.add(this.domNode, on ? "mblSwitchOn" : "mblSwitchOff"); + + var _this = this; + setTimeout(function(){ + _this.left.style.display = on ? "" : "none"; + _this.right.style.display = !on ? "" : "none"; + domClass.remove(_this.domNode, "mblSwitchAnimation"); + }, anim ? 300 : 0); + }, + + startup: function(){ + if(this._swClass.indexOf("Round") != -1){ + var r = Math.round(this.domNode.offsetHeight / 2); + this.createRoundMask(this._swClass, r, this.domNode.offsetWidth); + } + }, + + createRoundMask: function(className, r, w){ + if(!has("webkit") || !className){ return; } + if(!this._createdMasks){ this._createdMasks = []; } + if(this._createdMasks[className]){ return; } + this._createdMasks[className] = 1; + + var ctx = win.doc.getCSSCanvasContext("2d", className+"Mask", w, 100); + ctx.fillStyle = "#000000"; + ctx.beginPath(); + ctx.moveTo(r, 0); + ctx.arcTo(0, 0, 0, 2*r, r); + ctx.arcTo(0, 2*r, r, 2*r, r); + ctx.lineTo(w - r, 2*r); + ctx.arcTo(w, 2*r, w, r, r); + ctx.arcTo(w, 0, w - r, 0, r); + ctx.closePath(); + ctx.fill(); + }, + + onClick: function(e){ + if(this._moved){ return; } + this.value = this.input.value = (this.value == "on") ? "off" : "on"; + this._changeState(this.value, true); + this.onStateChanged(this.value); + }, + + onTouchStart: function(e){ + // summary: + // Internal function to handle touchStart events. + this._moved = false; + this.innerStartX = this.inner.offsetLeft; + if(!this._conn){ + this._conn = []; + this._conn.push(connect.connect(this.inner, has("touch") ? "touchmove" : "onmousemove", this, "onTouchMove")); + this._conn.push(connect.connect(this.inner, has("touch") ? "touchend" : "onmouseup", this, "onTouchEnd")); + } + this.touchStartX = e.touches ? e.touches[0].pageX : e.clientX; + this.left.style.display = ""; + this.right.style.display = ""; + event.stop(e); + }, + + onTouchMove: function(e){ + // summary: + // Internal function to handle touchMove events. + e.preventDefault(); + var dx; + if(e.targetTouches){ + if(e.targetTouches.length != 1){ return false; } + dx = e.targetTouches[0].clientX - this.touchStartX; + }else{ + dx = e.clientX - this.touchStartX; + } + var pos = this.innerStartX + dx; + var d = 10; + if(pos <= -(this._width-d)){ pos = -this._width; } + if(pos >= -d){ pos = 0; } + this.inner.style.left = pos + "px"; + if(Math.abs(dx) > d){ + this._moved = true; + } + }, + + onTouchEnd: function(e){ + // summary: + // Internal function to handle touchEnd events. + array.forEach(this._conn, connect.disconnect); + this._conn = null; + if(this.innerStartX == this.inner.offsetLeft){ + if(has("touch")){ + var ev = win.doc.createEvent("MouseEvents"); + ev.initEvent("click", true, true); + this.inner.dispatchEvent(ev); + } + return; + } + var newState = (this.inner.offsetLeft < -(this._width/2)) ? "off" : "on"; + this._changeState(newState, true); + if(newState != this.value){ + this.value = this.input.value = newState; + this.onStateChanged(newState); + } + }, + + onStateChanged: function(/*String*/newState){ + // summary: + // Stub function to connect to from your application. + // description: + // Called when the state has been changed. + }, + + _setValueAttr: function(/*String*/value){ + this._changeState(value, false); + if(this.value != value){ + this.onStateChanged(value); + } + this.value = this.input.value = value; + }, + + _setLeftLabelAttr: function(/*String*/label){ + this.leftLabel = label; + this.left.firstChild.innerHTML = this._cv ? this._cv(label) : label; + }, + + _setRightLabelAttr: function(/*String*/label){ + this.rightLabel = label; + this.right.firstChild.innerHTML = this._cv ? this._cv(label) : label; + }, + + reset: function(){ + // summary: + // Reset the widget's value to what it was at initialization time + this.set("value", this._initialValue); + } + }); +}); diff --git a/js/dojo/dojox/mobile/TabBar.js b/js/dojo/dojox/mobile/TabBar.js new file mode 100644 index 0000000..ce665a7 --- /dev/null +++ b/js/dojo/dojox/mobile/TabBar.js @@ -0,0 +1,154 @@ +//>>built +define("dojox/mobile/TabBar", [ + "dojo/_base/array", + "dojo/_base/declare", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-geometry", + "dojo/dom-style", + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase", + "./Heading", + "./TabBarButton" +], function(array, declare, domClass, domConstruct, domGeometry, domStyle, Contained, Container, WidgetBase, Heading, TabBarButton){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/TabBar + // summary: + // A bar widget that has buttons to control visibility of views. + + return declare("dojox.mobile.TabBar", [WidgetBase, Container, Contained],{ + // summary: + // A bar widget that has buttons to control visibility of views. + // description: + // TabBar is a container widget that has typically multiple + // TabBarButtons which controls visibility of views. It can be used + // as a tab container. + + // iconBase: String + // The default icon path for child items. + iconBase: "", + + // iconPos: String + // The default icon position for child items. + iconPos: "", + + // barType: String + // "tabBar"(default) or "segmentedControl". + barType: "tabBar", + + // inHeading: Boolean + // A flag that indicates whether this widget is in a Heading + // widget. + inHeading: false, + + // tag: String + // A name of html tag to create as domNode. + tag: "UL", + + /* internal properties */ + _fixedButtonWidth: 76, + _fixedButtonMargin: 17, + _largeScreenWidth: 500, + + buildRendering: function(){ + this._clsName = this.barType == "segmentedControl" ? "mblTabButton" : "mblTabBarButton"; + this.domNode = this.containerNode = this.srcNodeRef || domConstruct.create(this.tag); + this.domNode.className = this.barType == "segmentedControl" ? "mblTabPanelHeader" : "mblTabBar"; + }, + + startup: function(){ + if(this._started){ return; } + this.inherited(arguments); + this.resize(); + }, + + resize: function(size){ + var i,w; + if(size && size.w){ + domGeometry.setMarginBox(this.domNode, size); + w = size.w; + }else{ + // Calculation of the bar width varies according to its "position" value. + // When the widget is used as a fixed bar, its position would be "absolute". + w = domStyle.get(this.domNode, "position") === "absolute" ? + domGeometry.getContentBox(this.domNode).w : domGeometry.getMarginBox(this.domNode).w; + } + var bw = this._fixedButtonWidth; + var bm = this._fixedButtonMargin; + + var children = this.containerNode.childNodes; + var arr = []; + for(i = 0; i < children.length; i++){ + var c = children[i]; + if(c.nodeType != 1){ continue; } + if(domClass.contains(c, this._clsName)){ + arr.push(c); + } + } + + var margin; + if(this.barType == "segmentedControl"){ + margin = w; + var totalW = 0; // total width of all the buttons + for(i = 0; i < arr.length; i++){ + margin -= domGeometry.getMarginBox(arr[i]).w; + totalW += arr[i].offsetWidth; + } + margin = Math.floor(margin/2); + var parent = this.getParent(); + var inHeading = this.inHeading || parent instanceof Heading; + this.containerNode.style.padding = (inHeading ? 0 : 3) + "px 0px 0px " + (inHeading ? 0 : margin) + "px"; + if(inHeading){ + domStyle.set(this.domNode, { + background: "none", + border: "none", + width: totalW + 2 + "px" + }); + } + domClass.add(this.domNode, "mblTabBar" + (inHeading ? "Head" : "Top")); + }else{ + margin = Math.floor((w - (bw + bm * 2) * arr.length) / 2); + if(w < this._largeScreenWidth || margin < 0){ + // If # of buttons is 4, for example, assign "25%" to each button. + // More precisely, 1%(left margin) + 98%(bar width) + 1%(right margin) + for(i = 0; i < arr.length; i++){ + arr[i].style.width = Math.round(98/arr.length) + "%"; + arr[i].style.margin = "0px"; + } + this.containerNode.style.padding = "0px 0px 0px 1%"; + }else{ + // Fixed width buttons. Mainly for larger screen such as iPad. + for(i = 0; i < arr.length; i++){ + arr[i].style.width = bw + "px"; + arr[i].style.margin = "0 " + bm + "px"; + } + if(arr.length > 0){ + arr[0].style.marginLeft = margin + bm + "px"; + } + this.containerNode.style.padding = "0px"; + } + } + + if(!array.some(this.getChildren(), function(child){ return child.iconNode1; })){ + domClass.add(this.domNode, "mblTabBarNoIcons"); + }else{ + domClass.remove(this.domNode, "mblTabBarNoIcons"); + } + + if(!array.some(this.getChildren(), function(child){ return child.label; })){ + domClass.add(this.domNode, "mblTabBarNoText"); + }else{ + domClass.remove(this.domNode, "mblTabBarNoText"); + } + } + }); + +}); diff --git a/js/dojo/dojox/mobile/TabBarButton.js b/js/dojo/dojox/mobile/TabBarButton.js new file mode 100644 index 0000000..17b8a72 --- /dev/null +++ b/js/dojo/dojox/mobile/TabBarButton.js @@ -0,0 +1,232 @@ +//>>built +define("dojox/mobile/TabBarButton", [ + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-construct", + "dijit/registry", // registry.byNode + "./common", + "./_ItemBase" +], function(declare, lang, win, domClass, domConstruct, registry, common, ItemBase){ + +/*===== + var ItemBase = dojox.mobile._ItemBase; +=====*/ + + // module: + // dojox/mobile/TabBarButton + // summary: + // A button widget that is placed in the TabBar widget. + + return declare("dojox.mobile.TabBarButton", ItemBase,{ + // summary: + // A button widget that is placed in the TabBar widget. + // description: + // TabBarButton is a button that is placed in the TabBar widget. It + // is a subclass of dojox.mobile._ItemBase just like ListItem or + // IconItem. So, unlike Button, it has similar capability as + // ListItem or IconItem, such as icon support, transition, etc. + + // icon1: String + // A path for the unselected (typically dark) icon. If icon is not + // specified, the iconBase parameter of the parent widget is used. + icon1: "", + + // icon2: String + // A path for the selected (typically highlight) icon. If icon is + // not specified, the iconBase parameter of the parent widget or + // icon1 is used. + icon2: "", + + // iconPos1: String + // The position of an aggregated unselected (typically dark) + // icon. IconPos1 is comma separated values like + // top,left,width,height (ex. "0,0,29,29"). If iconPos1 is not + // specified, the iconPos parameter of the parent widget is used. + iconPos1: "", + + // iconPos2: String + // The position of an aggregated selected (typically highlight) + // icon. IconPos2 is comma separated values like + // top,left,width,height (ex. "0,0,29,29"). If iconPos2 is not + // specified, the iconPos parameter of the parent widget or + // iconPos1 is used. + iconPos2: "", + + // selected: Boolean + // If true, the button is in the selected status. + selected: false, + + // transition: String + // A type of animated transition effect. + transition: "none", + + // tag: String + // A name of html tag to create as domNode. + tag: "LI", + + /* internal properties */ + selectOne: true, + + + inheritParams: function(){ + // summary: + // Overrides dojox.mobile._ItemBase.inheritParams(). + if(this.icon && !this.icon1){ this.icon1 = this.icon; } + var parent = this.getParent(); + if(parent){ + if(!this.transition){ this.transition = parent.transition; } + if(this.icon1 && parent.iconBase && + parent.iconBase.charAt(parent.iconBase.length - 1) === '/'){ + this.icon1 = parent.iconBase + this.icon1; + } + if(!this.icon1){ this.icon1 = parent.iconBase; } + if(!this.iconPos1){ this.iconPos1 = parent.iconPos; } + if(this.icon2 && parent.iconBase && + parent.iconBase.charAt(parent.iconBase.length - 1) === '/'){ + this.icon2 = parent.iconBase + this.icon2; + } + if(!this.icon2){ this.icon2 = parent.iconBase || this.icon1; } + if(!this.iconPos2){ this.iconPos2 = parent.iconPos || this.iconPos1; } + } + }, + + buildRendering: function(){ + var a = this.anchorNode = domConstruct.create("A", {className:"mblTabBarButtonAnchor"}); + this.connect(a, "onclick", "onClick"); + + this.box = domConstruct.create("DIV", {className:"mblTabBarButtonTextBox"}, a); + var box = this.box; + var label = ""; + var r = this.srcNodeRef; + if(r){ + for(var i = 0, len = r.childNodes.length; i < len; i++){ + var n = r.firstChild; + if(n.nodeType === 3){ + label += lang.trim(n.nodeValue); + } + box.appendChild(n); + } + } + if(!this.label){ + this.label = label; + } + + this.domNode = this.srcNodeRef || domConstruct.create(this.tag); + this.containerNode = this.domNode; + this.domNode.appendChild(a); + if(this.domNode.className.indexOf("mblDomButton") != -1){ + // deprecated. TODO: remove this code in 1.8 + var domBtn = domConstruct.create("DIV", null, a); + common.createDomButton(this.domNode, null, domBtn); + domClass.add(this.domNode, "mblTabButtonDomButton"); + domClass.add(domBtn, "mblTabButtonDomButtonClass"); + } + if((this.icon1 || this.icon).indexOf("mblDomButton") != -1){ + domClass.add(this.domNode, "mblTabButtonDomButton"); + } + }, + + startup: function(){ + if(this._started){ return; } + this.inheritParams(); + var parent = this.getParent(); + + var _clsName = parent ? parent._clsName : "mblTabBarButton"; + domClass.add(this.domNode, _clsName + (this.selected ? " mblTabButtonSelected" : "")); + + if(parent && parent.barType == "segmentedControl"){ + // proper className may not be set when created dynamically + domClass.remove(this.domNode, "mblTabBarButton"); + domClass.add(this.domNode, parent._clsName); + this.box.className = ""; + } + this.set({icon1:this.icon1, icon2:this.icon2}); + this.inherited(arguments); + }, + + select: function(){ + // summary: + // Makes this widget in the selected state. + if(arguments[0]){ // deselect + this.selected = false; + domClass.remove(this.domNode, "mblTabButtonSelected"); + }else{ // select + this.selected = true; + domClass.add(this.domNode, "mblTabButtonSelected"); + for(var i = 0, c = this.domNode.parentNode.childNodes; i < c.length; i++){ + if(c[i].nodeType != 1){ continue; } + var w = registry.byNode(c[i]); // sibling widget + if(w && w != this){ + w.deselect(); + } + } + } + if(this.iconNode1){ + this.iconNode1.style.visibility = this.selected ? "hidden" : ""; + } + if(this.iconNode2){ + this.iconNode2.style.visibility = this.selected ? "" : "hidden"; + } + }, + + deselect: function(){ + // summary: + // Makes this widget in the deselected state. + this.select(true); + }, + + onClick: function(e){ + this.defaultClickAction(); + }, + + _setIcon: function(icon, pos, num, sel){ + var i = "icon" + num, n = "iconNode" + num, p = "iconPos" + num; + if(icon){ this[i] = icon; } + if(pos){ + if(this[p] === pos){ return; } + this[p] = pos; + } + if(icon && icon !== "none"){ + if(!this.iconDivNode){ + this.iconDivNode = domConstruct.create("DIV", {className:"mblTabBarButtonDiv"}, this.anchorNode, "first"); + } + if(!this[n]){ + this[n] = domConstruct.create("div", {className:"mblTabBarButtonIcon"}, this.iconDivNode); + }else{ + domConstruct.empty(this[n]); + } + common.createIcon(icon, this[p], null, this.alt, this[n]); + if(this[p]){ + domClass.add(this[n].firstChild, "mblTabBarButtonSpriteIcon"); + } + domClass.remove(this.iconDivNode, "mblTabBarButtonNoIcon"); + this[n].style.visibility = sel ? "hidden" : ""; + }else if(this.iconDivNode){ + domClass.add(this.iconDivNode, "mblTabBarButtonNoIcon"); + } + }, + + _setIcon1Attr: function(icon){ + this._setIcon(icon, null, 1, this.selected); + }, + + _setIcon2Attr: function(icon){ + this._setIcon(icon, null, 2, !this.selected); + }, + + _setIconPos1Attr: function(pos){ + this._setIcon(null, pos, 1, this.selected); + }, + + _setIconPos2Attr: function(pos){ + this._setIcon(null, pos, 2, !this.selected); + }, + + _setLabelAttr: function(/*String*/text){ + this.label = text; + this.box.innerHTML = this._cv ? this._cv(text) : text; + } + }); +}); diff --git a/js/dojo/dojox/mobile/TextArea.js b/js/dojo/dojox/mobile/TextArea.js new file mode 100644 index 0000000..4220fb9 --- /dev/null +++ b/js/dojo/dojox/mobile/TextArea.js @@ -0,0 +1,40 @@ +//>>built +define("dojox/mobile/TextArea", [ + "dojo/_base/declare", + "dojo/dom-construct", + "./TextBox" +], function(declare, domConstruct, TextBox){ + + /*===== + TextBox = dojox.mobile.TextBox; + =====*/ + return declare("dojox.mobile.TextArea",TextBox, { + // summary: + // Non-templated TEXTAREA widget. + // + // description: + // A textarea widget that wraps an HTML TEXTAREA element. + // Takes all the parameters (name, value, etc.) that a vanilla textarea takes. + // + // example: + // | <textarea dojoType="dojox.mobile.TextArea">...</textarea> + + baseClass: "mblTextArea", + + 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(){ + if(!this.srcNodeRef){ + this.srcNodeRef = domConstruct.create("textarea", {}); + } + this.inherited(arguments); + } + }); +}); diff --git a/js/dojo/dojox/mobile/TextBox.js b/js/dojo/dojox/mobile/TextBox.js new file mode 100644 index 0000000..532621f --- /dev/null +++ b/js/dojo/dojox/mobile/TextBox.js @@ -0,0 +1,42 @@ +//>>built +define("dojox/mobile/TextBox", [ + "dojo/_base/declare", + "dojo/dom-construct", + "dijit/_WidgetBase", + "dijit/form/_FormValueMixin", + "dijit/form/_TextBoxMixin" +], function(declare, domConstruct, WidgetBase, FormValueMixin, TextBoxMixin){ + + /*===== + WidgetBase = dijit._WidgetBase; + FormValueMixin = dijit.form._FormValueMixin; + TextBoxMixin = dijit.form._TextBoxMixin; + =====*/ + return declare("dojox.mobile.TextBox",[WidgetBase, FormValueMixin, TextBoxMixin],{ + // summary: + // A non-templated base class for textbox form inputs + + baseClass: "mblTextBox", + + // Override automatic assigning type --> node, it causes exception on IE8. + // Instead, type must be specified as this.type when the node is created, as part of the original DOM + _setTypeAttr: null, + + // Map widget attributes to DOMNode attributes. + _setPlaceHolderAttr: "textbox", + + buildRendering: function(){ + if(!this.srcNodeRef){ + this.srcNodeRef = domConstruct.create("input", {"type":this.type}); + } + this.inherited(arguments); + this.textbox = this.focusNode = this.domNode; + }, + + postCreate: function(){ + this.inherited(arguments); + this.connect(this.textbox, "onfocus", "_onFocus"); + this.connect(this.textbox, "onblur", "_onBlur"); + } + }); +}); diff --git a/js/dojo/dojox/mobile/ToggleButton.js b/js/dojo/dojox/mobile/ToggleButton.js new file mode 100644 index 0000000..c12dcc5 --- /dev/null +++ b/js/dojo/dojox/mobile/ToggleButton.js @@ -0,0 +1,26 @@ +//>>built +define("dojox/mobile/ToggleButton", [ + "dojo/_base/declare", + "dojo/dom-class", + "dijit/form/_ToggleButtonMixin", + "./Button" +], function(declare, domClass, ToggleButtonMixin, Button){ + + /*===== + Button = dojox.mobile.Button; + ToggleButtonMixin = dijit.form._ToggleButtonMixin; + =====*/ + return declare("dojox.mobile.ToggleButton", [Button, ToggleButtonMixin], { + // summary: + // A non-templated button widget that can be in two states (checked or not). + // Can be base class for things like tabs or checkbox or radio buttons + + baseClass: "mblToggleButton", + + _setCheckedAttr: function(){ + this.inherited(arguments); + var newStateClasses = (this.baseClass+' '+this["class"]).replace(/(\S+)\s*/g, "$1Checked ").split(" "); + domClass[this.checked ? "add" : "remove"](this.focusNode || this.domNode, newStateClasses); + } + }); +}); diff --git a/js/dojo/dojox/mobile/ToolBarButton.js b/js/dojo/dojox/mobile/ToolBarButton.js new file mode 100644 index 0000000..80a84b7 --- /dev/null +++ b/js/dojo/dojox/mobile/ToolBarButton.js @@ -0,0 +1,108 @@ +//>>built +define("dojox/mobile/ToolBarButton", [ + "dojo/_base/declare", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-style", + "./common", + "./_ItemBase" +], function(declare, win, domClass, domConstruct, domStyle, common, ItemBase){ +/*===== + var ItemBase = dojox.mobile._ItemBase; +=====*/ + + // module: + // dojox/mobile/ToolBarButton + // summary: + // A button widget that is placed in the Heading widget. + + return declare("dojox.mobile.ToolBarButton", ItemBase, { + // summary: + // A button widget that is placed in the Heading widget. + // description: + // ToolBarButton is a button that is placed in the Heading + // widget. It is a subclass of dojox.mobile._ItemBase just like + // ListItem or IconItem. So, unlike Button, it has basically the + // same capability as ListItem or IconItem, such as icon support, + // transition, etc. + + // selected: Boolean + // If true, the button is in the selected status. + selected: false, + + // btnClass: String + // Deprecated. + btnClass: "", + + /* internal properties */ + _defaultColor: "mblColorDefault", + _selColor: "mblColorDefaultSel", + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement("div"); + this.inheritParams(); + domClass.add(this.domNode, "mblToolBarButton mblArrowButtonText"); + var color; + if(this.selected){ + color = this._selColor; + }else if(this.domNode.className.indexOf("mblColor") == -1){ + color = this._defaultColor; + } + domClass.add(this.domNode, color); + + if(!this.label){ + this.label = this.domNode.innerHTML; + } + + if(this.icon && this.icon != "none"){ + this.iconNode = domConstruct.create("div", {className:"mblToolBarButtonIcon"}, this.domNode); + common.createIcon(this.icon, this.iconPos, null, this.alt, this.iconNode); + if(this.iconPos){ + domClass.add(this.iconNode.firstChild, "mblToolBarButtonSpriteIcon"); + } + }else{ + if(common.createDomButton(this.domNode)){ + domClass.add(this.domNode, "mblToolBarButtonDomButton"); + }else{ + domClass.add(this.domNode, "mblToolBarButtonText"); + } + } + this.connect(this.domNode, "onclick", "onClick"); + }, + + select: function(){ + // summary: + // Makes this widget in the selected state. + domClass.toggle(this.domNode, this._selColor, !arguments[0]); + this.selected = !arguments[0]; + }, + + deselect: function(){ + // summary: + // Makes this widget in the deselected state. + this.select(true); + }, + + onClick: function(e){ + this.setTransitionPos(e); + this.defaultClickAction(); + }, + + _setBtnClassAttr: function(/*String*/btnClass){ + var node = this.domNode; + if(node.className.match(/(mblDomButton\w+)/)){ + domClass.remove(node, RegExp.$1); + } + domClass.add(node, btnClass); + if(common.createDomButton(this.domNode)){ + domClass.add(this.domNode, "mblToolBarButtonDomButton"); + } + }, + + _setLabelAttr: function(/*String*/text){ + this.label = text; + this.domNode.innerHTML = this._cv ? this._cv(text) : text; + } + }); +}); diff --git a/js/dojo/dojox/mobile/Tooltip.js b/js/dojo/dojox/mobile/Tooltip.js new file mode 100644 index 0000000..7296fa5 --- /dev/null +++ b/js/dojo/dojox/mobile/Tooltip.js @@ -0,0 +1,100 @@ +//>>built +define("dojox/mobile/Tooltip", [ + "dojo/_base/array", // array.forEach + "dijit/registry", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-geometry", + "dojo/dom-style", + "dijit/place", + "dijit/_WidgetBase" +], function(array, registry, declare, lang, domClass, domConstruct, domGeometry, domStyle, place, WidgetBase){ + + /*===== + WidgetBase = dijit._WidgetBase; + =====*/ + return declare("dojox.mobile.Tooltip", WidgetBase, { + // summary: + // A non-templated popup bubble widget + // + + baseClass: "mblTooltip mblTooltipHidden", + + buildRendering: function(){ + // create the helper nodes here in case the user overwrote domNode.innerHTML + this.inherited(arguments); + this.anchor = domConstruct.create("div", {"class":"mblTooltipAnchor"}, this.domNode, "first"); + this.arrow = domConstruct.create("div", {"class":"mblTooltipArrow"}, this.anchor); + this.innerArrow = domConstruct.create("div", {"class":"mblTooltipInnerArrow"}, this.anchor); + }, + + show: function(/*DomNode*/ aroundNode, positions){ + // summary: + // Pop up the tooltip and point to aroundNode using the best position + // positions: + // Ordered list of positions to try matching up. + // * before: places drop down before the aroundNode + // * after: places drop down after the aroundNode + // * above-centered: drop down goes above aroundNode + // * below-centered: drop down goes below aroundNode + var domNode = this.domNode; + var connectorClasses = { + "MRM": "mblTooltipAfter", + "MLM": "mblTooltipBefore", + "BMT": "mblTooltipBelow", + "TMB": "mblTooltipAbove", + "BLT": "mblTooltipBelow", + "TLB": "mblTooltipAbove", + "BRT": "mblTooltipBelow", + "TRB": "mblTooltipAbove", + "TLT": "mblTooltipBefore", + "TRT": "mblTooltipAfter", + "BRB": "mblTooltipAfter", + "BLB": "mblTooltipBefore" + }; + domClass.remove(domNode, ["mblTooltipAfter","mblTooltipBefore","mblTooltipBelow","mblTooltipAbove"]); + array.forEach(registry.findWidgets(domNode), function(widget){ + if(widget.height == "auto" && typeof widget.resize == "function"){ + if(!widget.fixedFooterHeight){ + widget.fixedFooterHeight = domGeometry.getPadBorderExtents(domNode).b; + } + widget.resize(); + } + }); + var best = place.around(domNode, aroundNode, positions || ['below-centered', 'above-centered', 'after', 'before'], this.isLeftToRight()); + var connectorClass = connectorClasses[best.corner + best.aroundCorner.charAt(0)] || ''; + domClass.add(domNode, connectorClass); + var pos = domGeometry.position(aroundNode, true); + domStyle.set(this.anchor, (connectorClass == "mblTooltipAbove" || connectorClass == "mblTooltipBelow") + ? { top: "", left: Math.max(0, pos.x - best.x + (pos.w >> 1) - (this.arrow.offsetWidth >> 1)) + "px" } + : { left: "", top: Math.max(0, pos.y - best.y + (pos.h >> 1) - (this.arrow.offsetHeight >> 1)) + "px" } + ); + domClass.replace(domNode, "mblTooltipVisible", "mblTooltipHidden"); + this.resize = lang.hitch(this, "show", aroundNode, positions); // orientation changes + return best; + }, + + hide: function(){ + // summary: + // Pop down the tooltip + this.resize = undefined; + domClass.replace(this.domNode, "mblTooltipHidden", "mblTooltipVisible"); + }, + + onBlur: function(/*Event*/e){ + return true; // touching outside the overlay area does call hide() by default + }, + + destroy: function(){ + if(this.anchor){ + this.anchor.removeChild(this.innerArrow); + this.anchor.removeChild(this.arrow); + this.domNode.removeChild(this.anchor); + this.anchor = this.arrow = this.innerArrow = undefined; + } + this.inherited(arguments); + } + }); +}); diff --git a/js/dojo/dojox/mobile/TransitionEvent.js b/js/dojo/dojox/mobile/TransitionEvent.js new file mode 100644 index 0000000..b2667bf --- /dev/null +++ b/js/dojo/dojox/mobile/TransitionEvent.js @@ -0,0 +1,36 @@ +//>>built +define("dojox/mobile/TransitionEvent", [ + "dojo/_base/declare", + "dojo/_base/Deferred", + "dojo/_base/lang", + "dojo/on", + "./transition" +], function(declare, Deferred, lang, on, transitDeferred){ + + return declare("dojox.mobile.TransitionEvent", null, { + constructor: function(target, transitionOptions, triggerEvent){ + this.transitionOptions=transitionOptions; + this.target = target; + this.triggerEvent=triggerEvent||null; + }, + + dispatch: function(){ + var opts = {bubbles:true, cancelable:true, detail: this.transitionOptions, triggerEvent: this.triggerEvent}; + //console.log("Target: ", this.target, " opts: ", opts); + + var evt = on.emit(this.target,"startTransition", opts); + //console.log('evt: ', evt); + if(evt){ + Deferred.when(transitDeferred, lang.hitch(this, function(transition){ + Deferred.when(transition.call(this, evt), lang.hitch(this, function(results){ + this.endTransition(results); + })); + })); + } + }, + + endTransition: function(results){ + on.emit(this.target, "endTransition" , {detail: results.transitionOptions}); + } + }); +}); diff --git a/js/dojo/dojox/mobile/View.js b/js/dojo/dojox/mobile/View.js new file mode 100644 index 0000000..4230200 --- /dev/null +++ b/js/dojo/dojox/mobile/View.js @@ -0,0 +1,513 @@ +//>>built +define("dojox/mobile/View", [ + "dojo/_base/kernel", // to test dojo.hash + "dojo/_base/array", + "dojo/_base/config", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/sniff", + "dojo/_base/window", + "dojo/_base/Deferred", + "dojo/dom", + "dojo/dom-class", + "dojo/dom-geometry", + "dojo/dom-style", +// "dojo/hash", // optionally prereq'ed + "dijit/registry", // registry.byNode + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase", + "./ViewController", // to load ViewController for you (no direct references) + "./transition" +], function(dojo, array, config, connect, declare, lang, has, win, Deferred, dom, domClass, domGeometry, domStyle, registry, Contained, Container, WidgetBase, ViewController, transitDeferred){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; + var ViewController = dojox.mobile.ViewController; +=====*/ + + // module: + // dojox/mobile/View + // summary: + // A widget that represents a view that occupies the full screen + + var dm = lang.getObject("dojox.mobile", true); + + return declare("dojox.mobile.View", [WidgetBase, Container, Contained], { + // summary: + // A widget that represents a view that occupies the full screen + // description: + // View acts as a container for any HTML and/or widgets. An entire + // HTML page can have multiple View widgets and the user can + // navigate through the views back and forth without page + // transitions. + + // selected: Boolean + // If true, the view is displayed at startup time. + selected: false, + + // keepScrollPos: Boolean + // If true, the scroll position is kept between views. + keepScrollPos: true, + + constructor: function(params, node){ + if(node){ + dom.byId(node).style.visibility = "hidden"; + } + this._aw = has("android") >= 2.2 && has("android") < 3; // flag for android animation workaround + }, + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement("DIV"); + this.domNode.className = "mblView"; + this.connect(this.domNode, "webkitAnimationEnd", "onAnimationEnd"); + this.connect(this.domNode, "webkitAnimationStart", "onAnimationStart"); + if(!config['mblCSS3Transition']){ + this.connect(this.domNode, "webkitTransitionEnd", "onAnimationEnd"); + } + var id = location.href.match(/#(\w+)([^\w=]|$)/) ? RegExp.$1 : null; + + this._visible = this.selected && !id || this.id == id; + + if(this.selected){ + dm._defaultView = this; + } + }, + + startup: function(){ + if(this._started){ return; } + var siblings = []; + var children = this.domNode.parentNode.childNodes; + var visible = false; + // check if a visible view exists + for(var i = 0; i < children.length; i++){ + var c = children[i]; + if(c.nodeType === 1 && domClass.contains(c, "mblView")){ + siblings.push(c); + visible = visible || registry.byNode(c)._visible; + } + } + var _visible = this._visible; + // if no visible view exists, make the first view visible + if(siblings.length === 1 || (!visible && siblings[0] === this.domNode)){ + _visible = true; + } + var _this = this; + setTimeout(function(){ // necessary to render the view correctly + if(!_visible){ + _this.domNode.style.display = "none"; + }else{ + dm.currentView = _this; //TODO:1.8 reconsider this. currentView may not have a currently showing view when views are nested. + _this.onStartView(); + connect.publish("/dojox/mobile/startView", [_this]); + } + if(_this.domNode.style.visibility != "visible"){ // this check is to avoid screen flickers + _this.domNode.style.visibility = "visible"; + } + var parent = _this.getParent && _this.getParent(); + if(!parent || !parent.resize){ // top level widget + _this.resize(); + } + }, has("ie") ? 100 : 0); // give IE a little time to complete drawing + this.inherited(arguments); + }, + + resize: function(){ + // summary: + // Calls resize() of each child widget. + array.forEach(this.getChildren(), function(child){ + if(child.resize){ child.resize(); } + }); + }, + + onStartView: function(){ + // summary: + // Stub function to connect to from your application. + // description: + // Called only when this view is shown at startup time. + }, + + onBeforeTransitionIn: function(moveTo, dir, transition, context, method){ + // summary: + // Stub function to connect to from your application. + // description: + // Called before the arriving transition occurs. + }, + + onAfterTransitionIn: function(moveTo, dir, transition, context, method){ + // summary: + // Stub function to connect to from your application. + // description: + // Called after the arriving transition occurs. + }, + + onBeforeTransitionOut: function(moveTo, dir, transition, context, method){ + // summary: + // Stub function to connect to from your application. + // description: + // Called before the leaving transition occurs. + }, + + onAfterTransitionOut: function(moveTo, dir, transition, context, method){ + // summary: + // Stub function to connect to from your application. + // description: + // Called after the leaving transition occurs. + }, + + _saveState: function(moveTo, dir, transition, context, method){ + this._context = context; + this._method = method; + if(transition == "none"){ + transition = null; + } + this._moveTo = moveTo; + this._dir = dir; + this._transition = transition; + this._arguments = lang._toArray(arguments); + this._args = []; + if(context || method){ + for(var i = 5; i < arguments.length; i++){ + this._args.push(arguments[i]); + } + } + }, + + _fixViewState: function(/*DomNode*/toNode){ + // summary: + // Sanity check for view transition states. + // description: + // Sometimes uninitialization of Views fails after making view transition, + // and that results in failure of subsequent view transitions. + // This function does the uninitialization for all the sibling views. + var nodes = this.domNode.parentNode.childNodes; + for(var i = 0; i < nodes.length; i++){ + var n = nodes[i]; + if(n.nodeType === 1 && domClass.contains(n, "mblView")){ + n.className = "mblView"; //TODO: Should remove classes one by one. This would clear user defined classes or even mblScrollableView. + } + } + toNode.className = "mblView"; // just in case toNode is a sibling of an ancestor. + }, + + convertToId: function(moveTo){ + if(typeof(moveTo) == "string"){ + // removes a leading hash mark (#) and params if exists + // ex. "#bar&myParam=0003" -> "bar" + moveTo.match(/^#?([^&?]+)/); + return RegExp.$1; + } + return moveTo; + }, + + performTransition: function(/*String*/moveTo, /*Number*/dir, /*String*/transition, + /*Object|null*/context, /*String|Function*/method /*optional args*/){ + // summary: + // Function to perform the various types of view transitions, such as fade, slide, and flip. + // moveTo: String + // The id of the transition destination view which resides in + // the current page. + // If the value has a hash sign ('#') before the id + // (e.g. #view1) and the dojo.hash module is loaded by the user + // application, the view transition updates the hash in the + // browser URL so that the user can bookmark the destination + // view. In this case, the user can also use the browser's + // back/forward button to navigate through the views in the + // browser history. + // If null, transitions to a blank view. + // If '#', returns immediately without transition. + // dir: Number + // The transition direction. If 1, transition forward. If -1, transition backward. + // For example, the slide transition slides the view from right to left when dir == 1, + // and from left to right when dir == -1. + // transition: String + // A type of animated transition effect. You can choose from + // the standard transition types, "slide", "fade", "flip", or + // from the extended transition types, "cover", "coverv", + // "dissolve", "reveal", "revealv", "scaleIn", + // "scaleOut", "slidev", "swirl", "zoomIn", "zoomOut". If + // "none" is specified, transition occurs immediately without + // animation. + // context: Object + // The object that the callback function will receive as "this". + // method: String|Function + // A callback function that is called when the transition has been finished. + // A function reference, or name of a function in context. + // tags: + // public + // + // example: + // Transition backward to a view whose id is "foo" with the slide animation. + // | performTransition("foo", -1, "slide"); + // + // example: + // Transition forward to a blank view, and then open another page. + // | performTransition(null, 1, "slide", null, function(){location.href = href;}); + if(moveTo === "#"){ return; } + if(dojo.hash){ + if(typeof(moveTo) == "string" && moveTo.charAt(0) == '#' && !dm._params){ + dm._params = []; + for(var i = 0; i < arguments.length; i++){ + dm._params.push(arguments[i]); + } + dojo.hash(moveTo); + return; + } + } + this._saveState.apply(this, arguments); + var toNode; + if(moveTo){ + toNode = this.convertToId(moveTo); + }else{ + if(!this._dummyNode){ + this._dummyNode = win.doc.createElement("DIV"); + win.body().appendChild(this._dummyNode); + } + toNode = this._dummyNode; + } + var fromNode = this.domNode; + var fromTop = fromNode.offsetTop; + toNode = this.toNode = dom.byId(toNode); + if(!toNode){ console.log("dojox.mobile.View#performTransition: destination view not found: "+moveTo); return; } + toNode.style.visibility = this._aw ? "visible" : "hidden"; + toNode.style.display = ""; + this._fixViewState(toNode); + var toWidget = registry.byNode(toNode); + if(toWidget){ + // Now that the target view became visible, it's time to run resize() + if(config["mblAlwaysResizeOnTransition"] || !toWidget._resized){ + dm.resizeAll(null, toWidget); + toWidget._resized = true; + } + + if(transition && transition != "none"){ + // Temporarily add padding to align with the fromNode while transition + toWidget.containerNode.style.paddingTop = fromTop + "px"; + } + + toWidget.movedFrom = fromNode.id; + } + + this.onBeforeTransitionOut.apply(this, arguments); + connect.publish("/dojox/mobile/beforeTransitionOut", [this].concat(lang._toArray(arguments))); + if(toWidget){ + // perform view transition keeping the scroll position + if(this.keepScrollPos && !this.getParent()){ + var scrollTop = win.body().scrollTop || win.doc.documentElement.scrollTop || win.global.pageYOffset || 0; + fromNode._scrollTop = scrollTop; + var toTop = (dir == 1) ? 0 : (toNode._scrollTop || 0); + toNode.style.top = "0px"; + if(scrollTop > 1 || toTop !== 0){ + fromNode.style.top = toTop - scrollTop + "px"; + if(config["mblHideAddressBar"] !== false){ + setTimeout(function(){ // iPhone needs setTimeout + win.global.scrollTo(0, (toTop || 1)); + }, 0); + } + } + }else{ + toNode.style.top = "0px"; + } + toWidget.onBeforeTransitionIn.apply(toWidget, arguments); + connect.publish("/dojox/mobile/beforeTransitionIn", [toWidget].concat(lang._toArray(arguments))); + } + if(!this._aw){ + toNode.style.display = "none"; + toNode.style.visibility = "visible"; + } + + if(dm._iw && dm.scrollable){ // Workaround for iPhone flicker issue (only when scrollable.js is loaded) + var ss = dm.getScreenSize(); + // Show cover behind the view. + // cover's z-index is set to -10000, lower than z-index value specified in transition css. + win.body().appendChild(dm._iwBgCover); + domStyle.set(dm._iwBgCover, { + position: "absolute", + top: "0px", + left: "0px", + height: (ss.h + 1) + "px", // "+1" means the height of scrollTo(0,1) + width: ss.w + "px", + backgroundColor: domStyle.get(win.body(), "background-color"), + zIndex: -10000, + display: "" + }); + // Show toNode behind the cover. + domStyle.set(toNode, { + position: "absolute", + zIndex: -10001, + visibility: "visible", + display: "" + }); + // setTimeout seems to be necessary to avoid flicker. + // Also the duration of setTimeout should be long enough to avoid flicker. + // 0 is not effective. 50 sometimes causes flicker. + setTimeout(lang.hitch(this, function(){ + this._doTransition(fromNode, toNode, transition, dir); + }), 80); + }else{ + this._doTransition(fromNode, toNode, transition, dir); + } + }, + _toCls: function(s){ + // convert from transition name to corresponding class name + // ex. "slide" -> "mblSlide" + return "mbl"+s.charAt(0).toUpperCase() + s.substring(1); + }, + + _doTransition: function(fromNode, toNode, transition, dir){ + var rev = (dir == -1) ? " mblReverse" : ""; + if(dm._iw && dm.scrollable){ // Workaround for iPhone flicker issue (only when scrollable.js is loaded) + // Show toNode after flicker ends + domStyle.set(toNode, { + position: "", + zIndex: "" + }); + // Remove cover + win.body().removeChild(dm._iwBgCover); + }else if(!this._aw){ + toNode.style.display = ""; + } + if(!transition || transition == "none"){ + this.domNode.style.display = "none"; + this.invokeCallback(); + }else if(config['mblCSS3Transition']){ + //get dojox/css3/transit first + Deferred.when(transitDeferred, lang.hitch(this, function(transit){ + //follow the style of .mblView.mblIn in View.css + //need to set the toNode to absolute position + var toPosition = domStyle.get(toNode, "position"); + domStyle.set(toNode, "position", "absolute"); + Deferred.when(transit(fromNode, toNode, {transition: transition, reverse: (dir===-1)?true:false}),lang.hitch(this,function(){ + domStyle.set(toNode, "position", toPosition); + this.invokeCallback(); + })); + })); + }else{ + var s = this._toCls(transition); + domClass.add(fromNode, s + " mblOut" + rev); + domClass.add(toNode, s + " mblIn" + rev); + setTimeout(function(){ + domClass.add(fromNode, "mblTransition"); + domClass.add(toNode, "mblTransition"); + }, 100); + // set transform origin + var fromOrigin = "50% 50%"; + var toOrigin = "50% 50%"; + var scrollTop, posX, posY; + if(transition.indexOf("swirl") != -1 || transition.indexOf("zoom") != -1){ + if(this.keepScrollPos && !this.getParent()){ + scrollTop = win.body().scrollTop || win.doc.documentElement.scrollTop || win.global.pageYOffset || 0; + }else{ + scrollTop = -domGeometry.position(fromNode, true).y; + } + posY = win.global.innerHeight / 2 + scrollTop; + fromOrigin = "50% " + posY + "px"; + toOrigin = "50% " + posY + "px"; + }else if(transition.indexOf("scale") != -1){ + var viewPos = domGeometry.position(fromNode, true); + posX = ((this.clickedPosX !== undefined) ? this.clickedPosX : win.global.innerWidth / 2) - viewPos.x; + if(this.keepScrollPos && !this.getParent()){ + scrollTop = win.body().scrollTop || win.doc.documentElement.scrollTop || win.global.pageYOffset || 0; + }else{ + scrollTop = -viewPos.y; + } + posY = ((this.clickedPosY !== undefined) ? this.clickedPosY : win.global.innerHeight / 2) + scrollTop; + fromOrigin = posX + "px " + posY + "px"; + toOrigin = posX + "px " + posY + "px"; + } + domStyle.set(fromNode, {webkitTransformOrigin:fromOrigin}); + domStyle.set(toNode, {webkitTransformOrigin:toOrigin}); + } + dm.currentView = registry.byNode(toNode); + }, + + onAnimationStart: function(e){ + }, + + + onAnimationEnd: function(e){ + var name = e.animationName || e.target.className; + if(name.indexOf("Out") === -1 && + name.indexOf("In") === -1 && + name.indexOf("Shrink") === -1){ return; } + var isOut = false; + if(domClass.contains(this.domNode, "mblOut")){ + isOut = true; + this.domNode.style.display = "none"; + domClass.remove(this.domNode, [this._toCls(this._transition), "mblIn", "mblOut", "mblReverse"]); + }else{ + // Reset the temporary padding + this.containerNode.style.paddingTop = ""; + } + domStyle.set(this.domNode, {webkitTransformOrigin:""}); + if(name.indexOf("Shrink") !== -1){ + var li = e.target; + li.style.display = "none"; + domClass.remove(li, "mblCloseContent"); + } + if(isOut){ + this.invokeCallback(); + } + // this.domNode may be destroyed as a result of invoking the callback, + // so check for that before accessing it. + this.domNode && (this.domNode.className = "mblView"); + + // clear the clicked position + this.clickedPosX = this.clickedPosY = undefined; + }, + + invokeCallback: function(){ + this.onAfterTransitionOut.apply(this, this._arguments); + connect.publish("/dojox/mobile/afterTransitionOut", [this].concat(this._arguments)); + var toWidget = registry.byNode(this.toNode); + if(toWidget){ + toWidget.onAfterTransitionIn.apply(toWidget, this._arguments); + connect.publish("/dojox/mobile/afterTransitionIn", [toWidget].concat(this._arguments)); + toWidget.movedFrom = undefined; + } + + var c = this._context, m = this._method; + if(!c && !m){ return; } + if(!m){ + m = c; + c = null; + } + c = c || win.global; + if(typeof(m) == "string"){ + c[m].apply(c, this._args); + }else{ + m.apply(c, this._args); + } + }, + + getShowingView: function(){ + // summary: + // Find the currently showing view from my sibling views. + // description: + // Note that dojox.mobile.currentView is the last shown view. + // If the page consists of a splitter, there are multiple showing views. + var nodes = this.domNode.parentNode.childNodes; + for(var i = 0; i < nodes.length; i++){ + var n = nodes[i]; + if(n.nodeType === 1 && domClass.contains(n, "mblView") && domStyle.get(n, "display") !== "none"){ + return registry.byNode(n); + } + } + return null; + }, + + show: function(){ + // summary: + // Shows this view without a transition animation. + var view = this.getShowingView(); + if(view){ + view.domNode.style.display = "none"; // from-style + } + this.domNode.style.display = ""; // to-style + dm.currentView = this; + } + }); +}); diff --git a/js/dojo/dojox/mobile/ViewController.js b/js/dojo/dojox/mobile/ViewController.js new file mode 100644 index 0000000..c9f2c42 --- /dev/null +++ b/js/dojo/dojox/mobile/ViewController.js @@ -0,0 +1,264 @@ +//>>built +define("dojox/mobile/ViewController", [ + "dojo/_base/kernel", + "dojo/_base/array", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom", + "dojo/dom-class", + "dojo/dom-construct", +// "dojo/hash", // optionally prereq'ed + "dojo/on", + "dojo/ready", + "dijit/registry", // registry.byId + "./ProgressIndicator", + "./TransitionEvent" +], function(dojo, array, connect, declare, lang, win, dom, domClass, domConstruct, on, ready, registry, ProgressIndicator, TransitionEvent){ + + // module: + // dojox/mobile/ViewController + // summary: + // A singleton class that controlls view transition. + + var dm = lang.getObject("dojox.mobile", true); + + var Controller = declare("dojox.mobile.ViewController", null, { + // summary: + // A singleton class that controlls view transition. + // description: + // This class listens to the "startTransition" events and performs + // view transitions. If the transition destination is an external + // view specified with the url parameter, retrieves the view + // content and parses it to create a new target view. + + constructor: function(){ + this.viewMap={}; + this.currentView=null; + this.defaultView=null; + ready(lang.hitch(this, function(){ + on(win.body(), "startTransition", lang.hitch(this, "onStartTransition")); + })); + }, + + findCurrentView: function(moveTo,src){ + // summary: + // Searches for the currently showing view. + if(moveTo){ + var w = registry.byId(moveTo); + if(w && w.getShowingView){ return w.getShowingView(); } + } + if(dm.currentView){ + return dm.currentView; //TODO:1.8 may not return an expected result especially when views are nested + } + //TODO:1.8 probably never reaches here + w = src; + while(true){ + w = w.getParent(); + if(!w){ return null; } + if(domClass.contains(w.domNode, "mblView")){ break; } + } + return w; + }, + + onStartTransition: function(evt){ + // summary: + // A handler that performs view transition. + + evt.preventDefault(); + if(!evt.detail || (evt.detail && !evt.detail.moveTo && !evt.detail.href && !evt.detail.url && !evt.detail.scene)){ return; } + var w = this.findCurrentView(evt.detail.moveTo, (evt.target && evt.target.id)?registry.byId(evt.target.id):registry.byId(evt.target)); // the current view widget + if(!w || (evt.detail && evt.detail.moveTo && w === registry.byId(evt.detail.moveTo))){ return; } + if(evt.detail.href){ + var t = registry.byId(evt.target.id).hrefTarget; + if(t){ + dm.openWindow(evt.detail.href, t); + }else{ + w.performTransition(null, evt.detail.transitionDir, evt.detail.transition, evt.target, function(){location.href = evt.detail.href;}); + } + return; + } else if(evt.detail.scene){ + connect.publish("/dojox/mobile/app/pushScene", [evt.detail.scene]); + return; + } + var moveTo = evt.detail.moveTo; + if(evt.detail.url){ + var id; + if(dm._viewMap && dm._viewMap[evt.detail.url]){ + // external view has already been loaded + id = dm._viewMap[evt.detail.url]; + }else{ + // get the specified external view and append it to the <body> + var text = this._text; + if(!text){ + if(registry.byId(evt.target.id).sync){ + // We do not add explicit dependency on dojo/_base/xhr to this module + // to be able to create a build that does not contain dojo/_base/xhr. + // User applications that do sync loading here need to explicitly + // require dojo/_base/xhr up front. + dojo.xhrGet({url:evt.detail.url, sync:true, load:function(result){ + text = lang.trim(result); + }}); + }else{ + var s = "dojo/_base/xhr"; // assign to a variable so as not to be picked up by the build tool + require([s], lang.hitch(this, function(xhr){ + var prog = ProgressIndicator.getInstance(); + win.body().appendChild(prog.domNode); + prog.start(); + var obj = xhr.get({ + url: evt.detail.url, + handleAs: "text" + }); + obj.addCallback(lang.hitch(this, function(response, ioArgs){ + prog.stop(); + if(response){ + this._text = response; + new TransitionEvent(evt.target, { + transition: evt.detail.transition, + transitionDir: evt.detail.transitionDir, + moveTo: moveTo, + href: evt.detail.href, + url: evt.detail.url, + scene: evt.detail.scene}, + evt.detail) + .dispatch(); + } + })); + obj.addErrback(function(error){ + prog.stop(); + console.log("Failed to load "+evt.detail.url+"\n"+(error.description||error)); + }); + })); + return; + } + } + this._text = null; + id = this._parse(text, registry.byId(evt.target.id).urlTarget); + if(!dm._viewMap){ + dm._viewMap = []; + } + dm._viewMap[evt.detail.url] = id; + } + moveTo = id; + w = this.findCurrentView(moveTo,registry.byId(evt.target.id)) || w; // the current view widget + } + w.performTransition(moveTo, evt.detail.transitionDir, evt.detail.transition, null, null); + }, + + _parse: function(text, id){ + // summary: + // Parses the given view content. + // description: + // If the content is html fragment, constructs dom tree with it + // and runs the parser. If the content is json data, passes it + // to _instantiate(). + var container, view, i, j, len; + var currentView = this.findCurrentView(); + var target = registry.byId(id) && registry.byId(id).containerNode + || dom.byId(id) + || currentView && currentView.domNode.parentNode + || win.body(); + // if a fixed bottom bar exists, a new view should be placed before it. + var refNode = null; + for(j = target.childNodes.length - 1; j >= 0; j--){ + var c = target.childNodes[j]; + if(c.nodeType === 1){ + if(c.getAttribute("fixed") === "bottom"){ + refNode = c; + } + break; + } + } + if(text.charAt(0) === "<"){ // html markup + container = domConstruct.create("DIV", {innerHTML: text}); + for(i = 0; i < container.childNodes.length; i++){ + var n = container.childNodes[i]; + if(n.nodeType === 1){ + view = n; // expecting <div dojoType="dojox.mobile.View"> + break; + } + } + if(!view){ + console.log("dojox.mobile.ViewController#_parse: invalid view content"); + return; + } + view.style.visibility = "hidden"; + target.insertBefore(container, refNode); + var ws = dojo.parser.parse(container); + array.forEach(ws, function(w){ + if(w && !w._started && w.startup){ + w.startup(); + } + }); + + // allows multiple root nodes in the fragment, + // but transition will be performed to the 1st view. + for(i = 0, len = container.childNodes.length; i < len; i++){ + target.insertBefore(container.firstChild, refNode); // reparent + } + target.removeChild(container); + + registry.byNode(view)._visible = true; + }else if(text.charAt(0) === "{"){ // json + container = domConstruct.create("DIV"); + target.insertBefore(container, refNode); + this._ws = []; + view = this._instantiate(eval('('+text+')'), container); + for(i = 0; i < this._ws.length; i++){ + var w = this._ws[i]; + w.startup && !w._started && (!w.getParent || !w.getParent()) && w.startup(); + } + this._ws = null; + } + view.style.display = "none"; + view.style.visibility = "visible"; + return dojo.hash ? "#" + view.id : view.id; + }, + + _instantiate: function(/*Object*/obj, /*DomNode*/node, /*Widget*/parent){ + // summary: + // Given the evaluated json data, does the same thing as what + // the parser does. + var widget; + for(var key in obj){ + if(key.charAt(0) == "@"){ continue; } + var cls = lang.getObject(key); + if(!cls){ continue; } + var params = {}; + var proto = cls.prototype; + var objs = lang.isArray(obj[key]) ? obj[key] : [obj[key]]; + for(var i = 0; i < objs.length; i++){ + for(var prop in objs[i]){ + if(prop.charAt(0) == "@"){ + var val = objs[i][prop]; + prop = prop.substring(1); + if(typeof proto[prop] == "string"){ + params[prop] = val; + }else if(typeof proto[prop] == "number"){ + params[prop] = val - 0; + }else if(typeof proto[prop] == "boolean"){ + params[prop] = (val != "false"); + }else if(typeof proto[prop] == "object"){ + params[prop] = eval("(" + val + ")"); + } + } + } + widget = new cls(params, node); + if(node){ // to call View's startup() + widget._visible = true; + this._ws.push(widget); + } + if(parent && parent.addChild){ + parent.addChild(widget); + } + this._instantiate(objs[i], null, widget); + } + } + return widget && widget.domNode; + } + }); + new Controller(); // singleton + return Controller; +}); + diff --git a/js/dojo/dojox/mobile/_ComboBoxMenu.js b/js/dojo/dojox/mobile/_ComboBoxMenu.js new file mode 100644 index 0000000..635881f --- /dev/null +++ b/js/dojo/dojox/mobile/_ComboBoxMenu.js @@ -0,0 +1,82 @@ +//>>built +define("dojox/mobile/_ComboBoxMenu", [ + "dojo/_base/kernel", + "dojo/_base/declare", + "dojo/dom-class", + "dojo/dom-construct", + "dijit/form/_ComboBoxMenuMixin", + "dijit/_WidgetBase", + "dojox/mobile/_ListTouchMixin", + "./scrollable" +], + function(dojo, declare, domClass, domConstruct, ComboBoxMenuMixin, WidgetBase, ListTouchMixin, Scrollable){ + + /*===== + ComboBoxMenuMixin = dijit.form._ComboBoxMenuMixin; + WidgetBase = dijit._WidgetBase; + ListTouchMixin = dojox.mobile._ListTouchMixin; + =====*/ + return declare("dojox.mobile._ComboBoxMenu", [WidgetBase, ListTouchMixin, 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 + + baseClass: "mblComboBoxMenu", + bgIframe: true, // so it's not created for IE and FF + + buildRendering: function(){ + this.domNode = this.focusNode = domConstruct.create("div", { "class":"mblReset" }); + this.containerNode = domConstruct.create("div", { style: { position:"absolute", top:0, left:0 } }, this.domNode); // needed for scrollable + this.previousButton = domConstruct.create("div", { "class":"mblReset mblComboBoxMenuItem mblComboBoxMenuPreviousButton", role:"option" }, this.containerNode); + this.nextButton = domConstruct.create("div", { "class":"mblReset mblComboBoxMenuItem mblComboBoxMenuNextButton", role:"option" }, this.containerNode); + this.inherited(arguments); + }, + + _createMenuItem: function(){ + return domConstruct.create("div", { + "class": "mblReset mblComboBoxMenuItem" +(this.isLeftToRight() ? "" : " mblComboBoxMenuItemRtl"), + role: "option" + }); + }, + + onSelect: function(/*DomNode*/ node){ + // summary: + // Add selected CSS + domClass.add(node, "mblComboBoxMenuItemSelected"); + }, + + onDeselect: function(/*DomNode*/ node){ + // summary: + // Remove selected CSS + domClass.remove(node, "mblComboBoxMenuItemSelected"); + }, + + onOpen: function(){ + this.scrollable.init({ + domNode: this.domNode, + containerNode: this.containerNode + }); + this.scrollable.scrollTo({x:0, y:0}); + }, + + onClose: function(){ + this.scrollable.cleanup(); + }, + + destroyRendering: function(){ + this.bgIframe = false; // no iframe to destroy + this.inherited(arguments); + }, + + postCreate: function(){ + this.inherited(arguments); + this.scrollable = new Scrollable(dojo, dojox); + this.scrollable.resize = function(){}; // resize changes the height rudely + this.scrollable.androidWorkaroud = false; // disable Android workaround + } + }); +}); diff --git a/js/dojo/dojox/mobile/_DataListMixin.js b/js/dojo/dojox/mobile/_DataListMixin.js new file mode 100644 index 0000000..0252329 --- /dev/null +++ b/js/dojo/dojox/mobile/_DataListMixin.js @@ -0,0 +1,134 @@ +//>>built +define("dojox/mobile/_DataListMixin", [ + "dojo/_base/array", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/lang", + "dijit/registry", // registry.byId + "./ListItem" +], function(array, connect, declare, lang, registry, ListItem){ + + // module: + // dojox/mobile/_DataListMixin + // summary: + // Mixin for widgets to generate the list items corresponding to the + // data provider object. + + return declare("dojox.mobile._DataListMixin", null,{ + // summary: + // Mixin for widgets to generate the list items corresponding to + // the data provider object. + // description: + // By mixing this class into the widgets, the list item nodes are + // generated as the child nodes of the widget and automatically + // re-generated whenever the corresponding data items are modified. + + // store: Object + // Reference to data provider object + store: null, + + // query: Object + // A query that can be passed to 'store' to initially filter the + // items. + query: null, + + // queryOptions: Object + // An optional parameter for the query. + queryOptions: null, + + buildRendering: function(){ + this.inherited(arguments); + if(!this.store){ return; } + var store = this.store; + this.store = null; + this.setStore(store, this.query, this.queryOptions); + }, + + setStore: function(store, query, queryOptions){ + // summary: + // Sets the store to use with this widget. + if(store === this.store){ return; } + this.store = store; + this.query = query; + this.queryOptions = queryOptions; + if(store && store.getFeatures()["dojo.data.api.Notification"]){ + array.forEach(this._conn || [], connect.disconnect); + this._conn = [ + connect.connect(store, "onSet", this, "onSet"), + connect.connect(store, "onNew", this, "onNew"), + connect.connect(store, "onDelete", this, "onDelete") + ]; + } + this.refresh(); + }, + + refresh: function(){ + // summary: + // Fetches the data and generates the list items. + if(!this.store){ return; } + this.store.fetch({ + query: this.query, + queryOptions: this.queryOptions, + onComplete: lang.hitch(this, "onComplete"), + onError: lang.hitch(this, "onError") + }); + }, + + createListItem: function(/*Object*/item){ + // summary: + // Creates a list item widget. + var attr = {}; + var arr = this.store.getLabelAttributes(item); + var labelAttr = arr ? arr[0] : null; + array.forEach(this.store.getAttributes(item), function(name){ + if(name === labelAttr){ + attr["label"] = this.store.getLabel(item); + }else{ + attr[name] = this.store.getValue(item, name); + } + }, this); + var w = new ListItem(attr); + item._widgetId = w.id; + return w; + }, + + generateList: function(/*Array*/items, /*Object*/dataObject){ + // summary: + // Given the data, generates a list of items. + array.forEach(this.getChildren(), function(child){ + child.destroyRecursive(); + }); + array.forEach(items, function(item, index){ + this.addChild(this.createListItem(item)); + }, this); + }, + + onComplete: function(/*Array*/items, /*Object*/request){ + // summary: + // An handler that is called after the fetch completes. + this.generateList(items, request); + }, + + onError: function(/*Object*/errorData, /*Object*/request){ + // summary: + // An error handler. + }, + + onSet: function(/*Object*/item, /*String*/attribute, /*Object|Array*/oldValue, /*Object|Array*/newValue){ + // summary: + // See dojo.data.api.Notification.onSet() + }, + + onNew: function(/*Object*/newItem, /*Object?*/parentInfo){ + // summary: + // See dojo.data.api.Notification.onNew() + this.addChild(this.createListItem(newItem)); + }, + + onDelete: function(/*Object*/deletedItem){ + // summary: + // See dojo.data.api.Notification.onDelete() + registry.byId(deletedItem._widgetId).destroyRecursive(); + } + }); +}); diff --git a/js/dojo/dojox/mobile/_ItemBase.js b/js/dojo/dojox/mobile/_ItemBase.js new file mode 100644 index 0000000..d63364b --- /dev/null +++ b/js/dojo/dojox/mobile/_ItemBase.js @@ -0,0 +1,249 @@ +//>>built +define("dojox/mobile/_ItemBase", [ + "dojo/_base/kernel", + "dojo/_base/config", + "dojo/_base/declare", + "dijit/registry", // registry.getEnclosingWidget + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase", + "./TransitionEvent", + "./View" +], function(kernel, config, declare, registry, Contained, Container, WidgetBase, TransitionEvent, View){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; + var TransitionEvent = dojox.mobile.TransitionEvent; + var View = dojox.mobile.View; +=====*/ + + // module: + // dojox/mobile/_ItemBase + // summary: + // A base class for item classes (e.g. ListItem, IconItem, etc.) + + return declare("dojox.mobile._ItemBase", [WidgetBase, Container, Contained],{ + // summary: + // A base class for item classes (e.g. ListItem, IconItem, etc.) + // description: + // _ItemBase is a base class for widgets that have capability to + // make a view transition when clicked. + + // icon: String + // An icon image to display. The value can be either a path for an + // image file or a class name of a DOM button. If icon is not + // specified, the iconBase parameter of the parent widget is used. + icon: "", + + // iconPos: String + // The position of an aggregated icon. IconPos is comma separated + // values like top,left,width,height (ex. "0,0,29,29"). If iconPos + // is not specified, the iconPos parameter of the parent widget is + // used. + iconPos: "", // top,left,width,height (ex. "0,0,29,29") + + // alt: String + // An alt text for the icon image. + alt: "", + + // href: String + // A URL of another web page to go to. + href: "", + + // hrefTarget: String + // A target that specifies where to open a page specified by + // href. The value will be passed to the 2nd argument of + // window.open(). + hrefTarget: "", + + // moveTo: String + // The id of the transition destination view which resides in the + // current page. + // + // If the value has a hash sign ('#') before the id (e.g. #view1) + // and the dojo.hash module is loaded by the user application, the + // view transition updates the hash in the browser URL so that the + // user can bookmark the destination view. In this case, the user + // can also use the browser's back/forward button to navigate + // through the views in the browser history. + // + // If null, transitions to a blank view. + // If '#', returns immediately without transition. + moveTo: "", + + // scene: String + // The name of a scene. Used from dojox.mobile.app. + scene: "", + + // clickable: Boolean + // If true, this item becomes clickable even if a transition + // destination (moveTo, etc.) is not specified. + clickable: false, + + // url: String + // A URL of an html fragment page or JSON data that represents a + // new view content. The view content is loaded with XHR and + // inserted in the current page. Then a view transition occurs to + // the newly created view. The view is cached so that subsequent + // requests would not load the content again. + url: "", + + // urlTarget: String + // Node id under which a new view will be created according to the + // url parameter. If not specified, The new view will be created as + // a sibling of the current view. + urlTarget: "", + + // transition: String + // A type of animated transition effect. You can choose from the + // standard transition types, "slide", "fade", "flip", or from the + // extended transition types, "cover", "coverv", "dissolve", + // "reveal", "revealv", "scaleIn", "scaleOut", "slidev", + // "swirl", "zoomIn", "zoomOut". If "none" is specified, transition + // occurs immediately without animation. + transition: "", + + // transitionDir: Number + // The transition direction. If 1, transition forward. If -1, + // transition backward. For example, the slide transition slides + // the view from right to left when dir == 1, and from left to + // right when dir == -1. + transitionDir: 1, + + // transitionOptions: Object + // A hash object that holds transition options. + transitionOptions: null, + + // callback: Function|String + // A callback function that is called when the transition has been + // finished. A function reference, or name of a function in + // context. + callback: null, + + // sync: Boolean + // If true, XHR for the view content specified with the url + // parameter is performed synchronously. If false, it is done + // asynchronously and the progress indicator is displayed while + // loading the content. This parameter is effective only when the + // url parameter is used. + sync: true, + + // label: String + // A label of the item. If the label is not specified, innerHTML is + // used as a label. + label: "", + + // toggle: Boolean + // If true, the item acts like a toggle button. + toggle: false, + + // _duration: Number + // Duration of selection, milliseconds. + _duration: 800, + + + inheritParams: function(){ + var parent = this.getParent(); + if(parent){ + if(!this.transition){ this.transition = parent.transition; } + if(this.icon && parent.iconBase && + parent.iconBase.charAt(parent.iconBase.length - 1) === '/'){ + this.icon = parent.iconBase + this.icon; + } + if(!this.icon){ this.icon = parent.iconBase; } + if(!this.iconPos){ this.iconPos = parent.iconPos; } + } + }, + + select: function(){ + // summary: + // Makes this widget in the selected state. + // description: + // Subclass must implement. + }, + + deselect: function(){ + // summary: + // Makes this widget in the deselected state. + // description: + // Subclass must implement. + }, + + defaultClickAction: function(e){ + if(this.toggle){ + if(this.selected){ + this.deselect(); + }else{ + this.select(); + } + }else if(!this.selected){ + this.select(); + if(!this.selectOne){ + var _this = this; + setTimeout(function(){ + _this.deselect(); + }, this._duration); + } + var transOpts; + if(this.moveTo || this.href || this.url || this.scene){ + transOpts = {moveTo: this.moveTo, href: this.href, url: this.url, scene: this.scene, transition: this.transition, transitionDir: this.transitionDir}; + }else if(this.transitionOptions){ + transOpts = this.transitionOptions; + } + if(transOpts){ + return new TransitionEvent(this.domNode,transOpts,e).dispatch(); + } + } + }, + + getParent: function(){ + // summary: + // Gets the parent widget. + // description: + // Almost equivalent to _Contained#getParent, but this method + // does not cause a script error even if this widget has no + // parent yet. + var ref = this.srcNodeRef || this.domNode; + return ref && ref.parentNode ? registry.getEnclosingWidget(ref.parentNode) : null; + }, + + setTransitionPos: function(e){ + // summary: + // Stores the clicked position for later use. + // description: + // Some of the transition animations (e.g. ScaleIn) needs the + // clicked position. + var w = this; + while(true){ + w = w.getParent(); + if(!w || w instanceof View){ break; } + } + if(w){ + w.clickedPosX = e.clientX; + w.clickedPosY = e.clientY; + } + }, + + transitionTo: function(moveTo, href, url, scene){ + // summary: + // Performs a view transition. + // description: + // Given a transition destination, this method performs a view + // transition. This method is typically called when this item + // is clicked. + 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 + "::transitionTo() is deprecated." + + caller, "", "2.0"); + alreadyCalledHash[caller] = true; + } + } + new TransitionEvent(this.domNode, {moveTo: moveTo, href: href, url: url, scene: scene, + transition: this.transition, transitionDir: this.transitionDir}).dispatch(); + } + }); +}); diff --git a/js/dojo/dojox/mobile/_ListTouchMixin.js b/js/dojo/dojox/mobile/_ListTouchMixin.js new file mode 100644 index 0000000..2cc6767 --- /dev/null +++ b/js/dojo/dojox/mobile/_ListTouchMixin.js @@ -0,0 +1,33 @@ +//>>built +define("dojox/mobile/_ListTouchMixin", [ + "dojo/_base/declare", + "dojo/_base/event", + "dijit/form/_ListBase" +], function(declare, event, ListBase){ + + /*===== + ListBase = dijit.form._ListBase; + =====*/ + return declare( "dojox.mobile._ListTouchMixin", ListBase, { + // summary: + // Focus-less menu to handle touch events consistently + // 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, "onclick", "_onClick"); + }, + + _onClick: function(/*Event*/ evt){ + event.stop(evt); + var target = this._getTarget(evt); + if(target){ + this._setSelectedAttr(target); + this.onClick(target); + } + } + }); +}); diff --git a/js/dojo/dojox/mobile/_ScrollableMixin.js b/js/dojo/dojox/mobile/_ScrollableMixin.js new file mode 100644 index 0000000..2443fab --- /dev/null +++ b/js/dojo/dojox/mobile/_ScrollableMixin.js @@ -0,0 +1,124 @@ +//>>built +define("dojox/mobile/_ScrollableMixin", [ + "dojo/_base/kernel", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom", + "dojo/dom-class", + "dijit/registry", // registry.byNode + "./scrollable" +], function(dojo, declare, lang, win, dom, domClass, registry, Scrollable){ + // module: + // dojox/mobile/_ScrollableMixin + // summary: + // Mixin for widgets to have a touch scrolling capability. + + var cls = declare("dojox.mobile._ScrollableMixin", null, { + // summary: + // Mixin for widgets to have a touch scrolling capability. + // description: + // Actual implementation is in scrollable.js. + // scrollable.js is not a dojo class, but just a collection + // of functions. This module makes scrollable.js a dojo class. + + // fixedHeader: String + // Id of the fixed header. + fixedHeader: "", + + // fixedFooter: String + // Id of the fixed footer. + fixedFooter: "", + + // scrollableParams: Object + // Parameters for dojox.mobile.scrollable.init(). + scrollableParams: null, + + // allowNestedScrolls: Boolean + // e.g. Allow ScrollableView in a SwapView. + allowNestedScrolls: true, + + constructor: function(){ + this.scrollableParams = {}; + }, + + destroy: function(){ + this.cleanup(); + this.inherited(arguments); + }, + + startup: function(){ + if(this._started){ return; } + var node; + var params = this.scrollableParams; + if(this.fixedHeader){ + node = dom.byId(this.fixedHeader); + if(node.parentNode == this.domNode){ // local footer + this.isLocalHeader = true; + } + params.fixedHeaderHeight = node.offsetHeight; + } + if(this.fixedFooter){ + node = dom.byId(this.fixedFooter); + if(node.parentNode == this.domNode){ // local footer + this.isLocalFooter = true; + node.style.bottom = "0px"; + } + params.fixedFooterHeight = node.offsetHeight; + } + this.init(params); + if(this.allowNestedScrolls){ + for(var p = this.getParent(); p; p = p.getParent()){ + if(p && p.scrollableParams){ + this.isNested = true; + this.dirLock = true; + p.dirLock = true; + break; + } + } + } + this.inherited(arguments); + }, + + findAppBars: function(){ + // summary: + // Search for application-specific header or footer. + var i, len, c; + for(i = 0, len = win.body().childNodes.length; i < len; i++){ + c = win.body().childNodes[i]; + this.checkFixedBar(c, false); + } + if(this.domNode.parentNode){ + for(i = 0, len = this.domNode.parentNode.childNodes.length; i < len; i++){ + c = this.domNode.parentNode.childNodes[i]; + this.checkFixedBar(c, false); + } + } + this.fixedFooterHeight = this.fixedFooter ? this.fixedFooter.offsetHeight : 0; + }, + + checkFixedBar: function(/*DomNode*/node, /*Boolean*/local){ + // summary: + // Checks if the given node is a fixed bar or not. + if(node.nodeType === 1){ + var fixed = node.getAttribute("fixed") + || (registry.byNode(node) && registry.byNode(node).fixed); + if(fixed === "top"){ + domClass.add(node, "mblFixedHeaderBar"); + if(local){ + node.style.top = "0px"; + this.fixedHeader = node; + } + return fixed; + }else if(fixed === "bottom"){ + domClass.add(node, "mblFixedBottomBar"); + this.fixedFooter = node; + return fixed; + } + } + return null; + } + }); + lang.extend(cls, new Scrollable(dojo, dojox)); + return cls; +}); diff --git a/js/dojo/dojox/mobile/_base.js b/js/dojo/dojox/mobile/_base.js new file mode 100644 index 0000000..7278e53 --- /dev/null +++ b/js/dojo/dojox/mobile/_base.js @@ -0,0 +1,22 @@ +//>>built +define("dojox/mobile/_base", [ + "./common", + "./View", + "./Heading", + "./RoundRect", + "./RoundRectCategory", + "./EdgeToEdgeCategory", + "./RoundRectList", + "./EdgeToEdgeList", + "./ListItem", + "./Switch", + "./ToolBarButton", + "./ProgressIndicator" +], function(common, View, Heading, RoundRect, RoundRectCategory, EdgeToEdgeCategory, RoundRectList, EdgeToEdgeList, ListItem, Switch, ToolBarButton, ProgressIndicator){ + // module: + // dojox/mobile/_base + // summary: + // Includes the basic dojox.mobile modules + + return common; +}); diff --git a/js/dojo/dojox/mobile/_compat.js b/js/dojo/dojox/mobile/_compat.js new file mode 100644 index 0000000..59f9ba1 --- /dev/null +++ b/js/dojo/dojox/mobile/_compat.js @@ -0,0 +1,545 @@ +//>>built +define("dojox/mobile/_compat", [ + "dojo/_base/array", // array.forEach + "dojo/_base/config", + "dojo/_base/connect", // connect.connect + "dojo/_base/fx", // fx.fadeOut, fx.fadeIn + "dojo/_base/lang", // lang.extend, lang.isArray + "dojo/_base/sniff", // has("webkit"), has("ie") + "dojo/_base/window", // win.doc, win.body + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-style", + "dojo/fx", + "dojo/fx/easing", + "dojo/ready", + "dojo/uacss", + "dijit/registry", // registry.byNode + "dojox/fx", + "dojox/fx/flip", + "./EdgeToEdgeList", + "./IconContainer", + "./RoundRect", + "./RoundRectList", + "./ScrollableView", + "./Switch", + "./View", + "require" +], function(array, config, connect, bfx, lang, has, win, domClass, domConstruct, domStyle, fx, easing, ready, uacss, registry, xfx, flip, EdgeToEdgeList, IconContainer, RoundRect, RoundRectList, ScrollableView, Switch, View, require){ + +/*===== + var EdgeToEdgeList = dojox.mobile.EdgeToEdgeList; + var IconContainer = dojox.mobile.IconContainer; + var RoundRect = dojox.mobile.RoundRect; + var RoundRectList = dojox.mobile.RoundRectList; + var ScrollableView = dojox.mobile.ScrollableView; + var Switch = dojox.mobile.Switch; + var View = dojox.mobile.View; +=====*/ + + // module: + // dojox/mobile/compat + // summary: + // CSS3 compatibility module + // description: + // This module provides support for some of the CSS3 features to dojox.mobile + // for non-CSS3 browsers, such as IE or Firefox. + // If you load this module, it directly replaces some of the methods of + // dojox.mobile instead of subclassing. This way, html pages remains the same + // regardless of whether this compatibility module is used or not. + // Recommended usage is as follows. the code below loads dojox.mobile.compat + // only when isWebKit is true. + // + // dojo.require("dojox.mobile"); + // dojo.requireIf(!has("webkit"), "dojox.mobile.compat"); + // + // This module also loads compatibility CSS files, which has -compat.css + // suffix. You can use either the <link> tag or @import to load theme + // CSS files. Then, this module searches for the loaded CSS files and loads + // compatibility CSS files. For example, if you load iphone.css in a page, + // this module automatically loads iphone-compat.css. + // If you explicitly load iphone-compat.css with <link> or @import, + // this module will not load the already loaded file. + + var dm = lang.getObject("dojox.mobile", true); + /*===== + dm = dojox.mobile + =====*/ + + if(!has("webkit")){ + lang.extend(View, { + _doTransition: function(fromNode, toNode, transition, dir){ + var anim; + this.wakeUp(toNode); + if(!transition || transition == "none"){ + toNode.style.display = ""; + fromNode.style.display = "none"; + toNode.style.left = "0px"; + this.invokeCallback(); + }else if(transition == "slide" || transition == "cover" || transition == "reveal"){ + var w = fromNode.offsetWidth; + var s1 = fx.slideTo({ + node: fromNode, + duration: 400, + left: -w*dir, + top: domStyle.get(fromNode, "top") + }); + var s2 = fx.slideTo({ + node: toNode, + duration: 400, + left: 0, + top: domStyle.get(toNode, "top") + }); + toNode.style.position = "absolute"; + toNode.style.left = w*dir + "px"; + toNode.style.display = ""; + anim = fx.combine([s1,s2]); + connect.connect(anim, "onEnd", this, function(){ + fromNode.style.display = "none"; + fromNode.style.left = "0px"; + toNode.style.position = "relative"; + var toWidget = registry.byNode(toNode); + if(toWidget && !domClass.contains(toWidget.domNode, "out")){ + // Reset the temporary padding + toWidget.containerNode.style.paddingTop = ""; + } + this.invokeCallback(); + }); + anim.play(); + }else if(transition == "slidev" || transition == "coverv" || transition == "reavealv"){ + var h = fromNode.offsetHeight; + var s1 = fx.slideTo({ + node: fromNode, + duration: 400, + left: 0, + top: -h*dir + }); + var s2 = fx.slideTo({ + node: toNode, + duration: 400, + left: 0, + top: 0 + }); + toNode.style.position = "absolute"; + toNode.style.top = h*dir + "px"; + toNode.style.left = "0px"; + toNode.style.display = ""; + anim = fx.combine([s1,s2]); + connect.connect(anim, "onEnd", this, function(){ + fromNode.style.display = "none"; + toNode.style.position = "relative"; + this.invokeCallback(); + }); + anim.play(); + }else if(transition == "flip"){ + anim = xfx.flip({ + node: fromNode, + dir: "right", + depth: 0.5, + duration: 400 + }); + toNode.style.position = "absolute"; + toNode.style.left = "0px"; + connect.connect(anim, "onEnd", this, function(){ + fromNode.style.display = "none"; + toNode.style.position = "relative"; + toNode.style.display = ""; + this.invokeCallback(); + }); + anim.play(); + }else { + // other transitions - "fade", "dissolve", "swirl" + anim = fx.chain([ + bfx.fadeOut({ + node: fromNode, + duration: 600 + }), + bfx.fadeIn({ + node: toNode, + duration: 600 + }) + ]); + toNode.style.position = "absolute"; + toNode.style.left = "0px"; + toNode.style.display = ""; + domStyle.set(toNode, "opacity", 0); + connect.connect(anim, "onEnd", this, function(){ + fromNode.style.display = "none"; + toNode.style.position = "relative"; + domStyle.set(fromNode, "opacity", 1); + this.invokeCallback(); + }); + anim.play(); + } + dm.currentView = registry.byNode(toNode); + }, + + wakeUp: function(/*DomNode*/node){ + // summary: + // Function to force IE to redraw a node since its layout + // code tends to misrender in partial draws. + // node: DomNode + // The node to forcibly redraw. + // tags: + // public + if(has("ie") && !node._wokeup){ + node._wokeup = true; + var disp = node.style.display; + node.style.display = ""; + var nodes = node.getElementsByTagName("*"); + for(var i = 0, len = nodes.length; i < len; i++){ + var val = nodes[i].style.display; + nodes[i].style.display = "none"; + nodes[i].style.display = ""; + nodes[i].style.display = val; + } + node.style.display = disp; + } + } + }); + + + lang.extend(Switch, { + _changeState: function(/*String*/state, /*Boolean*/anim){ + // summary: + // Function to toggle the switch state on the switch + // state: + // The state to toggle, switch 'on' or 'off' + // anim: + // Whether to use animation or not + // tags: + // private + var on = (state === "on"); + + var pos; + if(!on){ + pos = -this.inner.firstChild.firstChild.offsetWidth; + }else{ + pos = 0; + } + + this.left.style.display = ""; + this.right.style.display = ""; + + var _this = this; + var f = function(){ + domClass.remove(_this.domNode, on ? "mblSwitchOff" : "mblSwitchOn"); + domClass.add(_this.domNode, on ? "mblSwitchOn" : "mblSwitchOff"); + _this.left.style.display = on ? "" : "none"; + _this.right.style.display = !on ? "" : "none"; + }; + + if(anim){ + var a = fx.slideTo({ + node: this.inner, + duration: 300, + left: pos, + onEnd: f + }); + a.play(); + }else{ + if(on || pos){ + this.inner.style.left = pos + "px"; + } + f(); + } + } + }); + + + if(has("ie")){ + lang.extend(RoundRect, { + buildRendering: function(){ + // summary: + // Function to simulate the borderRadius appearance on + // IE, since IE does not support this CSS style. + // tags: + // protected + dm.createRoundRect(this); + this.domNode.className = "mblRoundRect"; + } + }); + + + RoundRectList._addChild = RoundRectList.prototype.addChild; + lang.extend(RoundRectList, { + buildRendering: function(){ + // summary: + // Function to simulate the borderRadius appearance on + // IE, since IE does not support this CSS style. + // tags: + // protected + dm.createRoundRect(this, true); + this.domNode.className = "mblRoundRectList"; + }, + + postCreate: function(){ + this.redrawBorders(); + }, + + addChild: function(widget, /*Number?*/insertIndex){ + RoundRectList._addChild.apply(this, arguments); + this.redrawBorders(); + if(dm.applyPngFilter){ + dm.applyPngFilter(widget.domNode); + } + }, + + redrawBorders: function(){ + // summary: + // Function to adjust the creation of RoundRectLists on IE. + // Removed undesired styles. + // tags: + // public + + // Remove a border of the last ListItem. + // This is for browsers that do not support the last-child CSS pseudo-class. + + if(this instanceof EdgeToEdgeList){ return; } + var lastChildFound = false; + for(var i = this.containerNode.childNodes.length - 1; i >= 0; i--){ + var c = this.containerNode.childNodes[i]; + if(c.tagName == "LI"){ + c.style.borderBottomStyle = lastChildFound ? "solid" : "none"; + lastChildFound = true; + } + } + } + }); + + + lang.extend(EdgeToEdgeList, { + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement("UL"); + this.domNode.className = "mblEdgeToEdgeList"; + } + }); + + + IconContainer._addChild = IconContainer.prototype.addChild; + lang.extend(IconContainer, { + addChild: function(widget, /*Number?*/insertIndex){ + IconContainer._addChild.apply(this, arguments); + if(dm.applyPngFilter){ + dm.applyPngFilter(widget.domNode); + } + } + }); + + + lang.mixin(dm, { + createRoundRect: function(_this, isList){ + // summary: + // Function to adjust the creation of rounded rectangles on IE. + // Deals with IE's lack of borderRadius support + // tags: + // public + var i, len; + _this.domNode = win.doc.createElement("DIV"); + _this.domNode.style.padding = "0px"; + _this.domNode.style.backgroundColor = "transparent"; + _this.domNode.style.border = "none"; // borderStyle = "none"; doesn't work on IE9 + _this.containerNode = win.doc.createElement(isList?"UL":"DIV"); + _this.containerNode.className = "mblRoundRectContainer"; + if(_this.srcNodeRef){ + _this.srcNodeRef.parentNode.replaceChild(_this.domNode, _this.srcNodeRef); + for(i = 0, len = _this.srcNodeRef.childNodes.length; i < len; i++){ + _this.containerNode.appendChild(_this.srcNodeRef.removeChild(_this.srcNodeRef.firstChild)); + } + _this.srcNodeRef = null; + } + _this.domNode.appendChild(_this.containerNode); + + for(i = 0; i <= 5; i++){ + var top = domConstruct.create("DIV"); + top.className = "mblRoundCorner mblRoundCorner"+i+"T"; + _this.domNode.insertBefore(top, _this.containerNode); + + var bottom = domConstruct.create("DIV"); + bottom.className = "mblRoundCorner mblRoundCorner"+i+"B"; + _this.domNode.appendChild(bottom); + } + } + }); + + + lang.extend(ScrollableView, { + postCreate: function(){ + // On IE, margin-top of the first child does not seem to be effective, + // probably because padding-top is specified for containerNode + // to make room for a fixed header. This dummy node is a workaround for that. + var dummy = domConstruct.create("DIV", {className:"mblDummyForIE", innerHTML:" "}, this.containerNode, "first"); + domStyle.set(dummy, { + position: "relative", + marginBottom: "-2px", + fontSize: "1px" + }); + } + }); + } // if (has("ie")) + + + if(has("ie") <= 6){ + dm.applyPngFilter = function(root){ + root = root || win.body(); + var nodes = root.getElementsByTagName("IMG"); + var blank = require.toUrl("dojo/resources/blank.gif"); + for(var i = 0, len = nodes.length; i < len; i++){ + var img = nodes[i]; + var w = img.offsetWidth; + var h = img.offsetHeight; + if(w === 0 || h === 0){ + // The reason why the image has no width/height may be because + // display is "none". If that is the case, let's change the + // display to "" temporarily and see if the image returns them. + if(domStyle.get(img, "display") != "none"){ continue; } + img.style.display = ""; + w = img.offsetWidth; + h = img.offsetHeight; + img.style.display = "none"; + if(w === 0 || h === 0){ continue; } + } + var src = img.src; + if(src.indexOf("resources/blank.gif") != -1){ continue; } + img.src = blank; + img.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src+"')"; + img.style.width = w + "px"; + img.style.height = h + "px"; + } + }; + + if(!dm._disableBgFilter && dm.createDomButton){ + dm._createDomButton_orig = dm.createDomButton; + dm.createDomButton = function(/*DomNode*/refNode, /*Object?*/style, /*DomNode?*/toNode){ + var node = dm._createDomButton_orig.apply(this, arguments); + if(node && node.className && node.className.indexOf("mblDomButton") !== -1){ + var f = function(){ + if(node.currentStyle && node.currentStyle.backgroundImage.match(/url.*(mblDomButton.*\.png)/)){ + var img = RegExp.$1; + var src = require.toUrl("dojox/mobile/themes/common/domButtons/compat/") + img; + node.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src+"',sizingMethod='crop')"; + node.style.background = "none"; + } + }; + setTimeout(f, 1000); + setTimeout(f, 5000); + } + return node; + }; + } + } // if(has("ie") <= 6) + + dm.loadCssFile = function(/*String*/file){ + // summary: + // Overrides dojox.mobile.loadCssFile() defined in + // deviceTheme.js. + if(!dm.loadedCssFiles){ dm.loadedCssFiles = []; } + if(win.doc.createStyleSheet){ + // for some reason, IE hangs when you try to load + // multiple css files almost at once. + setTimeout(function(file){ + return function(){ + var ss = win.doc.createStyleSheet(file); + ss && dm.loadedCssFiles.push(ss.owningElement); + }; + }(file), 0); + }else{ + dm.loadedCssFiles.push(domConstruct.create("LINK", { + href: file, + type: "text/css", + rel: "stylesheet" + }, win.doc.getElementsByTagName('head')[0])); + } + }; + + dm.loadCss = function(/*String|Array*/files){ + // summary: + // Function to load and register CSS files with the page + // files: String|Array + // The CSS files to load and register with the page. + // tags: + // private + if(!dm._loadedCss){ + var obj = {}; + array.forEach(dm.getCssPaths(), function(path){ + obj[path] = true; + }); + dm._loadedCss = obj; + } + if(!lang.isArray(files)){ files = [files]; } + for(var i = 0; i < files.length; i++){ + var file = files[i]; + if(!dm._loadedCss[file]){ + dm._loadedCss[file] = true; + dm.loadCssFile(file); + } + } + }; + + dm.getCssPaths = function(){ + var paths = []; + var i, j, len; + + // find @import + var s = win.doc.styleSheets; + for(i = 0; i < s.length; i++){ + if(s[i].href){ continue; } + var r = s[i].cssRules || s[i].imports; + if(!r){ continue; } + for(j = 0; j < r.length; j++){ + if(r[j].href){ + paths.push(r[j].href); + } + } + } + + // find <link> + var elems = win.doc.getElementsByTagName("link"); + for(i = 0, len = elems.length; i < len; i++){ + if(elems[i].href){ + paths.push(elems[i].href); + } + } + return paths; + }; + + dm.loadCompatPattern = /\/mobile\/themes\/.*\.css$/; + + dm.loadCompatCssFiles = function(/*Boolean?*/force){ + // summary: + // Function to perform page-level adjustments on browsers such as + // IE and firefox. It loads compat specific css files into the + // page header. + if(has("ie") && !force){ + setTimeout(function(){ // IE needs setTimeout + dm.loadCompatCssFiles(true); + }, 0); + } + dm._loadedCss = undefined; + var paths = dm.getCssPaths(); + for(var i = 0; i < paths.length; i++){ + var href = paths[i]; + if((href.match(dm.loadCompatPattern) || location.href.indexOf("mobile/tests/") !== -1) && href.indexOf("-compat.css") === -1){ + var compatCss = href.substring(0, href.length-4)+"-compat.css"; + dm.loadCss(compatCss); + } + } + }; + + dm.hideAddressBar = function(/*Event?*/evt, /*Boolean?*/doResize){ + if(doResize !== false){ dm.resizeAll(); } + }; + + ready(function(){ + if(config["mblLoadCompatCssFiles"] !== false){ + dm.loadCompatCssFiles(); + } + if(dm.applyPngFilter){ + dm.applyPngFilter(); + } + }); + + } // end of if(!has("webkit")){ + + return dm; +}); diff --git a/js/dojo/dojox/mobile/app.js b/js/dojo/dojox/mobile/app.js new file mode 100644 index 0000000..ad041e1 --- /dev/null +++ b/js/dojo/dojox/mobile/app.js @@ -0,0 +1,15 @@ +/* + 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 +*/ + +/* + This is an optimized version of Dojo, built for deployment and not for + development. To get sources and documentation, please visit: + + http://dojotoolkit.org +*/ + +//>>built +require({cache:{"dojo/uacss":function(){define(["./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;});},"dojox/mobile/app/_Widget":function(){define(["dijit","dojo","dojox","dojo/require!dijit/_WidgetBase"],function(_e,_f,_10){_f.provide("dojox.mobile.app._Widget");_f.experimental("dojox.mobile.app._Widget");_f.require("dijit._WidgetBase");_f.declare("dojox.mobile.app._Widget",_e._WidgetBase,{getScroll:function(){return {x:_f.global.scrollX,y:_f.global.scrollY};},connect:function(_11,_12,fn){if(_12.toLowerCase()=="dblclick"||_12.toLowerCase()=="ondblclick"){if(_f.global["Mojo"]){return this.connect(_11,Mojo.Event.tap,fn);}}return this.inherited(arguments);}});});},"dojox/mobile/app/ImageThumbView":function(){define(["dijit","dojo","dojox","dojo/require!dijit/_WidgetBase,dojo/string"],function(_13,_14,_15){_14.provide("dojox.mobile.app.ImageThumbView");_14.experimental("dojox.mobile.app.ImageThumbView");_14.require("dijit._WidgetBase");_14.require("dojo.string");_14.declare("dojox.mobile.app.ImageThumbView",_13._WidgetBase,{items:[],urlParam:"url",labelParam:null,itemTemplate:"<div class=\"mblThumbInner\">"+"<div class=\"mblThumbOverlay\"></div>"+"<div class=\"mblThumbMask\">"+"<div class=\"mblThumbSrc\" style=\"background-image:url(${url})\"></div>"+"</div>"+"</div>",minPadding:4,maxPerRow:3,maxRows:-1,baseClass:"mblImageThumbView",thumbSize:"medium",animationEnabled:true,selectedIndex:-1,cache:null,cacheMustMatch:false,clickEvent:"onclick",cacheBust:false,disableHide:false,constructor:function(_16,_17){},postCreate:function(){this.inherited(arguments);var _18=this;var _19="mblThumbHover";this.addThumb=_14.hitch(this,this.addThumb);this.handleImgLoad=_14.hitch(this,this.handleImgLoad);this.hideCached=_14.hitch(this,this.hideCached);this._onLoadImages={};this.cache=[];this.visibleImages=[];this._cacheCounter=0;this.connect(this.domNode,this.clickEvent,function(_1a){var _1b=_18._getItemNodeFromEvent(_1a);if(_1b&&!_1b._cached){_18.onSelect(_1b._item,_1b._index,_18.items);_14.query(".selected",this.domNode).removeClass("selected");_14.addClass(_1b,"selected");}});_14.addClass(this.domNode,this.thumbSize);this.resize();this.render();},onSelect:function(_1c,_1d,_1e){},_setAnimationEnabledAttr:function(_1f){this.animationEnabled=_1f;_14[_1f?"addClass":"removeClass"](this.domNode,"animated");},_setItemsAttr:function(_20){this.items=_20||[];var _21={};var i;for(i=0;i<this.items.length;i++){_21[this.items[i][this.urlParam]]=1;}var _22=[];for(var url in this._onLoadImages){if(!_21[url]&&this._onLoadImages[url]._conn){_14.disconnect(this._onLoadImages[url]._conn);this._onLoadImages[url].src=null;_22.push(url);}}for(i=0;i<_22.length;i++){delete this._onLoadImages[url];}this.render();},_getItemNode:function(_23){while(_23&&!_14.hasClass(_23,"mblThumb")&&_23!=this.domNode){_23=_23.parentNode;}return (_23==this.domNode)?null:_23;},_getItemNodeFromEvent:function(_24){if(_24.touches&&_24.touches.length>0){_24=_24.touches[0];}return this._getItemNode(_24.target);},resize:function(){this._thumbSize=null;this._size=_14.contentBox(this.domNode);this.disableHide=true;this.render();this.disableHide=false;},hideCached:function(){for(var i=0;i<this.cache.length;i++){if(this.cache[i]){_14.style(this.cache[i],"display","none");}}},render:function(){var i;var url;var _25;var _26;while(this.visibleImages&&this.visibleImages.length>0){_26=this.visibleImages.pop();this.cache.push(_26);if(!this.disableHide){_14.addClass(_26,"hidden");}_26._cached=true;}if(this.cache&&this.cache.length>0){setTimeout(this.hideCached,1000);}if(!this.items||this.items.length==0){return;}for(i=0;i<this.items.length;i++){_25=this.items[i];url=(_14.isString(_25)?_25:_25[this.urlParam]);this.addThumb(_25,url,i);if(this.maxRows>0&&(i+1)/this.maxPerRow>=this.maxRows){break;}}if(!this._thumbSize){return;}var _27=0;var row=-1;var _28=this._thumbSize.w+(this.padding*2);var _29=this._thumbSize.h+(this.padding*2);var _2a=this.thumbNodes=_14.query(".mblThumb",this.domNode);var pos=0;_2a=this.visibleImages;for(i=0;i<_2a.length;i++){if(_2a[i]._cached){continue;}if(pos%this.maxPerRow==0){row++;}_27=pos%this.maxPerRow;this.place(_2a[i],(_27*_28)+this.padding,(row*_29)+this.padding);if(!_2a[i]._loading){_14.removeClass(_2a[i],"hidden");}if(pos==this.selectedIndex){_14[pos==this.selectedIndex?"addClass":"removeClass"](_2a[i],"selected");}pos++;}var _2b=Math.ceil(pos/this.maxPerRow);this._numRows=_2b;this.setContainerHeight((_2b*(this._thumbSize.h+this.padding*2)));},setContainerHeight:function(_2c){_14.style(this.domNode,"height",_2c+"px");},addThumb:function(_2d,url,_2e){var _2f;var _30=false;if(this.cache.length>0){var _31=false;for(var i=0;i<this.cache.length;i++){if(this.cache[i]._url==url){_2f=this.cache.splice(i,1)[0];_31=true;break;}}if(!_2f&&!this.cacheMustMatch){_2f=this.cache.pop();_14.removeClass(_2f,"selected");}else{_30=true;}}if(!_2f){_2f=_14.create("div",{"class":"mblThumb hidden",innerHTML:_14.string.substitute(this.itemTemplate,{url:url},null,this)},this.domNode);}if(this.labelParam){var _32=_14.query(".mblThumbLabel",_2f)[0];if(!_32){_32=_14.create("div",{"class":"mblThumbLabel"},_2f);}_32.innerHTML=_2d[this.labelParam]||"";}_14.style(_2f,"display","");if(!this.disableHide){_14.addClass(_2f,"hidden");}if(!_30){var _33=_14.create("img",{});_33._thumbDiv=_2f;_33._conn=_14.connect(_33,"onload",this.handleImgLoad);_33._url=url;_2f._loading=true;this._onLoadImages[url]=_33;if(_33){_33.src=url;}}this.visibleImages.push(_2f);_2f._index=_2e;_2f._item=_2d;_2f._url=url;_2f._cached=false;if(!this._thumbSize){this._thumbSize=_14.marginBox(_2f);if(this._thumbSize.h==0){this._thumbSize.h=100;this._thumbSize.w=100;}if(this.labelParam){this._thumbSize.h+=8;}this.calcPadding();}},handleImgLoad:function(_34){var img=_34.target;_14.disconnect(img._conn);_14.removeClass(img._thumbDiv,"hidden");img._thumbDiv._loading=false;img._conn=null;var url=img._url;if(this.cacheBust){url+=(url.indexOf("?")>-1?"&":"?")+"cacheBust="+(new Date()).getTime()+"_"+(this._cacheCounter++);}_14.query(".mblThumbSrc",img._thumbDiv).style("backgroundImage","url("+url+")");delete this._onLoadImages[img._url];},calcPadding:function(){var _35=this._size.w;var _36=this._thumbSize.w;var _37=_36+this.minPadding;this.maxPerRow=Math.floor(_35/_37);this.padding=Math.floor((_35-(_36*this.maxPerRow))/(this.maxPerRow*2));},place:function(_38,x,y){_14.style(_38,{"-webkit-transform":"translate("+x+"px,"+y+"px)"});},destroy:function(){var img;var _39=0;for(var url in this._onLoadImages){img=this._onLoadImages[url];if(img){img.src=null;_39++;}}this.inherited(arguments);}});});},"dojox/mobile/TransitionEvent":function(){define("dojox/mobile/TransitionEvent",["dojo/_base/declare","dojo/_base/Deferred","dojo/_base/lang","dojo/on","./transition"],function(_3a,_3b,_3c,on,_3d){return _3a("dojox.mobile.TransitionEvent",null,{constructor:function(_3e,_3f,_40){this.transitionOptions=_3f;this.target=_3e;this.triggerEvent=_40||null;},dispatch:function(){var _41={bubbles:true,cancelable:true,detail:this.transitionOptions,triggerEvent:this.triggerEvent};var evt=on.emit(this.target,"startTransition",_41);if(evt){_3b.when(_3d,_3c.hitch(this,function(_42){_3b.when(_42.call(this,evt),_3c.hitch(this,function(_43){this.endTransition(_43);}));}));}},endTransition:function(_44){on.emit(this.target,"endTransition",{detail:_44.transitionOptions});}});});},"dojox/mobile/ViewController":function(){define(["dojo/_base/kernel","dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/_base/lang","dojo/_base/window","dojo/dom","dojo/dom-class","dojo/dom-construct","dojo/on","dojo/ready","dijit/registry","./ProgressIndicator","./TransitionEvent"],function(_45,_46,_47,_48,_49,win,dom,_4a,_4b,on,_4c,_4d,_4e,_4f){var dm=_49.getObject("dojox.mobile",true);var _50=_48("dojox.mobile.ViewController",null,{constructor:function(){this.viewMap={};this.currentView=null;this.defaultView=null;_4c(_49.hitch(this,function(){on(win.body(),"startTransition",_49.hitch(this,"onStartTransition"));}));},findCurrentView:function(_51,src){if(_51){var w=_4d.byId(_51);if(w&&w.getShowingView){return w.getShowingView();}}if(dm.currentView){return dm.currentView;}w=src;while(true){w=w.getParent();if(!w){return null;}if(_4a.contains(w.domNode,"mblView")){break;}}return w;},onStartTransition:function(evt){evt.preventDefault();if(!evt.detail||(evt.detail&&!evt.detail.moveTo&&!evt.detail.href&&!evt.detail.url&&!evt.detail.scene)){return;}var w=this.findCurrentView(evt.detail.moveTo,(evt.target&&evt.target.id)?_4d.byId(evt.target.id):_4d.byId(evt.target));if(!w||(evt.detail&&evt.detail.moveTo&&w===_4d.byId(evt.detail.moveTo))){return;}if(evt.detail.href){var t=_4d.byId(evt.target.id).hrefTarget;if(t){dm.openWindow(evt.detail.href,t);}else{w.performTransition(null,evt.detail.transitionDir,evt.detail.transition,evt.target,function(){location.href=evt.detail.href;});}return;}else{if(evt.detail.scene){_47.publish("/dojox/mobile/app/pushScene",[evt.detail.scene]);return;}}var _52=evt.detail.moveTo;if(evt.detail.url){var id;if(dm._viewMap&&dm._viewMap[evt.detail.url]){id=dm._viewMap[evt.detail.url];}else{var _53=this._text;if(!_53){if(_4d.byId(evt.target.id).sync){_45.xhrGet({url:evt.detail.url,sync:true,load:function(_54){_53=_49.trim(_54);}});}else{var s="dojo/_base/xhr";require([s],_49.hitch(this,function(xhr){var _55=_4e.getInstance();win.body().appendChild(_55.domNode);_55.start();var obj=xhr.get({url:evt.detail.url,handleAs:"text"});obj.addCallback(_49.hitch(this,function(_56,_57){_55.stop();if(_56){this._text=_56;new _4f(evt.target,{transition:evt.detail.transition,transitionDir:evt.detail.transitionDir,moveTo:_52,href:evt.detail.href,url:evt.detail.url,scene:evt.detail.scene},evt.detail).dispatch();}}));obj.addErrback(function(_58){_55.stop();});}));return;}}this._text=null;id=this._parse(_53,_4d.byId(evt.target.id).urlTarget);if(!dm._viewMap){dm._viewMap=[];}dm._viewMap[evt.detail.url]=id;}_52=id;w=this.findCurrentView(_52,_4d.byId(evt.target.id))||w;}w.performTransition(_52,evt.detail.transitionDir,evt.detail.transition,null,null);},_parse:function(_59,id){var _5a,_5b,i,j,len;var _5c=this.findCurrentView();var _5d=_4d.byId(id)&&_4d.byId(id).containerNode||dom.byId(id)||_5c&&_5c.domNode.parentNode||win.body();var _5e=null;for(j=_5d.childNodes.length-1;j>=0;j--){var c=_5d.childNodes[j];if(c.nodeType===1){if(c.getAttribute("fixed")==="bottom"){_5e=c;}break;}}if(_59.charAt(0)==="<"){_5a=_4b.create("DIV",{innerHTML:_59});for(i=0;i<_5a.childNodes.length;i++){var n=_5a.childNodes[i];if(n.nodeType===1){_5b=n;break;}}if(!_5b){return;}_5b.style.visibility="hidden";_5d.insertBefore(_5a,_5e);var ws=_45.parser.parse(_5a);_46.forEach(ws,function(w){if(w&&!w._started&&w.startup){w.startup();}});for(i=0,len=_5a.childNodes.length;i<len;i++){_5d.insertBefore(_5a.firstChild,_5e);}_5d.removeChild(_5a);_4d.byNode(_5b)._visible=true;}else{if(_59.charAt(0)==="{"){_5a=_4b.create("DIV");_5d.insertBefore(_5a,_5e);this._ws=[];_5b=this._instantiate(eval("("+_59+")"),_5a);for(i=0;i<this._ws.length;i++){var w=this._ws[i];w.startup&&!w._started&&(!w.getParent||!w.getParent())&&w.startup();}this._ws=null;}}_5b.style.display="none";_5b.style.visibility="visible";return _45.hash?"#"+_5b.id:_5b.id;},_instantiate:function(obj,_5f,_60){var _61;for(var key in obj){if(key.charAt(0)=="@"){continue;}var cls=_49.getObject(key);if(!cls){continue;}var _62={};var _63=cls.prototype;var _64=_49.isArray(obj[key])?obj[key]:[obj[key]];for(var i=0;i<_64.length;i++){for(var _65 in _64[i]){if(_65.charAt(0)=="@"){var val=_64[i][_65];_65=_65.substring(1);if(typeof _63[_65]=="string"){_62[_65]=val;}else{if(typeof _63[_65]=="number"){_62[_65]=val-0;}else{if(typeof _63[_65]=="boolean"){_62[_65]=(val!="false");}else{if(typeof _63[_65]=="object"){_62[_65]=eval("("+val+")");}}}}}}_61=new cls(_62,_5f);if(_5f){_61._visible=true;this._ws.push(_61);}if(_60&&_60.addChild){_60.addChild(_61);}this._instantiate(_64[i],null,_61);}}return _61&&_61.domNode;}});new _50();return _50;});},"dojox/mobile/ToolBarButton":function(){define("dojox/mobile/ToolBarButton",["dojo/_base/declare","dojo/_base/window","dojo/dom-class","dojo/dom-construct","dojo/dom-style","./common","./_ItemBase"],function(_66,win,_67,_68,_69,_6a,_6b){return _66("dojox.mobile.ToolBarButton",_6b,{selected:false,btnClass:"",_defaultColor:"mblColorDefault",_selColor:"mblColorDefaultSel",buildRendering:function(){this.domNode=this.containerNode=this.srcNodeRef||win.doc.createElement("div");this.inheritParams();_67.add(this.domNode,"mblToolBarButton mblArrowButtonText");var _6c;if(this.selected){_6c=this._selColor;}else{if(this.domNode.className.indexOf("mblColor")==-1){_6c=this._defaultColor;}}_67.add(this.domNode,_6c);if(!this.label){this.label=this.domNode.innerHTML;}if(this.icon&&this.icon!="none"){this.iconNode=_68.create("div",{className:"mblToolBarButtonIcon"},this.domNode);_6a.createIcon(this.icon,this.iconPos,null,this.alt,this.iconNode);if(this.iconPos){_67.add(this.iconNode.firstChild,"mblToolBarButtonSpriteIcon");}}else{if(_6a.createDomButton(this.domNode)){_67.add(this.domNode,"mblToolBarButtonDomButton");}else{_67.add(this.domNode,"mblToolBarButtonText");}}this.connect(this.domNode,"onclick","onClick");},select:function(){_67.toggle(this.domNode,this._selColor,!arguments[0]);this.selected=!arguments[0];},deselect:function(){this.select(true);},onClick:function(e){this.setTransitionPos(e);this.defaultClickAction();},_setBtnClassAttr:function(_6d){var _6e=this.domNode;if(_6e.className.match(/(mblDomButton\w+)/)){_67.remove(_6e,RegExp.$1);}_67.add(_6e,_6d);if(_6a.createDomButton(this.domNode)){_67.add(this.domNode,"mblToolBarButtonDomButton");}},_setLabelAttr:function(_6f){this.label=_6f;this.domNode.innerHTML=this._cv?this._cv(_6f):_6f;}});});},"dojox/mobile/_ItemBase":function(){define("dojox/mobile/_ItemBase",["dojo/_base/kernel","dojo/_base/config","dojo/_base/declare","dijit/registry","dijit/_Contained","dijit/_Container","dijit/_WidgetBase","./TransitionEvent","./View"],function(_70,_71,_72,_73,_74,_75,_76,_77,_78){return _72("dojox.mobile._ItemBase",[_76,_75,_74],{icon:"",iconPos:"",alt:"",href:"",hrefTarget:"",moveTo:"",scene:"",clickable:false,url:"",urlTarget:"",transition:"",transitionDir:1,transitionOptions:null,callback:null,sync:true,label:"",toggle:false,_duration:800,inheritParams:function(){var _79=this.getParent();if(_79){if(!this.transition){this.transition=_79.transition;}if(this.icon&&_79.iconBase&&_79.iconBase.charAt(_79.iconBase.length-1)==="/"){this.icon=_79.iconBase+this.icon;}if(!this.icon){this.icon=_79.iconBase;}if(!this.iconPos){this.iconPos=_79.iconPos;}}},select:function(){},deselect:function(){},defaultClickAction:function(e){if(this.toggle){if(this.selected){this.deselect();}else{this.select();}}else{if(!this.selected){this.select();if(!this.selectOne){var _7a=this;setTimeout(function(){_7a.deselect();},this._duration);}var _7b;if(this.moveTo||this.href||this.url||this.scene){_7b={moveTo:this.moveTo,href:this.href,url:this.url,scene:this.scene,transition:this.transition,transitionDir:this.transitionDir};}else{if(this.transitionOptions){_7b=this.transitionOptions;}}if(_7b){return new _77(this.domNode,_7b,e).dispatch();}}}},getParent:function(){var ref=this.srcNodeRef||this.domNode;return ref&&ref.parentNode?_73.getEnclosingWidget(ref.parentNode):null;},setTransitionPos:function(e){var w=this;while(true){w=w.getParent();if(!w||w instanceof _78){break;}}if(w){w.clickedPosX=e.clientX;w.clickedPosY=e.clientY;}},transitionTo:function(_7c,_7d,url,_7e){if(_71.isDebug){var _7f=arguments.callee._ach||(arguments.callee._ach={}),_80=(arguments.callee.caller||"unknown caller").toString();if(!_7f[_80]){_70.deprecated(this.declaredClass+"::transitionTo() is deprecated."+_80,"","2.0");_7f[_80]=true;}}new _77(this.domNode,{moveTo:_7c,href:_7d,url:url,scene:_7e,transition:this.transition,transitionDir:this.transitionDir}).dispatch();}});});},"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(_81,_82,_83,_84,_85,_86,has,win){if(has("ie")||has("mozilla")){_86(90,function(){var div=_84.create("div",{id:"a11yTestNode",style:{cssText:"border: 1px solid;"+"border-color:red green;"+"position: absolute;"+"height: 5px;"+"top: -999px;"+"background-image: url(\""+(_82.blankGif||_81.toUrl("dojo/resources/blank.gif"))+"\");"}},win.body());var cs=_85.getComputedStyle(div);if(cs){var _87=cs.backgroundImage;var _88=(cs.borderTopColor==cs.borderRightColor)||(_87!=null&&(_87=="none"||_87=="url(invalid-url:)"));if(_88){_83.add(win.body(),"dijit_a11y");}if(has("ie")){div.outerHTML="";}else{win.body().removeChild(div);}}});}});},"dijit/_Contained":function(){define("dijit/_Contained",["dojo/_base/declare","./registry"],function(_89,_8a){return _89("dijit._Contained",null,{_getSibling:function(_8b){var _8c=this.domNode;do{_8c=_8c[_8b+"Sibling"];}while(_8c&&_8c.nodeType!=1);return _8c&&_8a.byNode(_8c);},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/form/_TextBoxMixin":function(){define("dijit/form/_TextBoxMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom","dojo/_base/event","dojo/keys","dojo/_base/lang",".."],function(_8d,_8e,dom,_8f,_90,_91,_92){var _93=_8e("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(_94,_95,_96){var _97;if(_94!==undefined){_97=this.filter(_94);if(typeof _96!="string"){if(_97!==null&&((typeof _97!="number")||!isNaN(_97))){_96=this.filter(this.format(_97,this.constraints));}else{_96="";}}}if(_96!=null&&_96!=undefined&&((typeof _96)!="number"||!isNaN(_96))&&this.textbox.value!=_96){this.textbox.value=_96;this._set("displayedValue",this.get("displayedValue"));}if(this.textDir=="auto"){this.applyTextDir(this.focusNode,_96);}this.inherited(arguments,[_97,_95]);},displayedValue:"",_getDisplayedValueAttr:function(){return this.filter(this.textbox.value);},_setDisplayedValueAttr:function(_98){if(_98===null||_98===undefined){_98="";}else{if(typeof _98!="string"){_98=String(_98);}}this.textbox.value=_98;this._setValueAttr(this.get("value"),undefined);this._set("displayedValue",this.get("displayedValue"));if(this.textDir=="auto"){this.applyTextDir(this.focusNode,_98);}},format:function(_99){return ((_99==null||_99==undefined)?"":(_99.toString?_99.toString():_99));},parse:function(_9a){return _9a;},_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 _9b=function(e){var _9c=e.charOrCode||e.keyCode||229;if(e.type=="keydown"){switch(_9c){case _90.SHIFT:case _90.ALT:case _90.CTRL:case _90.META:case _90.CAPS_LOCK:return;default:if(_9c>=65&&_9c<=90){return;}}}if(e.type=="keypress"&&typeof _9c!="string"){return;}if(e.type=="input"){if(this.__skipInputEvent){this.__skipInputEvent=false;return;}}else{this.__skipInputEvent=true;}var _9d=_91.mixin({},e,{charOrCode:_9c,wasConsumed:false,preventDefault:function(){_9d.wasConsumed=true;e.preventDefault();},stopPropagation:function(){e.stopPropagation();}});if(this.onInput(_9d)===false){_8f.stop(_9d);}if(_9d.wasConsumed){return;}setTimeout(_91.hitch(this,"_onInput",_9d),0);};_8d.forEach(["onkeydown","onkeypress","onpaste","oncut","oninput"],function(_9e){this.connect(this.textbox,_9e,_9b);},this);},_blankValue:"",filter:function(val){if(val===null){return this._blankValue;}if(typeof val!="string"){return val;}if(this.trim){val=_91.trim(val);}if(this.uppercase){val=val.toUpperCase();}if(this.lowercase){val=val.toLowerCase();}if(this.propercase){val=val.replace(/[^\s]+/g,function(_9f){return _9f.substring(0,1).toUpperCase()+_9f.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()){_93.selectInputText(this.textbox);}});}this.inherited(arguments);this._refreshState();},reset:function(){this.textbox.value="";this.inherited(arguments);},_setTextDirAttr:function(_a0){if(!this._created||this.textDir!=_a0){this._set("textDir",_a0);this.applyTextDir(this.focusNode,this.focusNode.value);}}});_93._setSelectionRange=_92._setSelectionRange=function(_a1,_a2,_a3){if(_a1.setSelectionRange){_a1.setSelectionRange(_a2,_a3);}};_93.selectInputText=_92.selectInputText=function(_a4,_a5,_a6){_a4=dom.byId(_a4);if(isNaN(_a5)){_a5=0;}if(isNaN(_a6)){_a6=_a4.value?_a4.value.length:0;}try{_a4.focus();_93._setSelectionRange(_a4,_a5,_a6);}catch(e){}};return _93;});},"dojox/mobile/parser":function(){define(["dojo/_base/kernel","dojo/_base/config","dojo/_base/lang","dojo/_base/window","dojo/ready"],function(_a7,_a8,_a9,win,_aa){var dm=_a9.getObject("dojox.mobile",true);var _ab=new function(){this.instantiate=function(_ac,_ad,_ae){_ad=_ad||{};_ae=_ae||{};var i,ws=[];if(_ac){for(i=0;i<_ac.length;i++){var n=_ac[i];var cls=_a9.getObject(n.getAttribute("dojoType")||n.getAttribute("data-dojo-type"));var _af=cls.prototype;var _b0={},_b1,v,t;_a9.mixin(_b0,eval("({"+(n.getAttribute("data-dojo-props")||"")+"})"));_a9.mixin(_b0,_ae.defaults);_a9.mixin(_b0,_ad);for(_b1 in _af){v=n.getAttributeNode(_b1);v=v&&v.nodeValue;t=typeof _af[_b1];if(!v&&(t!=="boolean"||v!=="")){continue;}if(t==="string"){_b0[_b1]=v;}else{if(t==="number"){_b0[_b1]=v-0;}else{if(t==="boolean"){_b0[_b1]=(v!=="false");}else{if(t==="object"){_b0[_b1]=eval("("+v+")");}}}}}_b0["class"]=n.className;_b0.style=n.style&&n.style.cssText;v=n.getAttribute("data-dojo-attach-point");if(v){_b0.dojoAttachPoint=v;}v=n.getAttribute("data-dojo-attach-event");if(v){_b0.dojoAttachEvent=v;}var _b2=new cls(_b0,n);ws.push(_b2);var _b3=n.getAttribute("jsId")||n.getAttribute("data-dojo-id");if(_b3){_a9.setObject(_b3,_b2);}}for(i=0;i<ws.length;i++){var w=ws[i];!_ae.noStart&&w.startup&&!w._started&&w.startup();}}return ws;};this.parse=function(_b4,_b5){if(!_b4){_b4=win.body();}else{if(!_b5&&_b4.rootNode){_b5=_b4;_b4=_b4.rootNode;}}var _b6=_b4.getElementsByTagName("*");var i,_b7=[];for(i=0;i<_b6.length;i++){var n=_b6[i];if(n.getAttribute("dojoType")||n.getAttribute("data-dojo-type")){_b7.push(n);}}var _b8=_b5&&_b5.template?{template:true}:null;return this.instantiate(_b7,_b8,_b5);};}();if(_a8.parseOnLoad){_aa(100,_ab,"parse");}dm.parser=_ab;_a7.parser=_ab;return _ab;});},"dijit/_Container":function(){define("dijit/_Container",["dojo/_base/array","dojo/_base/declare","dojo/dom-construct","./registry"],function(_b9,_ba,_bb,_bc){return _ba("dijit._Container",null,{buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}},addChild:function(_bd,_be){var _bf=this.containerNode;if(_be&&typeof _be=="number"){var _c0=this.getChildren();if(_c0&&_c0.length>=_be){_bf=_c0[_be-1].domNode;_be="after";}}_bb.place(_bd.domNode,_bf,_be);if(this._started&&!_bd._started){_bd.startup();}},removeChild:function(_c1){if(typeof _c1=="number"){_c1=this.getChildren()[_c1];}if(_c1){var _c2=_c1.domNode;if(_c2&&_c2.parentNode){_c2.parentNode.removeChild(_c2);}}},hasChildren:function(){return this.getChildren().length>0;},_getSiblingOfChild:function(_c3,dir){var _c4=_c3.domNode,_c5=(dir>0?"nextSibling":"previousSibling");do{_c4=_c4[_c5];}while(_c4&&(_c4.nodeType!=1||!_bc.byNode(_c4)));return _c4&&_bc.byNode(_c4);},getIndexOfChild:function(_c6){return _b9.indexOf(this.getChildren(),_c6);}});});},"dojox/mobile/app/SceneController":function(){define(["dijit","dojo","dojox","dojo/require!dojox/mobile/_base"],function(_c7,_c8,_c9){_c8.provide("dojox.mobile.app.SceneController");_c8.experimental("dojox.mobile.app.SceneController");_c8.require("dojox.mobile._base");(function(){var app=_c9.mobile.app;var _ca={};_c8.declare("dojox.mobile.app.SceneController",_c9.mobile.View,{stageController:null,keepScrollPos:false,init:function(_cb,_cc){this.sceneName=_cb;this.params=_cc;var _cd=app.resolveTemplate(_cb);this._deferredInit=new _c8.Deferred();if(_ca[_cb]){this._setContents(_ca[_cb]);}else{_c8.xhrGet({url:_cd,handleAs:"text"}).addCallback(_c8.hitch(this,this._setContents));}return this._deferredInit;},_setContents:function(_ce){_ca[this.sceneName]=_ce;this.domNode.innerHTML="<div>"+_ce+"</div>";var _cf="";var _d0=this.sceneName.split("-");for(var i=0;i<_d0.length;i++){_cf+=_d0[i].substring(0,1).toUpperCase()+_d0[i].substring(1);}_cf+="Assistant";this.sceneAssistantName=_cf;var _d1=this;_c9.mobile.app.loadResourcesForScene(this.sceneName,function(){var _d2;if(typeof (_c8.global[_cf])!="undefined"){_d1._initAssistant();}else{var _d3=app.resolveAssistant(_d1.sceneName);_c8.xhrGet({url:_d3,handleAs:"text"}).addCallback(function(_d4){try{_c8.eval(_d4);}catch(e){throw e;}_d1._initAssistant();});}});},_initAssistant:function(){var cls=_c8.getObject(this.sceneAssistantName);if(!cls){throw Error("Unable to resolve scene assistant "+this.sceneAssistantName);}this.assistant=new cls(this.params);this.assistant.controller=this;this.assistant.domNode=this.domNode.firstChild;this.assistant.setup();this._deferredInit.callback();},query:function(_d5,_d6){return _c8.query(_d5,_d6||this.domNode);},parse:function(_d7){var _d8=this._widgets=_c9.mobile.parser.parse(_d7||this.domNode,{controller:this});for(var i=0;i<_d8.length;i++){_d8[i].set("controller",this);}},getWindowSize:function(){return {w:_c8.global.innerWidth,h:_c8.global.innerHeight};},showAlertDialog:function(_d9){var _da=_c8.marginBox(this.assistant.domNode);var _db=new _c9.mobile.app.AlertDialog(_c8.mixin(_d9,{controller:this}));this.assistant.domNode.appendChild(_db.domNode);_db.show();},popupSubMenu:function(_dc){var _dd=new _c9.mobile.app.ListSelector({controller:this,destroyOnHide:true,onChoose:_dc.onChoose});this.assistant.domNode.appendChild(_dd.domNode);_dd.set("data",_dc.choices);_dd.show(_dc.fromNode);}});})();});},"dojox/mobile/app/_base":function(){define(["dijit","dojo","dojox","dojo/require!dijit/_base,dijit/_WidgetBase,dojox/mobile,dojox/mobile/parser,dojox/mobile/Button,dojox/mobile/app/_event,dojox/mobile/app/_Widget,dojox/mobile/app/StageController,dojox/mobile/app/SceneController,dojox/mobile/app/SceneAssistant,dojox/mobile/app/AlertDialog,dojox/mobile/app/List,dojox/mobile/app/ListSelector,dojox/mobile/app/TextBox,dojox/mobile/app/ImageView,dojox/mobile/app/ImageThumbView"],function(_de,_df,_e0){_df.provide("dojox.mobile.app._base");_df.experimental("dojox.mobile.app._base");_df.require("dijit._base");_df.require("dijit._WidgetBase");_df.require("dojox.mobile");_df.require("dojox.mobile.parser");_df.require("dojox.mobile.Button");_df.require("dojox.mobile.app._event");_df.require("dojox.mobile.app._Widget");_df.require("dojox.mobile.app.StageController");_df.require("dojox.mobile.app.SceneController");_df.require("dojox.mobile.app.SceneAssistant");_df.require("dojox.mobile.app.AlertDialog");_df.require("dojox.mobile.app.List");_df.require("dojox.mobile.app.ListSelector");_df.require("dojox.mobile.app.TextBox");_df.require("dojox.mobile.app.ImageView");_df.require("dojox.mobile.app.ImageThumbView");(function(){var _e1;var _e2;var _e3=["dojox.mobile","dojox.mobile.parser"];var _e4={};var _e5;var _e6;var _e7=[];function _e8(_e9,_ea){var _eb;var url;do{_eb=_e9.pop();if(_eb.source){url=_eb.source;}else{if(_eb.module){url=_df.moduleUrl(_eb.module)+".js";}else{return;}}}while(_e9.length>0&&_e4[url]);if(_e9.length<1&&_e4[url]){_ea();return;}_df.xhrGet({url:url,sync:false}).addCallbacks(function(_ec){_df["eval"](_ec);_e4[url]=true;if(_e9.length>0){_e8(_e9,_ea);}else{_ea();}},function(){});};var _ed=function(){_e1=new _e0.mobile.app.StageController(_e6);var _ee={id:"com.test.app",version:"1.0.0",initialScene:"main"};if(_df.global["appInfo"]){_df.mixin(_ee,_df.global["appInfo"]);}_e2=_e0.mobile.app.info=_ee;if(_e2.title){var _ef=_df.query("head title")[0]||_df.create("title",{},_df.query("head")[0]);document.title=_e2.title;}_e1.pushScene(_e2.initialScene);};var _f0=function(){var _f1=false;if(_df.global.BackButton){BackButton.override();_df.connect(document,"backKeyDown",function(e){_df.publish("/dojox/mobile/app/goback");});_f1=true;}else{if(_df.global.Mojo){}}if(_f1){_df.addClass(_df.body(),"mblNativeBack");}};_df.mixin(_e0.mobile.app,{init:function(_f2){_e6=_f2||_df.body();_e0.mobile.app.STAGE_CONTROLLER_ACTIVE=true;_df.subscribe("/dojox/mobile/app/goback",function(){_e1.popScene();});_df.subscribe("/dojox/mobile/app/alert",function(_f3){_e0.mobile.app.getActiveSceneController().showAlertDialog(_f3);});_df.subscribe("/dojox/mobile/app/pushScene",function(_f4,_f5){_e1.pushScene(_f4,_f5||{});});_df.xhrGet({url:"view-resources.json",load:function(_f6){var _f7=[];if(_f6){_e7=_f6=_df.fromJson(_f6);for(var i=0;i<_f6.length;i++){if(!_f6[i].scene){_f7.push(_f6[i]);}}}if(_f7.length>0){_e8(_f7,_ed);}else{_ed();}},error:_ed});_f0();},getActiveSceneController:function(){return _e1.getActiveSceneController();},getStageController:function(){return _e1;},loadResources:function(_f8,_f9){_e8(_f8,_f9);},loadResourcesForScene:function(_fa,_fb){var _fc=[];for(var i=0;i<_e7.length;i++){if(_e7[i].scene==_fa){_fc.push(_e7[i]);}}if(_fc.length>0){_e8(_fc,_fb);}else{_fb();}},resolveTemplate:function(_fd){return "app/views/"+_fd+"/"+_fd+"-scene.html";},resolveAssistant:function(_fe){return "app/assistants/"+_fe+"-assistant.js";}});})();});},"dijit/_base/scroll":function(){define("dijit/_base/scroll",["dojo/window",".."],function(_ff,_100){_100.scrollIntoView=function(node,pos){_ff.scrollIntoView(node,pos);};});},"dojo/fx":function(){define(["./_base/lang","./Evented","./_base/kernel","./_base/array","./_base/connect","./_base/fx","./dom","./dom-style","./dom-geometry","./ready","require"],function(lang,_101,dojo,_102,_103,_104,dom,_105,geom,_106,_107){if(!dojo.isAsync){_106(0,function(){var _108=["./fx/Toggler"];_107(_108);});}var _109=dojo.fx={};var _10a={_fire:function(evt,args){if(this[evt]){this[evt].apply(this,args||[]);}return this;}};var _10b=function(_10c){this._index=-1;this._animations=_10c||[];this._current=this._onAnimateCtx=this._onEndCtx=null;this.duration=0;_102.forEach(this._animations,function(a){this.duration+=a.duration;if(a.delay){this.duration+=a.delay;}},this);};_10b.prototype=new _101();lang.extend(_10b,{_onAnimate:function(){this._fire("onAnimate",arguments);},_onEnd:function(){_103.disconnect(this._onAnimateCtx);_103.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=_103.connect(this._current,"onAnimate",this,"_onAnimate");this._onEndCtx=_103.connect(this._current,"onEnd",this,"_onEnd");this._current.play(0,true);}},play:function(_10d,_10e){if(!this._current){this._current=this._animations[this._index=0];}if(!_10e&&this._current.status()=="playing"){return this;}var _10f=_103.connect(this._current,"beforeBegin",this,function(){this._fire("beforeBegin");}),_110=_103.connect(this._current,"onBegin",this,function(arg){this._fire("onBegin",arguments);}),_111=_103.connect(this._current,"onPlay",this,function(arg){this._fire("onPlay",arguments);_103.disconnect(_10f);_103.disconnect(_110);_103.disconnect(_111);});if(this._onAnimateCtx){_103.disconnect(this._onAnimateCtx);}this._onAnimateCtx=_103.connect(this._current,"onAnimate",this,"_onAnimate");if(this._onEndCtx){_103.disconnect(this._onEndCtx);}this._onEndCtx=_103.connect(this._current,"onEnd",this,"_onEnd");this._current.play.apply(this._current,arguments);return this;},pause:function(){if(this._current){var e=_103.connect(this._current,"onPause",this,function(arg){this._fire("onPause",arguments);_103.disconnect(e);});this._current.pause();}return this;},gotoPercent:function(_112,_113){this.pause();var _114=this.duration*_112;this._current=null;_102.some(this._animations,function(a){if(a.duration<=_114){this._current=a;return true;}_114-=a.duration;return false;});if(this._current){this._current.gotoPercent(_114/this._current.duration,_113);}return this;},stop:function(_115){if(this._current){if(_115){for(;this._index+1<this._animations.length;++this._index){this._animations[this._index].stop(true);}this._current=this._animations[this._index];}var e=_103.connect(this._current,"onStop",this,function(arg){this._fire("onStop",arguments);_103.disconnect(e);});this._current.stop();}return this;},status:function(){return this._current?this._current.status():"stopped";},destroy:function(){if(this._onAnimateCtx){_103.disconnect(this._onAnimateCtx);}if(this._onEndCtx){_103.disconnect(this._onEndCtx);}}});lang.extend(_10b,_10a);_109.chain=function(_116){return new _10b(_116);};var _117=function(_118){this._animations=_118||[];this._connects=[];this._finished=0;this.duration=0;_102.forEach(_118,function(a){var _119=a.duration;if(a.delay){_119+=a.delay;}if(this.duration<_119){this.duration=_119;}this._connects.push(_103.connect(a,"onEnd",this,"_onEnd"));},this);this._pseudoAnimation=new _104.Animation({curve:[0,1],duration:this.duration});var self=this;_102.forEach(["beforeBegin","onBegin","onPlay","onAnimate","onPause","onStop","onEnd"],function(evt){self._connects.push(_103.connect(self._pseudoAnimation,evt,function(){self._fire(evt,arguments);}));});};lang.extend(_117,{_doAction:function(_11a,args){_102.forEach(this._animations,function(a){a[_11a].apply(a,args);});return this;},_onEnd:function(){if(++this._finished>this._animations.length){this._fire("onEnd");}},_call:function(_11b,args){var t=this._pseudoAnimation;t[_11b].apply(t,args);},play:function(_11c,_11d){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(_11e,_11f){var ms=this.duration*_11e;_102.forEach(this._animations,function(a){a.gotoPercent(a.duration<ms?1:(ms/a.duration),_11f);});this._call("gotoPercent",arguments);return this;},stop:function(_120){this._doAction("stop",arguments);this._call("stop",arguments);return this;},status:function(){return this._pseudoAnimation.status();},destroy:function(){_102.forEach(this._connects,_103.disconnect);}});lang.extend(_117,_10a);_109.combine=function(_121){return new _117(_121);};_109.wipeIn=function(args){var node=args.node=dom.byId(args.node),s=node.style,o;var anim=_104.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 _122=_105.get(node,"height");return Math.max(_122,1);}},end:function(){return node.scrollHeight;}}}},args));var fini=function(){s.height="auto";s.overflow=o;};_103.connect(anim,"onStop",fini);_103.connect(anim,"onEnd",fini);return anim;};_109.wipeOut=function(args){var node=args.node=dom.byId(args.node),s=node.style,o;var anim=_104.animateProperty(lang.mixin({properties:{height:{end:1}}},args));_103.connect(anim,"beforeBegin",function(){o=s.overflow;s.overflow="hidden";s.display="";});var fini=function(){s.overflow=o;s.height="auto";s.display="none";};_103.connect(anim,"onStop",fini);_103.connect(anim,"onEnd",fini);return anim;};_109.slideTo=function(args){var node=args.node=dom.byId(args.node),top=null,left=null;var init=(function(n){return function(){var cs=_105.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=_104.animateProperty(lang.mixin({properties:{top:args.top||0,left:args.left||0}},args));_103.connect(anim,"beforeBegin",anim,init);return anim;};return _109;});},"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(_123){return _123._base;});},"dojox/mobile/sniff":function(){define("dojox/mobile/sniff",["dojo/_base/window","dojo/_base/sniff"],function(win,has){var ua=navigator.userAgent;has.add("bb",ua.indexOf("BlackBerry")>=0&&parseFloat(ua.split("Version/")[1])||undefined,undefined,true);has.add("android",parseFloat(ua.split("Android ")[1])||undefined,undefined,true);if(ua.match(/(iPhone|iPod|iPad)/)){var p=RegExp.$1.replace(/P/,"p");var v=ua.match(/OS ([\d_]+)/)?RegExp.$1:"1";var os=parseFloat(v.replace(/_/,".").replace(/_/g,""));has.add(p,os,undefined,true);has.add("iphone",os,undefined,true);}if(has("webkit")){has.add("touch",(typeof win.doc.documentElement.ontouchstart!="undefined"&&navigator.appVersion.indexOf("Mobile")!=-1)||!!has("android"),undefined,true);}return has;});},"dojox/mobile/ProgressIndicator":function(){define("dojox/mobile/ProgressIndicator",["dojo/_base/config","dojo/_base/declare","dojo/dom-construct","dojo/dom-style","dojo/has"],function(_124,_125,_126,_127,has){var cls=_125("dojox.mobile.ProgressIndicator",null,{interval:100,colors:["#C0C0C0","#C0C0C0","#C0C0C0","#C0C0C0","#C0C0C0","#C0C0C0","#B8B9B8","#AEAFAE","#A4A5A4","#9A9A9A","#8E8E8E","#838383"],constructor:function(){this._bars=[];this.domNode=_126.create("DIV");this.domNode.className="mblProgContainer";if(_124["mblAndroidWorkaround"]!==false&&has("android")>=2.2&&has("android")<3){_127.set(this.domNode,"webkitTransform","translate3d(0,0,0)");}this.spinnerNode=_126.create("DIV",null,this.domNode);for(var i=0;i<this.colors.length;i++){var div=_126.create("DIV",{className:"mblProg mblProg"+i},this.spinnerNode);this._bars.push(div);}},start:function(){if(this.imageNode){var img=this.imageNode;var l=Math.round((this.domNode.offsetWidth-img.offsetWidth)/2);var t=Math.round((this.domNode.offsetHeight-img.offsetHeight)/2);img.style.margin=t+"px "+l+"px";return;}var cntr=0;var _128=this;var n=this.colors.length;this.timer=setInterval(function(){cntr--;cntr=cntr<0?n-1:cntr;var c=_128.colors;for(var i=0;i<n;i++){var idx=(cntr+i)%n;_128._bars[i].style.backgroundColor=c[idx];}},this.interval);},stop:function(){if(this.timer){clearInterval(this.timer);}this.timer=null;if(this.domNode.parentNode){this.domNode.parentNode.removeChild(this.domNode);}},setImage:function(file){if(file){this.imageNode=_126.create("IMG",{src:file},this.domNode);this.spinnerNode.style.display="none";}else{if(this.imageNode){this.domNode.removeChild(this.imageNode);this.imageNode=null;}this.spinnerNode.style.display="";}}});cls._instance=null;cls.getInstance=function(){if(!cls._instance){cls._instance=new cls();}return cls._instance;};return cls;});},"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(_129,_12a,_12b,_12c,lang,_12d,has,win,_12e,a11y){return _12a("dijit.form._FormWidgetMixin",null,{name:"",alt:"",value:"",type:"text",tabIndex:"0",_setTabIndexAttr:"focusNode",disabled:false,intermediateChanges:false,scrollOnFocus:true,_setIdAttr:"focusNode",postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onmousedown","_onMouseDown");},_setDisabledAttr:function(_12f){this._set("disabled",_12f);_12b.set(this.focusNode,"disabled",_12f);if(this.valueNode){_12b.set(this.valueNode,"disabled",_12f);}this.focusNode.setAttribute("aria-disabled",_12f);if(_12f){this._set("hovering",false);this._set("active",false);var _130="tabIndex" in this.attributeMap?this.attributeMap.tabIndex:("_setTabIndexAttr" in this)?this._setTabIndexAttr:"focusNode";_129.forEach(lang.isArray(_130)?_130:[_130],function(_131){var node=this[_131];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(e){if(this.scrollOnFocus){_12e.scrollIntoView(this.domNode);}this.inherited(arguments);},isFocusable:function(){return !this.disabled&&this.focusNode&&(_12c.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(_132,_133){if(this._lastValueReported==undefined&&(_133===null||!this._onChangeActive)){this._resetValue=this._lastValueReported=_132;}this._pendingOnChange=this._pendingOnChange||(typeof _132!=typeof this._lastValueReported)||(this.compare(_132,this._lastValueReported)!=0);if((this.intermediateChanges||_133||_133===undefined)&&this._pendingOnChange){this._lastValueReported=_132;this._pendingOnChange=false;if(this._onChangeActive){if(this._onChangeHandle){clearTimeout(this._onChangeHandle);}this._onChangeHandle=setTimeout(lang.hitch(this,function(){this._onChangeHandle=null;this.onChange(_132);}),0);}}},create:function(){this.inherited(arguments);this._onChangeActive=true;},destroy:function(){if(this._onChangeHandle){clearTimeout(this._onChangeHandle);this.onChange(this._lastValueReported);}this.inherited(arguments);},_onMouseDown:function(e){if((!this.focused||!has("ie"))&&!e.ctrlKey&&_12d.isLeft(e)&&this.isFocusable()){var _134=this.connect(win.body(),"onmouseup",function(){if(this.isFocusable()){this.focus();}this.disconnect(_134);});}}});});},"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(_135,_136,_137,_138,_139,lang,on,has,win){var _13a=new function(){var _13b=[];this.pop=function(){var _13c;if(_13b.length){_13c=_13b.pop();_13c.style.display="";}else{if(has("ie")<9){var burl=_137["dojoBlankHtmlUrl"]||_135.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\");'>";_13c=win.doc.createElement(html);}else{_13c=_138.create("iframe");_13c.src="javascript:\"\"";_13c.className="dijitBackgroundIframe";_13c.setAttribute("role","presentation");_139.set(_13c,"opacity",0.1);}_13c.tabIndex=-1;}return _13c;};this.push=function(_13d){_13d.style.display="none";_13b.push(_13d);};}();_136.BackgroundIframe=function(node){if(!node.id){throw new Error("no id");}if(has("ie")||has("mozilla")){var _13e=(this.iframe=_13a.pop());node.appendChild(_13e);if(has("ie")<7||has("quirks")){this.resize(node);this._conn=on(node,"resize",lang.hitch(this,function(){this.resize(node);}));}else{_139.set(_13e,{width:"100%",height:"100%"});}}};lang.extend(_136.BackgroundIframe,{resize:function(node){if(this.iframe){_139.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){_13a.push(this.iframe);delete this.iframe;}}});return _136.BackgroundIframe;});},"dojox/mobile":function(){define([".","dojo/_base/lang","dojox/mobile/_base"],function(_13f,lang,base){lang.getObject("mobile",true,_13f);return _13f.mobile;});},"dijit/form/_FormValueMixin":function(){define("dijit/form/_FormValueMixin",["dojo/_base/declare","dojo/dom-attr","dojo/keys","dojo/_base/sniff","./_FormWidgetMixin"],function(_140,_141,keys,has,_142){return _140("dijit.form._FormValueMixin",_142,{readOnly:false,_setReadOnlyAttr:function(_143){_141.set(this.focusNode,"readOnly",_143);this.focusNode.setAttribute("aria-readonly",_143);this._set("readOnly",_143);},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(_144,_145){this._handleOnChange(_144,_145);},_handleOnChange:function(_146,_147){this._set("value",_146);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);}}}});});},"dojox/mobile/common":function(){define("dojox/mobile/common",["dojo/_base/kernel","dojo/_base/array","dojo/_base/config","dojo/_base/connect","dojo/_base/lang","dojo/_base/window","dojo/dom-class","dojo/dom-construct","dojo/dom-style","dojo/ready","dijit/registry","./sniff","./uacss"],function(dojo,_148,_149,_14a,lang,win,_14b,_14c,_14d,_14e,_14f,has,_150){var dm=lang.getObject("dojox.mobile",true);dm.getScreenSize=function(){return {h:win.global.innerHeight||win.doc.documentElement.clientHeight,w:win.global.innerWidth||win.doc.documentElement.clientWidth};};dm.updateOrient=function(){var dim=dm.getScreenSize();_14b.replace(win.doc.documentElement,dim.h>dim.w?"dj_portrait":"dj_landscape",dim.h>dim.w?"dj_landscape":"dj_portrait");};dm.updateOrient();dm.tabletSize=500;dm.detectScreenSize=function(_151){var dim=dm.getScreenSize();var sz=Math.min(dim.w,dim.h);var from,to;if(sz>=dm.tabletSize&&(_151||(!this._sz||this._sz<dm.tabletSize))){from="phone";to="tablet";}else{if(sz<dm.tabletSize&&(_151||(!this._sz||this._sz>=dm.tabletSize))){from="tablet";to="phone";}}if(to){_14b.replace(win.doc.documentElement,"dj_"+to,"dj_"+from);_14a.publish("/dojox/mobile/screenSize/"+to,[dim]);}this._sz=sz;};dm.detectScreenSize();dm.setupIcon=function(_152,_153){if(_152&&_153){var arr=_148.map(_153.split(/[ ,]/),function(item){return item-0;});var t=arr[0];var r=arr[1]+arr[2];var b=arr[0]+arr[3];var l=arr[1];_14d.set(_152,{clip:"rect("+t+"px "+r+"px "+b+"px "+l+"px)",top:(_152.parentNode?_14d.get(_152,"top"):0)-t+"px",left:-l+"px"});}};dm.hideAddressBarWait=typeof (_149["mblHideAddressBarWait"])==="number"?_149["mblHideAddressBarWait"]:1500;dm.hide_1=function(_154){scrollTo(0,1);var h=dm.getScreenSize().h+"px";if(has("android")){if(_154){win.body().style.minHeight=h;}dm.resizeAll();}else{if(_154||dm._h===h&&h!==win.body().style.minHeight){win.body().style.minHeight=h;dm.resizeAll();}}dm._h=h;};dm.hide_fs=function(){var t=win.body().style.minHeight;win.body().style.minHeight=(dm.getScreenSize().h*2)+"px";scrollTo(0,1);setTimeout(function(){dm.hide_1(1);dm._hiding=false;},1000);};dm.hideAddressBar=function(evt){if(dm.disableHideAddressBar||dm._hiding){return;}dm._hiding=true;dm._h=0;win.body().style.minHeight=(dm.getScreenSize().h*2)+"px";setTimeout(dm.hide_1,0);setTimeout(dm.hide_1,200);setTimeout(dm.hide_1,800);setTimeout(dm.hide_fs,dm.hideAddressBarWait);};dm.resizeAll=function(evt,root){if(dm.disableResizeAll){return;}_14a.publish("/dojox/mobile/resizeAll",[evt,root]);dm.updateOrient();dm.detectScreenSize();var _155=function(w){var _156=w.getParent&&w.getParent();return !!((!_156||!_156.resize)&&w.resize);};var _157=function(w){_148.forEach(w.getChildren(),function(_158){if(_155(_158)){_158.resize();}_157(_158);});};if(root){if(root.resize){root.resize();}_157(root);}else{_148.forEach(_148.filter(_14f.toArray(),_155),function(w){w.resize();});}};dm.openWindow=function(url,_159){win.global.open(url,_159||"_blank");};dm.createDomButton=function(_15a,_15b,_15c){if(!dm._domButtons){if(has("webkit")){var _15d=function(_15e,dic){var i,j;if(!_15e){var dic={};var ss=dojo.doc.styleSheets;for(i=0;i<ss.length;i++){ss[i]&&_15d(ss[i],dic);}return dic;}var _15f=_15e.cssRules||[];for(i=0;i<_15f.length;i++){var rule=_15f[i];if(rule.href&&rule.styleSheet){_15d(rule.styleSheet,dic);}else{if(rule.selectorText){var sels=rule.selectorText.split(/,/);for(j=0;j<sels.length;j++){var sel=sels[j];var n=sel.split(/>/).length-1;if(sel.match(/(mblDomButton\w+)/)){var cls=RegExp.$1;if(!dic[cls]||n>dic[cls]){dic[cls]=n;}}}}}}};dm._domButtons=_15d();}else{dm._domButtons={};}}var s=_15a.className;var node=_15c||_15a;if(s.match(/(mblDomButton\w+)/)&&s.indexOf("/")===-1){var _160=RegExp.$1;var nDiv=4;if(s.match(/(mblDomButton\w+_(\d+))/)){nDiv=RegExp.$2-0;}else{if(dm._domButtons[_160]!==undefined){nDiv=dm._domButtons[_160];}}var _161=null;if(has("bb")&&_149["mblBBBoxShadowWorkaround"]!==false){_161={style:"-webkit-box-shadow:none"};}for(var i=0,p=node;i<nDiv;i++){p=p.firstChild||_14c.create("DIV",_161,p);}if(_15c){setTimeout(function(){_14b.remove(_15a,_160);},0);_14b.add(_15c,_160);}}else{if(s.indexOf(".")!==-1){_14c.create("IMG",{src:s},node);}else{return null;}}_14b.add(node,"mblDomButton");if(_149["mblAndroidWorkaround"]!==false&&has("android")>=2.2){_14d.set(node,"webkitTransform","translate3d(0,0,0)");}!!_15b&&_14d.set(node,_15b);return node;};dm.createIcon=function(icon,_162,node,_163,_164){if(icon&&icon.indexOf("mblDomButton")===0){if(node&&node.className.match(/(mblDomButton\w+)/)){_14b.remove(node,RegExp.$1);}else{node=_14c.create("DIV");}node.title=_163;_14b.add(node,icon);dm.createDomButton(node);}else{if(icon&&icon!=="none"){if(!node||node.nodeName!=="IMG"){node=_14c.create("IMG",{alt:_163});}node.src=(icon||"").replace("${theme}",dm.currentTheme);dm.setupIcon(node,_162);if(_164&&_162){var arr=_162.split(/[ ,]/);_14d.set(_164,{width:arr[2]+"px",height:arr[3]+"px"});}}}if(_164){_164.appendChild(node);}return node;};dm._iw=_149["mblIosWorkaround"]!==false&&has("iphone");if(dm._iw){dm._iwBgCover=_14c.create("div");}if(_149.parseOnLoad){_14e(90,function(){var _165=win.body().getElementsByTagName("*");var i,len,s;len=_165.length;for(i=0;i<len;i++){s=_165[i].getAttribute("dojoType");if(s){if(_165[i].parentNode.getAttribute("lazy")=="true"){_165[i].setAttribute("__dojoType",s);_165[i].removeAttribute("dojoType");}}}});}_14e(function(){dm.detectScreenSize(true);if(_149["mblApplyPageStyles"]!==false){_14b.add(win.doc.documentElement,"mobile");}if(has("chrome")){_14b.add(win.doc.documentElement,"dj_chrome");}if(_149["mblAndroidWorkaround"]!==false&&has("android")>=2.2){if(_149["mblAndroidWorkaroundButtonStyle"]!==false){_14c.create("style",{innerHTML:"BUTTON,INPUT[type='button'],INPUT[type='submit'],INPUT[type='reset'],INPUT[type='file']::-webkit-file-upload-button{-webkit-appearance:none;}"},win.doc.head,"first");}if(has("android")<3){_14d.set(win.doc.documentElement,"webkitTransform","translate3d(0,0,0)");_14a.connect(null,"onfocus",null,function(e){_14d.set(win.doc.documentElement,"webkitTransform","");});_14a.connect(null,"onblur",null,function(e){_14d.set(win.doc.documentElement,"webkitTransform","translate3d(0,0,0)");});}else{if(_149["mblAndroid3Workaround"]!==false){_14d.set(win.doc.documentElement,{webkitBackfaceVisibility:"hidden",webkitPerspective:8000});}}}var f=dm.resizeAll;if(_149["mblHideAddressBar"]!==false&&navigator.appVersion.indexOf("Mobile")!=-1||_149["mblForceHideAddressBar"]===true){dm.hideAddressBar();if(_149["mblAlwaysHideAddressBar"]===true){f=dm.hideAddressBar;}}_14a.connect(null,(win.global.onorientationchange!==undefined&&!has("android"))?"onorientationchange":"onresize",null,f);var _166=win.body().getElementsByTagName("*");var i,len=_166.length,s;for(i=0;i<len;i++){s=_166[i].getAttribute("__dojoType");if(s){_166[i].setAttribute("dojoType",s);_166[i].removeAttribute("__dojoType");}}if(dojo.hash){var _167=function(root){if(!root){return [];}var arr=_14f.findWidgets(root);var _168=arr;for(var i=0;i<_168.length;i++){arr=arr.concat(_167(_168[i].containerNode));}return arr;};_14a.subscribe("/dojo/hashchange",null,function(_169){var view=dm.currentView;if(!view){return;}var _16a=dm._params;if(!_16a){var _16b=_169?_169:dm._defaultView.id;var _16c=_167(view.domNode);var dir=1,_16d="slide";for(i=0;i<_16c.length;i++){var w=_16c[i];if("#"+_16b==w.moveTo){_16d=w.transition;dir=(w instanceof dm.Heading)?-1:1;break;}}_16a=[_16b,dir,_16d];}view.performTransition.apply(view,_16a);dm._params=null;});}win.body().style.visibility="visible";});_14f.getEnclosingWidget=function(node){while(node){var id=node.getAttribute&&node.getAttribute("widgetId");if(id){return _14f.byId(id);}node=node._parentNode||node.parentNode;}return null;};return dm;});},"dojox/mobile/Heading":function(){define(["dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/_base/lang","dojo/_base/window","dojo/dom-class","dojo/dom-construct","dojo/dom-style","dijit/registry","dijit/_Contained","dijit/_Container","dijit/_WidgetBase","./View"],function(_16e,_16f,_170,lang,win,_171,_172,_173,_174,_175,_176,_177,View){var dm=lang.getObject("dojox.mobile",true);return _170("dojox.mobile.Heading",[_177,_176,_175],{back:"",href:"",moveTo:"",transition:"slide",label:"",iconBase:"",backProp:{className:"mblArrowButton"},tag:"H1",buildRendering:function(){this.domNode=this.containerNode=this.srcNodeRef||win.doc.createElement(this.tag);this.domNode.className="mblHeading";if(!this.label){_16e.forEach(this.domNode.childNodes,function(n){if(n.nodeType==3){var v=lang.trim(n.nodeValue);if(v){this.label=v;this.labelNode=_172.create("SPAN",{innerHTML:v},n,"replace");}}},this);}if(!this.labelNode){this.labelNode=_172.create("SPAN",null,this.domNode);}this.labelNode.className="mblHeadingSpanTitle";this.labelDivNode=_172.create("DIV",{className:"mblHeadingDivTitle",innerHTML:this.labelNode.innerHTML},this.domNode);},startup:function(){if(this._started){return;}var _178=this.getParent&&this.getParent();if(!_178||!_178.resize){var _179=this;setTimeout(function(){_179.resize();},0);}this.inherited(arguments);},resize:function(){if(this._btn){this._btn.style.width=this._body.offsetWidth+this._head.offsetWidth+"px";}if(this.labelNode){var _17a,_17b;var _17c=this.containerNode.childNodes;for(var i=_17c.length-1;i>=0;i--){var c=_17c[i];if(c.nodeType===1){if(!_17b&&_171.contains(c,"mblToolBarButton")&&_173.get(c,"float")==="right"){_17b=c;}if(!_17a&&(_171.contains(c,"mblToolBarButton")&&_173.get(c,"float")==="left"||c===this._btn)){_17a=c;}}}if(!this.labelNodeLen&&this.label){this.labelNode.style.display="inline";this.labelNodeLen=this.labelNode.offsetWidth;this.labelNode.style.display="";}var bw=this.domNode.offsetWidth;var rw=_17b?bw-_17b.offsetLeft+5:0;var lw=_17a?_17a.offsetLeft+_17a.offsetWidth+5:0;var tw=this.labelNodeLen||0;_171[bw-Math.max(rw,lw)*2>tw?"add":"remove"](this.domNode,"mblHeadingCenterTitle");}_16e.forEach(this.getChildren(),function(_17d){if(_17d.resize){_17d.resize();}});},_setBackAttr:function(back){if(!back){_172.destroy(this._btn);this._btn=null;this.back="";}else{if(!this._btn){var btn=_172.create("DIV",this.backProp,this.domNode,"first");var head=_172.create("DIV",{className:"mblArrowButtonHead"},btn);var body=_172.create("DIV",{className:"mblArrowButtonBody mblArrowButtonText"},btn);this._body=body;this._head=head;this._btn=btn;this.backBtnNode=btn;this.connect(body,"onclick","onClick");}this.back=back;this._body.innerHTML=this._cv?this._cv(this.back):this.back;}this.resize();},_setLabelAttr:function(_17e){this.label=_17e;this.labelNode.innerHTML=this.labelDivNode.innerHTML=this._cv?this._cv(_17e):_17e;},findCurrentView:function(){var w=this;while(true){w=w.getParent();if(!w){return null;}if(w instanceof View){break;}}return w;},onClick:function(e){var h1=this.domNode;_171.add(h1,"mblArrowButtonSelected");setTimeout(function(){_171.remove(h1,"mblArrowButtonSelected");},1000);if(this.back&&!this.moveTo&&!this.href&&history){history.back();return;}var view=this.findCurrentView();if(view){view.clickedPosX=e.clientX;view.clickedPosY=e.clientY;}this.goTo(this.moveTo,this.href);},goTo:function(_17f,href){var view=this.findCurrentView();if(!view){return;}if(href){view.performTransition(null,-1,this.transition,this,function(){location.href=href;});}else{if(dm.app&&dm.app.STAGE_CONTROLLER_ACTIVE){_16f.publish("/dojox/mobile/app/goback");}else{var node=_174.byId(view.convertToId(_17f));if(node){var _180=node.getParent();while(view){var _181=view.getParent();if(_180===_181){break;}view=_181;}}if(view){view.performTransition(_17f,-1,this.transition);}}}}});});},"dojox/main":function(){define("dojox/main",["dojo/_base/kernel"],function(dojo){return dojo.dojox;});},"dojox/mobile/RoundRectList":function(){define(["dojo/_base/array","dojo/_base/declare","dojo/_base/window","dijit/_Contained","dijit/_Container","dijit/_WidgetBase"],function(_182,_183,win,_184,_185,_186){return _183("dojox.mobile.RoundRectList",[_186,_185,_184],{transition:"slide",iconBase:"",iconPos:"",select:"",stateful:false,buildRendering:function(){this.domNode=this.containerNode=this.srcNodeRef||win.doc.createElement("UL");this.domNode.className="mblRoundRectList";},resize:function(){_182.forEach(this.getChildren(),function(_187){if(_187.resize){_187.resize();}});},onCheckStateChanged:function(_188,_189){},_setStatefulAttr:function(_18a){this.stateful=_18a;_182.forEach(this.getChildren(),function(_18b){_18b.setArrow&&_18b.setArrow();});},deselectItem:function(item){item.deselect();},deselectAll:function(){_182.forEach(this.getChildren(),function(_18c){_18c.deselect&&_18c.deselect();});},selectItem:function(item){item.select();}});});},"dojo/Stateful":function(){define(["./_base/kernel","./_base/declare","./_base/lang","./_base/array"],function(dojo,_18d,lang,_18e){return dojo.declare("dojo.Stateful",null,{postscript:function(_18f){if(_18f){lang.mixin(this,_18f);}},get:function(name){return this[name];},set:function(name,_190){if(typeof name==="object"){for(var x in name){this.set(x,name[x]);}return this;}var _191=this[name];this[name]=_190;if(this._watchCallbacks){this._watchCallbacks(name,_191,_190);}return this;},watch:function(name,_192){var _193=this._watchCallbacks;if(!_193){var self=this;_193=this._watchCallbacks=function(name,_194,_195,_196){var _197=function(_198){if(_198){_198=_198.slice();for(var i=0,l=_198.length;i<l;i++){try{_198[i].call(self,name,_194,_195);}catch(e){console.error(e);}}}};_197(_193["_"+name]);if(!_196){_197(_193["*"]);}};}if(!_192&&typeof name==="function"){_192=name;name="*";}else{name="_"+name;}var _199=_193[name];if(typeof _199!=="object"){_199=_193[name]=[];}_199.push(_192);return {unwatch:function(){_199.splice(_18e.indexOf(_199,_192),1);}};}});});},"dojox/mobile/app/List":function(){define(["dijit","dojo","dojox","dojo/require!dojo/string,dijit/_WidgetBase"],function(_19a,dojo,_19b){dojo.provide("dojox.mobile.app.List");dojo.experimental("dojox.mobile.app.List");dojo.require("dojo.string");dojo.require("dijit._WidgetBase");(function(){var _19c={};dojo.declare("dojox.mobile.app.List",_19a._WidgetBase,{items:null,itemTemplate:"",emptyTemplate:"",dividerTemplate:"",dividerFunction:null,labelDelete:"Delete",labelCancel:"Cancel",controller:null,autoDelete:true,enableDelete:true,enableHold:true,formatters:null,_templateLoadCount:0,_mouseDownPos:null,baseClass:"list",constructor:function(){this._checkLoadComplete=dojo.hitch(this,this._checkLoadComplete);this._replaceToken=dojo.hitch(this,this._replaceToken);this._postDeleteAnim=dojo.hitch(this,this._postDeleteAnim);},postCreate:function(){var _19d=this;if(this.emptyTemplate){this._templateLoadCount++;}if(this.itemTemplate){this._templateLoadCount++;}if(this.dividerTemplate){this._templateLoadCount++;}this.connect(this.domNode,"onmousedown",function(_19e){var _19f=_19e;if(_19e.targetTouches&&_19e.targetTouches.length>0){_19f=_19e.targetTouches[0];}var _1a0=_19d._getRowNode(_19e.target);if(_1a0){_19d._setDataInfo(_1a0,_19e);_19d._selectRow(_1a0);_19d._mouseDownPos={x:_19f.pageX,y:_19f.pageY};_19d._dragThreshold=null;}});this.connect(this.domNode,"onmouseup",function(_1a1){if(_1a1.targetTouches&&_1a1.targetTouches.length>0){_1a1=_1a1.targetTouches[0];}var _1a2=_19d._getRowNode(_1a1.target);if(_1a2){_19d._setDataInfo(_1a2,_1a1);if(_19d._selectedRow){_19d.onSelect(_1a2._data,_1a2._idx,_1a2);}this._deselectRow();}});if(this.enableDelete){this.connect(this.domNode,"mousemove",function(_1a3){dojo.stopEvent(_1a3);if(!_19d._selectedRow){return;}var _1a4=_19d._getRowNode(_1a3.target);if(_19d.enableDelete&&_1a4&&!_19d._deleting){_19d.handleDrag(_1a3);}});}this.connect(this.domNode,"onclick",function(_1a5){if(_1a5.touches&&_1a5.touches.length>0){_1a5=_1a5.touches[0];}var _1a6=_19d._getRowNode(_1a5.target,true);if(_1a6){_19d._setDataInfo(_1a6,_1a5);}});this.connect(this.domNode,"mouseout",function(_1a7){if(_1a7.touches&&_1a7.touches.length>0){_1a7=_1a7.touches[0];}if(_1a7.target==_19d._selectedRow){_19d._deselectRow();}});if(!this.itemTemplate){throw Error("An item template must be provided to "+this.declaredClass);}this._loadTemplate(this.itemTemplate,"itemTemplate",this._checkLoadComplete);if(this.emptyTemplate){this._loadTemplate(this.emptyTemplate,"emptyTemplate",this._checkLoadComplete);}if(this.dividerTemplate){this._loadTemplate(this.dividerTemplate,"dividerTemplate",this._checkLoadComplete);}},handleDrag:function(_1a8){var _1a9=_1a8;if(_1a8.targetTouches&&_1a8.targetTouches.length>0){_1a9=_1a8.targetTouches[0];}var diff=_1a9.pageX-this._mouseDownPos.x;var _1aa=Math.abs(diff);if(_1aa>10&&!this._dragThreshold){this._dragThreshold=dojo.marginBox(this._selectedRow).w*0.6;if(!this.autoDelete){this.createDeleteButtons(this._selectedRow);}}this._selectedRow.style.left=(_1aa>10?diff:0)+"px";if(this._dragThreshold&&this._dragThreshold<_1aa){this.preDelete(diff);}},handleDragCancel:function(){if(this._deleting){return;}dojo.removeClass(this._selectedRow,"hold");this._selectedRow.style.left=0;this._mouseDownPos=null;this._dragThreshold=null;this._deleteBtns&&dojo.style(this._deleteBtns,"display","none");},preDelete:function(_1ab){var self=this;this._deleting=true;dojo.animateProperty({node:this._selectedRow,duration:400,properties:{left:{end:_1ab+((_1ab>0?1:-1)*this._dragThreshold*0.8)}},onEnd:dojo.hitch(this,function(){if(this.autoDelete){this.deleteRow(this._selectedRow);}})}).play();},deleteRow:function(row){dojo.style(row,{visibility:"hidden",minHeight:"0px"});dojo.removeClass(row,"hold");this._deleteAnimConn=this.connect(row,"webkitAnimationEnd",this._postDeleteAnim);dojo.addClass(row,"collapsed");},_postDeleteAnim:function(_1ac){if(this._deleteAnimConn){this.disconnect(this._deleteAnimConn);this._deleteAnimConn=null;}var row=this._selectedRow;var _1ad=row.nextSibling;var _1ae=row.previousSibling;if(_1ae&&_1ae._isDivider){if(!_1ad||_1ad._isDivider){_1ae.parentNode.removeChild(_1ae);}}row.parentNode.removeChild(row);this.onDelete(row._data,row._idx,this.items);while(_1ad){if(_1ad._idx){_1ad._idx--;}_1ad=_1ad.nextSibling;}dojo.destroy(row);dojo.query("> *:not(.buttons)",this.domNode).forEach(this.applyClass);this._deleting=false;this._deselectRow();},createDeleteButtons:function(_1af){var mb=dojo.marginBox(_1af);var pos=dojo._abs(_1af,true);if(!this._deleteBtns){this._deleteBtns=dojo.create("div",{"class":"buttons"},this.domNode);this.buttons=[];this.buttons.push(new _19b.mobile.Button({btnClass:"mblRedButton",label:this.labelDelete}));this.buttons.push(new _19b.mobile.Button({btnClass:"mblBlueButton",label:this.labelCancel}));dojo.place(this.buttons[0].domNode,this._deleteBtns);dojo.place(this.buttons[1].domNode,this._deleteBtns);dojo.addClass(this.buttons[0].domNode,"deleteBtn");dojo.addClass(this.buttons[1].domNode,"cancelBtn");this._handleButtonClick=dojo.hitch(this._handleButtonClick);this.connect(this._deleteBtns,"onclick",this._handleButtonClick);}dojo.removeClass(this._deleteBtns,"fade out fast");dojo.style(this._deleteBtns,{display:"",width:mb.w+"px",height:mb.h+"px",top:(_1af.offsetTop)+"px",left:"0px"});},onDelete:function(data,_1b0,_1b1){_1b1.splice(_1b0,1);if(_1b1.length<1){this.render();}},cancelDelete:function(){this._deleting=false;this.handleDragCancel();},_handleButtonClick:function(_1b2){if(_1b2.touches&&_1b2.touches.length>0){_1b2=_1b2.touches[0];}var node=_1b2.target;if(dojo.hasClass(node,"deleteBtn")){this.deleteRow(this._selectedRow);}else{if(dojo.hasClass(node,"cancelBtn")){this.cancelDelete();}else{return;}}dojo.addClass(this._deleteBtns,"fade out");},applyClass:function(node,idx,_1b3){dojo.removeClass(node,"first last");if(idx==0){dojo.addClass(node,"first");}if(idx==_1b3.length-1){dojo.addClass(node,"last");}},_setDataInfo:function(_1b4,_1b5){_1b5.item=_1b4._data;_1b5.index=_1b4._idx;},onSelect:function(data,_1b6,_1b7){},_selectRow:function(row){if(this._deleting&&this._selectedRow&&row!=this._selectedRow){this.cancelDelete();}if(!dojo.hasClass(row,"row")){return;}if(this.enableHold||this.enableDelete){dojo.addClass(row,"hold");}this._selectedRow=row;},_deselectRow:function(){if(!this._selectedRow||this._deleting){return;}this.handleDragCancel();dojo.removeClass(this._selectedRow,"hold");this._selectedRow=null;},_getRowNode:function(_1b8,_1b9){while(_1b8&&!_1b8._data&&_1b8!=this.domNode){if(!_1b9&&dojo.hasClass(_1b8,"noclick")){return null;}_1b8=_1b8.parentNode;}return _1b8==this.domNode?null:_1b8;},applyTemplate:function(_1ba,data){return dojo._toDom(dojo.string.substitute(_1ba,data,this._replaceToken,this.formatters||this));},render:function(){dojo.query("> *:not(.buttons)",this.domNode).forEach(dojo.destroy);if(this.items.length<1&&this.emptyTemplate){dojo.place(dojo._toDom(this.emptyTemplate),this.domNode,"first");}else{this.domNode.appendChild(this._renderRange(0,this.items.length));}if(dojo.hasClass(this.domNode.parentNode,"mblRoundRect")){dojo.addClass(this.domNode.parentNode,"mblRoundRectList");}var divs=dojo.query("> .row",this.domNode);if(divs.length>0){dojo.addClass(divs[0],"first");dojo.addClass(divs[divs.length-1],"last");}},_renderRange:function(_1bb,_1bc){var rows=[];var row,i;var frag=document.createDocumentFragment();_1bb=Math.max(0,_1bb);_1bc=Math.min(_1bc,this.items.length);for(i=_1bb;i<_1bc;i++){row=this.applyTemplate(this.itemTemplate,this.items[i]);dojo.addClass(row,"row");row._data=this.items[i];row._idx=i;rows.push(row);}if(!this.dividerFunction||!this.dividerTemplate){for(i=_1bb;i<_1bc;i++){rows[i]._data=this.items[i];rows[i]._idx=i;frag.appendChild(rows[i]);}}else{var _1bd=null;var _1be;var _1bf;for(i=_1bb;i<_1bc;i++){rows[i]._data=this.items[i];rows[i]._idx=i;_1be=this.dividerFunction(this.items[i]);if(_1be&&_1be!=_1bd){_1bf=this.applyTemplate(this.dividerTemplate,{label:_1be,item:this.items[i]});_1bf._isDivider=true;frag.appendChild(_1bf);_1bd=_1be;}frag.appendChild(rows[i]);}}return frag;},_replaceToken:function(_1c0,key){if(key.charAt(0)=="!"){_1c0=dojo.getObject(key.substr(1),false,_this);}if(typeof _1c0=="undefined"){return "";}if(_1c0==null){return "";}return key.charAt(0)=="!"?_1c0:_1c0.toString().replace(/"/g,""");},_checkLoadComplete:function(){this._templateLoadCount--;if(this._templateLoadCount<1&&this.get("items")){this.render();}},_loadTemplate:function(url,_1c1,_1c2){if(!url){_1c2();return;}if(_19c[url]){this.set(_1c1,_19c[url]);_1c2();}else{var _1c3=this;dojo.xhrGet({url:url,sync:false,handleAs:"text",load:function(text){_19c[url]=dojo.trim(text);_1c3.set(_1c1,_19c[url]);_1c2();}});}},_setFormattersAttr:function(_1c4){this.formatters=_1c4;},_setItemsAttr:function(_1c5){this.items=_1c5||[];if(this._templateLoadCount<1&&_1c5){this.render();}},destroy:function(){if(this.buttons){dojo.forEach(this.buttons,function(_1c6){_1c6.destroy();});this.buttons=null;}this.inherited(arguments);}});})();});},"dojox/mobile/app/ListSelector":function(){define(["dijit","dojo","dojox","dojo/require!dojox/mobile/app/_Widget,dojo/fx"],function(_1c7,dojo,_1c8){dojo.provide("dojox.mobile.app.ListSelector");dojo.experimental("dojox.mobile.app.ListSelector");dojo.require("dojox.mobile.app._Widget");dojo.require("dojo.fx");dojo.declare("dojox.mobile.app.ListSelector",_1c8.mobile.app._Widget,{data:null,controller:null,onChoose:null,destroyOnHide:false,_setDataAttr:function(data){this.data=data;if(this.data){this.render();}},postCreate:function(){dojo.addClass(this.domNode,"listSelector");var _1c9=this;this.connect(this.domNode,"onclick",function(_1ca){if(!dojo.hasClass(_1ca.target,"listSelectorRow")){return;}if(_1c9.onChoose){_1c9.onChoose(_1c9.data[_1ca.target._idx].value);}_1c9.hide();});this.connect(this.domNode,"onmousedown",function(_1cb){if(!dojo.hasClass(_1cb.target,"listSelectorRow")){return;}dojo.addClass(_1cb.target,"listSelectorRow-selected");});this.connect(this.domNode,"onmouseup",function(_1cc){if(!dojo.hasClass(_1cc.target,"listSelectorRow")){return;}dojo.removeClass(_1cc.target,"listSelectorRow-selected");});this.connect(this.domNode,"onmouseout",function(_1cd){if(!dojo.hasClass(_1cd.target,"listSelectorRow")){return;}dojo.removeClass(_1cd.target,"listSelectorRow-selected");});var _1ce=this.controller.getWindowSize();this.mask=dojo.create("div",{"class":"dialogUnderlayWrapper",innerHTML:"<div class=\"dialogUnderlay\"></div>"},this.controller.assistant.domNode);this.connect(this.mask,"onclick",function(){_1c9.onChoose&&_1c9.onChoose();_1c9.hide();});},show:function(_1cf){var _1d0;var _1d1=this.controller.getWindowSize();var _1d2;if(_1cf){_1d2=dojo._abs(_1cf);_1d0=_1d2;}else{_1d0.x=_1d1.w/2;_1d0.y=200;}dojo.style(this.domNode,{opacity:0,display:"",width:Math.floor(_1d1.w*0.8)+"px"});var _1d3=0;dojo.query(">",this.domNode).forEach(function(node){dojo.style(node,{"float":"left"});_1d3=Math.max(_1d3,dojo.marginBox(node).w);dojo.style(node,{"float":"none"});});_1d3=Math.min(_1d3,Math.round(_1d1.w*0.8))+dojo.style(this.domNode,"paddingLeft")+dojo.style(this.domNode,"paddingRight")+1;dojo.style(this.domNode,"width",_1d3+"px");var _1d4=dojo.marginBox(this.domNode).h;var _1d5=this;var _1d6=_1d2?Math.max(30,_1d2.y-_1d4-10):this.getScroll().y+30;var _1d7=dojo.animateProperty({node:this.domNode,duration:400,properties:{width:{start:1,end:_1d3},height:{start:1,end:_1d4},top:{start:_1d0.y,end:_1d6},left:{start:_1d0.x,end:(_1d1.w/2-_1d3/2)},opacity:{start:0,end:1},fontSize:{start:1}},onEnd:function(){dojo.style(_1d5.domNode,"width","inherit");}});var _1d8=dojo.fadeIn({node:this.mask,duration:400});dojo.fx.combine([_1d7,_1d8]).play();},hide:function(){var _1d9=this;var _1da=dojo.animateProperty({node:this.domNode,duration:500,properties:{width:{end:1},height:{end:1},opacity:{end:0},fontSize:{end:1}},onEnd:function(){if(_1d9.get("destroyOnHide")){_1d9.destroy();}}});var _1db=dojo.fadeOut({node:this.mask,duration:400});dojo.fx.combine([_1da,_1db]).play();},render:function(){dojo.empty(this.domNode);dojo.style(this.domNode,"opacity",0);var row;for(var i=0;i<this.data.length;i++){row=dojo.create("div",{"class":"listSelectorRow "+(this.data[i].className||""),innerHTML:this.data[i].label},this.domNode);row._idx=i;if(i==0){dojo.addClass(row,"first");}if(i==this.data.length-1){dojo.addClass(row,"last");}}},destroy:function(){this.inherited(arguments);dojo.destroy(this.mask);}});});},"dojox/mobile/EdgeToEdgeCategory":function(){define("dojox/mobile/EdgeToEdgeCategory",["dojo/_base/declare","./RoundRectCategory"],function(_1dc,_1dd){return _1dc("dojox.mobile.EdgeToEdgeCategory",_1dd,{buildRendering:function(){this.inherited(arguments);this.domNode.className="mblEdgeToEdgeCategory";}});});},"dojo/string":function(){define(["./_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(_1de,map,_1df,_1e0){_1e0=_1e0||dojo.global;_1df=_1df?lang.hitch(_1e0,_1df):function(v){return v;};return _1de.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_1e1,key,_1e2){var _1e3=lang.getObject(key,false,map);if(_1e2){_1e3=lang.getObject(_1e2,false,_1e0).call(_1e0,_1e3,key);}return _1df(_1e3,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;});},"dojox/mobile/TextBox":function(){define("dojox/mobile/TextBox",["dojo/_base/declare","dojo/dom-construct","dijit/_WidgetBase","dijit/form/_FormValueMixin","dijit/form/_TextBoxMixin"],function(_1e4,_1e5,_1e6,_1e7,_1e8){return _1e4("dojox.mobile.TextBox",[_1e6,_1e7,_1e8],{baseClass:"mblTextBox",_setTypeAttr:null,_setPlaceHolderAttr:"textbox",buildRendering:function(){if(!this.srcNodeRef){this.srcNodeRef=_1e5.create("input",{"type":this.type});}this.inherited(arguments);this.textbox=this.focusNode=this.domNode;},postCreate:function(){this.inherited(arguments);this.connect(this.textbox,"onfocus","_onFocus");this.connect(this.textbox,"onblur","_onBlur");}});});},"dijit/registry":function(){define("dijit/registry",["dojo/_base/array","dojo/_base/sniff","dojo/_base/unload","dojo/_base/window","."],function(_1e9,has,_1ea,win,_1eb){var _1ec={},hash={};var _1ed={length:0,add:function(_1ee){if(hash[_1ee.id]){throw new Error("Tried to register widget with id=="+_1ee.id+" but that id is already registered");}hash[_1ee.id]=_1ee;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(_1ef){var id;do{id=_1ef+"_"+(_1ef in _1ec?++_1ec[_1ef]:_1ec[_1ef]=0);}while(hash[id]);return _1eb._scopeName=="dijit"?id:_1eb._scopeName+"_"+id;},findWidgets:function(root){var _1f0=[];function _1f1(root){for(var node=root.firstChild;node;node=node.nextSibling){if(node.nodeType==1){var _1f2=node.getAttribute("widgetId");if(_1f2){var _1f3=hash[_1f2];if(_1f3){_1f0.push(_1f3);}}else{_1f1(node);}}}};_1f1(root);return _1f0;},_destroyAll:function(){_1eb._curFocus=null;_1eb._prevFocus=null;_1eb._activeStack=[];_1e9.forEach(_1ed.findWidgets(win.body()),function(_1f4){if(!_1f4._destroyed){if(_1f4.destroyRecursive){_1f4.destroyRecursive();}else{if(_1f4.destroy){_1f4.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")){_1ea.addOnWindowUnload(function(){_1ed._destroyAll();});}_1eb.registry=_1ed;return _1ed;});},"dijit/_base/manager":function(){define("dijit/_base/manager",["dojo/_base/array","dojo/_base/config","../registry",".."],function(_1f5,_1f6,_1f7,_1f8){_1f5.forEach(["byId","getUniqueId","findWidgets","_destroyAll","byNode","getEnclosingWidget"],function(name){_1f8[name]=_1f7[name];});_1f8.defaultDuration=_1f6["defaultDuration"]||200;return _1f8;});},"dijit/_base/place":function(){define("dijit/_base/place",["dojo/_base/array","dojo/_base/lang","dojo/window","../place",".."],function(_1f9,lang,_1fa,_1fb,_1fc){_1fc.getViewport=function(){return _1fa.getBox();};_1fc.placeOnScreen=_1fb.at;_1fc.placeOnScreenAroundElement=function(node,_1fd,_1fe,_1ff){var _200;if(lang.isArray(_1fe)){_200=_1fe;}else{_200=[];for(var key in _1fe){_200.push({aroundCorner:key,corner:_1fe[key]});}}return _1fb.around(node,_1fd,_200,true,_1ff);};_1fc.placeOnScreenAroundNode=_1fc.placeOnScreenAroundElement;_1fc.placeOnScreenAroundRectangle=_1fc.placeOnScreenAroundElement;_1fc.getPopupAroundAlignment=function(_201,_202){var _203={};_1f9.forEach(_201,function(pos){var ltr=_202;switch(pos){case "after":_203[_202?"BR":"BL"]=_202?"BL":"BR";break;case "before":_203[_202?"BL":"BR"]=_202?"BR":"BL";break;case "below-alt":ltr=!ltr;case "below":_203[ltr?"BL":"BR"]=ltr?"TL":"TR";_203[ltr?"BR":"BL"]=ltr?"TR":"TL";break;case "above-alt":ltr=!ltr;case "above":default:_203[ltr?"TL":"TR"]=ltr?"BL":"BR";_203[ltr?"TR":"TL"]=ltr?"BR":"BL";break;}});return _203;};return _1fc;});},"dojox/mobile/View":function(){define("dojox/mobile/View",["dojo/_base/kernel","dojo/_base/array","dojo/_base/config","dojo/_base/connect","dojo/_base/declare","dojo/_base/lang","dojo/_base/sniff","dojo/_base/window","dojo/_base/Deferred","dojo/dom","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dijit/registry","dijit/_Contained","dijit/_Container","dijit/_WidgetBase","./ViewController","./transition"],function(dojo,_204,_205,_206,_207,lang,has,win,_208,dom,_209,_20a,_20b,_20c,_20d,_20e,_20f,_210,_211){var dm=lang.getObject("dojox.mobile",true);return _207("dojox.mobile.View",[_20f,_20e,_20d],{selected:false,keepScrollPos:true,constructor:function(_212,node){if(node){dom.byId(node).style.visibility="hidden";}this._aw=has("android")>=2.2&&has("android")<3;},buildRendering:function(){this.domNode=this.containerNode=this.srcNodeRef||win.doc.createElement("DIV");this.domNode.className="mblView";this.connect(this.domNode,"webkitAnimationEnd","onAnimationEnd");this.connect(this.domNode,"webkitAnimationStart","onAnimationStart");if(!_205["mblCSS3Transition"]){this.connect(this.domNode,"webkitTransitionEnd","onAnimationEnd");}var id=location.href.match(/#(\w+)([^\w=]|$)/)?RegExp.$1:null;this._visible=this.selected&&!id||this.id==id;if(this.selected){dm._defaultView=this;}},startup:function(){if(this._started){return;}var _213=[];var _214=this.domNode.parentNode.childNodes;var _215=false;for(var i=0;i<_214.length;i++){var c=_214[i];if(c.nodeType===1&&_209.contains(c,"mblView")){_213.push(c);_215=_215||_20c.byNode(c)._visible;}}var _216=this._visible;if(_213.length===1||(!_215&&_213[0]===this.domNode)){_216=true;}var _217=this;setTimeout(function(){if(!_216){_217.domNode.style.display="none";}else{dm.currentView=_217;_217.onStartView();_206.publish("/dojox/mobile/startView",[_217]);}if(_217.domNode.style.visibility!="visible"){_217.domNode.style.visibility="visible";}var _218=_217.getParent&&_217.getParent();if(!_218||!_218.resize){_217.resize();}},has("ie")?100:0);this.inherited(arguments);},resize:function(){_204.forEach(this.getChildren(),function(_219){if(_219.resize){_219.resize();}});},onStartView:function(){},onBeforeTransitionIn:function(_21a,dir,_21b,_21c,_21d){},onAfterTransitionIn:function(_21e,dir,_21f,_220,_221){},onBeforeTransitionOut:function(_222,dir,_223,_224,_225){},onAfterTransitionOut:function(_226,dir,_227,_228,_229){},_saveState:function(_22a,dir,_22b,_22c,_22d){this._context=_22c;this._method=_22d;if(_22b=="none"){_22b=null;}this._moveTo=_22a;this._dir=dir;this._transition=_22b;this._arguments=lang._toArray(arguments);this._args=[];if(_22c||_22d){for(var i=5;i<arguments.length;i++){this._args.push(arguments[i]);}}},_fixViewState:function(_22e){var _22f=this.domNode.parentNode.childNodes;for(var i=0;i<_22f.length;i++){var n=_22f[i];if(n.nodeType===1&&_209.contains(n,"mblView")){n.className="mblView";}}_22e.className="mblView";},convertToId:function(_230){if(typeof (_230)=="string"){_230.match(/^#?([^&?]+)/);return RegExp.$1;}return _230;},performTransition:function(_231,dir,_232,_233,_234){if(_231==="#"){return;}if(dojo.hash){if(typeof (_231)=="string"&&_231.charAt(0)=="#"&&!dm._params){dm._params=[];for(var i=0;i<arguments.length;i++){dm._params.push(arguments[i]);}dojo.hash(_231);return;}}this._saveState.apply(this,arguments);var _235;if(_231){_235=this.convertToId(_231);}else{if(!this._dummyNode){this._dummyNode=win.doc.createElement("DIV");win.body().appendChild(this._dummyNode);}_235=this._dummyNode;}var _236=this.domNode;var _237=_236.offsetTop;_235=this.toNode=dom.byId(_235);if(!_235){return;}_235.style.visibility=this._aw?"visible":"hidden";_235.style.display="";this._fixViewState(_235);var _238=_20c.byNode(_235);if(_238){if(_205["mblAlwaysResizeOnTransition"]||!_238._resized){dm.resizeAll(null,_238);_238._resized=true;}if(_232&&_232!="none"){_238.containerNode.style.paddingTop=_237+"px";}_238.movedFrom=_236.id;}this.onBeforeTransitionOut.apply(this,arguments);_206.publish("/dojox/mobile/beforeTransitionOut",[this].concat(lang._toArray(arguments)));if(_238){if(this.keepScrollPos&&!this.getParent()){var _239=win.body().scrollTop||win.doc.documentElement.scrollTop||win.global.pageYOffset||0;_236._scrollTop=_239;var _23a=(dir==1)?0:(_235._scrollTop||0);_235.style.top="0px";if(_239>1||_23a!==0){_236.style.top=_23a-_239+"px";if(_205["mblHideAddressBar"]!==false){setTimeout(function(){win.global.scrollTo(0,(_23a||1));},0);}}}else{_235.style.top="0px";}_238.onBeforeTransitionIn.apply(_238,arguments);_206.publish("/dojox/mobile/beforeTransitionIn",[_238].concat(lang._toArray(arguments)));}if(!this._aw){_235.style.display="none";_235.style.visibility="visible";}if(dm._iw&&dm.scrollable){var ss=dm.getScreenSize();win.body().appendChild(dm._iwBgCover);_20b.set(dm._iwBgCover,{position:"absolute",top:"0px",left:"0px",height:(ss.h+1)+"px",width:ss.w+"px",backgroundColor:_20b.get(win.body(),"background-color"),zIndex:-10000,display:""});_20b.set(_235,{position:"absolute",zIndex:-10001,visibility:"visible",display:""});setTimeout(lang.hitch(this,function(){this._doTransition(_236,_235,_232,dir);}),80);}else{this._doTransition(_236,_235,_232,dir);}},_toCls:function(s){return "mbl"+s.charAt(0).toUpperCase()+s.substring(1);},_doTransition:function(_23b,_23c,_23d,dir){var rev=(dir==-1)?" mblReverse":"";if(dm._iw&&dm.scrollable){_20b.set(_23c,{position:"",zIndex:""});win.body().removeChild(dm._iwBgCover);}else{if(!this._aw){_23c.style.display="";}}if(!_23d||_23d=="none"){this.domNode.style.display="none";this.invokeCallback();}else{if(_205["mblCSS3Transition"]){_208.when(_211,lang.hitch(this,function(_23e){var _23f=_20b.get(_23c,"position");_20b.set(_23c,"position","absolute");_208.when(_23e(_23b,_23c,{transition:_23d,reverse:(dir===-1)?true:false}),lang.hitch(this,function(){_20b.set(_23c,"position",_23f);this.invokeCallback();}));}));}else{var s=this._toCls(_23d);_209.add(_23b,s+" mblOut"+rev);_209.add(_23c,s+" mblIn"+rev);setTimeout(function(){_209.add(_23b,"mblTransition");_209.add(_23c,"mblTransition");},100);var _240="50% 50%";var _241="50% 50%";var _242,posX,posY;if(_23d.indexOf("swirl")!=-1||_23d.indexOf("zoom")!=-1){if(this.keepScrollPos&&!this.getParent()){_242=win.body().scrollTop||win.doc.documentElement.scrollTop||win.global.pageYOffset||0;}else{_242=-_20a.position(_23b,true).y;}posY=win.global.innerHeight/2+_242;_240="50% "+posY+"px";_241="50% "+posY+"px";}else{if(_23d.indexOf("scale")!=-1){var _243=_20a.position(_23b,true);posX=((this.clickedPosX!==undefined)?this.clickedPosX:win.global.innerWidth/2)-_243.x;if(this.keepScrollPos&&!this.getParent()){_242=win.body().scrollTop||win.doc.documentElement.scrollTop||win.global.pageYOffset||0;}else{_242=-_243.y;}posY=((this.clickedPosY!==undefined)?this.clickedPosY:win.global.innerHeight/2)+_242;_240=posX+"px "+posY+"px";_241=posX+"px "+posY+"px";}}_20b.set(_23b,{webkitTransformOrigin:_240});_20b.set(_23c,{webkitTransformOrigin:_241});}}dm.currentView=_20c.byNode(_23c);},onAnimationStart:function(e){},onAnimationEnd:function(e){var name=e.animationName||e.target.className;if(name.indexOf("Out")===-1&&name.indexOf("In")===-1&&name.indexOf("Shrink")===-1){return;}var _244=false;if(_209.contains(this.domNode,"mblOut")){_244=true;this.domNode.style.display="none";_209.remove(this.domNode,[this._toCls(this._transition),"mblIn","mblOut","mblReverse"]);}else{this.containerNode.style.paddingTop="";}_20b.set(this.domNode,{webkitTransformOrigin:""});if(name.indexOf("Shrink")!==-1){var li=e.target;li.style.display="none";_209.remove(li,"mblCloseContent");}if(_244){this.invokeCallback();}this.domNode&&(this.domNode.className="mblView");this.clickedPosX=this.clickedPosY=undefined;},invokeCallback:function(){this.onAfterTransitionOut.apply(this,this._arguments);_206.publish("/dojox/mobile/afterTransitionOut",[this].concat(this._arguments));var _245=_20c.byNode(this.toNode);if(_245){_245.onAfterTransitionIn.apply(_245,this._arguments);_206.publish("/dojox/mobile/afterTransitionIn",[_245].concat(this._arguments));_245.movedFrom=undefined;}var c=this._context,m=this._method;if(!c&&!m){return;}if(!m){m=c;c=null;}c=c||win.global;if(typeof (m)=="string"){c[m].apply(c,this._args);}else{m.apply(c,this._args);}},getShowingView:function(){var _246=this.domNode.parentNode.childNodes;for(var i=0;i<_246.length;i++){var n=_246[i];if(n.nodeType===1&&_209.contains(n,"mblView")&&_20b.get(n,"display")!=="none"){return _20c.byNode(n);}}return null;},show:function(){var view=this.getShowingView();if(view){view.domNode.style.display="none";}this.domNode.style.display="";dm.currentView=this;}});});},"dijit/WidgetSet":function(){define("dijit/WidgetSet",["dojo/_base/array","dojo/_base/declare","dojo/_base/window","./registry"],function(_247,_248,win,_249){var _24a=_248("dijit.WidgetSet",null,{constructor:function(){this._hash={};this.length=0;},add:function(_24b){if(this._hash[_24b.id]){throw new Error("Tried to register widget with id=="+_24b.id+" but that id is already registered");}this._hash[_24b.id]=_24b;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(func,_24c){_24c=_24c||win.global;var i=0,id;for(id in this._hash){func.call(_24c,this._hash[id],i++,this._hash);}return this;},filter:function(_24d,_24e){_24e=_24e||win.global;var res=new _24a(),i=0,id;for(id in this._hash){var w=this._hash[id];if(_24d.call(_24e,w,i++,this._hash)){res.add(w);}}return res;},byId:function(id){return this._hash[id];},byClass:function(cls){var res=new _24a(),id,_24f;for(id in this._hash){_24f=this._hash[id];if(_24f.declaredClass==cls){res.add(_24f);}}return res;},toArray:function(){var ar=[];for(var id in this._hash){ar.push(this._hash[id]);}return ar;},map:function(func,_250){return _247.map(this.toArray(),func,_250);},every:function(func,_251){_251=_251||win.global;var x=0,i;for(i in this._hash){if(!func.call(_251,this._hash[i],x++,this._hash)){return false;}}return true;},some:function(func,_252){_252=_252||win.global;var x=0,i;for(i in this._hash){if(func.call(_252,this._hash[i],x++,this._hash)){return true;}}return false;}});_247.forEach(["forEach","filter","byClass","map","every","some"],function(func){_249[func]=_24a.prototype[func];});return _24a;});},"dojo/fx/easing":function(){define(["../_base/lang"],function(lang){var _253={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-_253.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 _253.bounceIn(n*2)/2;}return (_253.bounceOut(n*2-1)/2)+0.5;}};lang.setObject("dojo.fx.easing",_253);return _253;});},"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(_254,_255,_256,dom,_257,_258,has,_259,_25a){var _25b=(_25a._isElementShown=function(elem){var s=_258.get(elem);return (s.visibility!="hidden")&&(s.visibility!="collapsed")&&(s.display!="none")&&(_257.get(elem,"type")!="hidden");});_25a.hasDefaultTabStop=function(elem){switch(elem.nodeName.toLowerCase()){case "a":return _257.has(elem,"href");case "area":case "button":case "input":case "object":case "select":case "textarea":return true;case "iframe":var body;try{var _25c=elem.contentDocument;if("designMode" in _25c&&_25c.designMode=="on"){return true;}body=_25c.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 _25d=(_25a.isTabNavigable=function(elem){if(_257.get(elem,"disabled")){return false;}else{if(_257.has(elem,"tabIndex")){return _257.get(elem,"tabIndex")>=0;}else{return _25a.hasDefaultTabStop(elem);}}});_25a._getTabNavigable=function(root){var _25e,last,_25f,_260,_261,_262,_263={};function _264(node){return node&&node.tagName.toLowerCase()=="input"&&node.type&&node.type.toLowerCase()=="radio"&&node.name&&node.name.toLowerCase();};var _265=function(_266){for(var _267=_266.firstChild;_267;_267=_267.nextSibling){if(_267.nodeType!=1||(has("ie")&&_267.scopeName!=="HTML")||!_25b(_267)){continue;}if(_25d(_267)){var _268=_257.get(_267,"tabIndex");if(!_257.has(_267,"tabIndex")||_268==0){if(!_25e){_25e=_267;}last=_267;}else{if(_268>0){if(!_25f||_268<_260){_260=_268;_25f=_267;}if(!_261||_268>=_262){_262=_268;_261=_267;}}}var rn=_264(_267);if(_257.get(_267,"checked")&&rn){_263[rn]=_267;}}if(_267.nodeName.toUpperCase()!="SELECT"){_265(_267);}}};if(_25b(root)){_265(root);}function rs(node){return _263[_264(node)]||node;};return {first:rs(_25e),last:rs(last),lowest:rs(_25f),highest:rs(_261)};};_25a.getFirstInTabbingOrder=function(root){var _269=_25a._getTabNavigable(dom.byId(root));return _269.lowest?_269.lowest:_269.first;};_25a.getLastInTabbingOrder=function(root){var _26a=_25a._getTabNavigable(dom.byId(root));return _26a.last?_26a.last:_26a.highest;};return {hasDefaultTabStop:_25a.hasDefaultTabStop,isTabNavigable:_25a.isTabNavigable,_getTabNavigable:_25a._getTabNavigable,getFirstInTabbingOrder:_25a.getFirstInTabbingOrder,getLastInTabbingOrder:_25a.getLastInTabbingOrder};});},"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(_26b,_26c,_26d,_26e,lang,on,has,_26f){var _270=(_26f.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,_271,node,_272,obj,_273,_274,_275){if(obj!=this._obj){this.stop();this._initialDelay=_274||500;this._subsequentDelay=_273||0.9;this._minDelay=_275||10;this._obj=obj;this._evt=evt;this._node=node;this._currentTimeout=-1;this._count=-1;this._callback=lang.hitch(_271,_272);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,_276,_277,_278,_279,_27a,_27b){if(_276.keyCode){_276.charOrCode=_276.keyCode;_26e.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}else{if(_276.charCode){_276.charOrCode=String.fromCharCode(_276.charCode);_26e.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}}var _27c=[on(node,_26c._keypress,lang.hitch(this,function(evt){if(evt.charOrCode==_276.charOrCode&&(_276.ctrlKey===undefined||_276.ctrlKey==evt.ctrlKey)&&(_276.altKey===undefined||_276.altKey==evt.altKey)&&(_276.metaKey===undefined||_276.metaKey==(evt.metaKey||false))&&(_276.shiftKey===undefined||_276.shiftKey==evt.shiftKey)){_26d.stop(evt);_270.trigger(evt,_277,node,_278,_276,_279,_27a,_27b);}else{if(_270._obj==_276){_270.stop();}}})),on(node,"keyup",lang.hitch(this,function(){if(_270._obj==_276){_270.stop();}}))];return {remove:function(){_26b.forEach(_27c,function(h){h.remove();});}};},addMouseListener:function(node,_27d,_27e,_27f,_280,_281){var _282=[on(node,"mousedown",lang.hitch(this,function(evt){_26d.stop(evt);_270.trigger(evt,_27d,node,_27e,node,_27f,_280,_281);})),on(node,"mouseup",lang.hitch(this,function(evt){if(this._obj){_26d.stop(evt);}_270.stop();})),on(node,"mouseout",lang.hitch(this,function(evt){_26d.stop(evt);_270.stop();})),on(node,"mousemove",lang.hitch(this,function(evt){evt.preventDefault();})),on(node,"dblclick",lang.hitch(this,function(evt){_26d.stop(evt);if(has("ie")){_270.trigger(evt,_27d,node,_27e,node,_27f,_280,_281);setTimeout(lang.hitch(this,_270.stop),50);}}))];return {remove:function(){_26b.forEach(_282,function(h){h.remove();});}};},addListener:function(_283,_284,_285,_286,_287,_288,_289,_28a){var _28b=[this.addKeyListener(_284,_285,_286,_287,_288,_289,_28a),this.addMouseListener(_283,_286,_287,_288,_289,_28a)];return {remove:function(){_26b.forEach(_28b,function(h){h.remove();});}};}});return _270;});},"dojox/mobile/app/ImageView":function(){define(["dijit","dojo","dojox","dojo/require!dojox/mobile/app/_Widget,dojo/fx/easing"],function(_28c,dojo,_28d){dojo.provide("dojox.mobile.app.ImageView");dojo.experimental("dojox.mobile.app.ImageView");dojo.require("dojox.mobile.app._Widget");dojo.require("dojo.fx.easing");dojo.declare("dojox.mobile.app.ImageView",_28d.mobile.app._Widget,{zoom:1,zoomCenterX:0,zoomCenterY:0,maxZoom:5,autoZoomLevel:3,disableAutoZoom:false,disableSwipe:false,autoZoomEvent:null,_leftImg:null,_centerImg:null,_rightImg:null,_leftSmallImg:null,_centerSmallImg:null,_rightSmallImg:null,constructor:function(){this.panX=0;this.panY=0;this.handleLoad=dojo.hitch(this,this.handleLoad);this._updateAnimatedZoom=dojo.hitch(this,this._updateAnimatedZoom);this._updateAnimatedPan=dojo.hitch(this,this._updateAnimatedPan);this._onAnimPanEnd=dojo.hitch(this,this._onAnimPanEnd);},buildRendering:function(){this.inherited(arguments);this.canvas=dojo.create("canvas",{},this.domNode);dojo.addClass(this.domNode,"mblImageView");},postCreate:function(){this.inherited(arguments);this.size=dojo.marginBox(this.domNode);dojo.style(this.canvas,{width:this.size.w+"px",height:this.size.h+"px"});this.canvas.height=this.size.h;this.canvas.width=this.size.w;var _28e=this;this.connect(this.domNode,"onmousedown",function(_28f){if(_28e.isAnimating()){return;}if(_28e.panX){_28e.handleDragEnd();}_28e.downX=_28f.targetTouches?_28f.targetTouches[0].clientX:_28f.clientX;_28e.downY=_28f.targetTouches?_28f.targetTouches[0].clientY:_28f.clientY;});this.connect(this.domNode,"onmousemove",function(_290){if(_28e.isAnimating()){return;}if((!_28e.downX&&_28e.downX!==0)||(!_28e.downY&&_28e.downY!==0)){return;}if((!_28e.disableSwipe&&_28e.zoom==1)||(!_28e.disableAutoZoom&&_28e.zoom!=1)){var x=_290.targetTouches?_290.targetTouches[0].clientX:_290.pageX;var y=_290.targetTouches?_290.targetTouches[0].clientY:_290.pageY;_28e.panX=x-_28e.downX;_28e.panY=y-_28e.downY;if(_28e.zoom==1){if(Math.abs(_28e.panX)>10){_28e.render();}}else{if(Math.abs(_28e.panX)>10||Math.abs(_28e.panY)>10){_28e.render();}}}});this.connect(this.domNode,"onmouseout",function(_291){if(!_28e.isAnimating()&&_28e.panX){_28e.handleDragEnd();}});this.connect(this.domNode,"onmouseover",function(_292){_28e.downX=_28e.downY=null;});this.connect(this.domNode,"onclick",function(_293){if(_28e.isAnimating()){return;}if(_28e.downX==null||_28e.downY==null){return;}var x=(_293.targetTouches?_293.targetTouches[0].clientX:_293.pageX);var y=(_293.targetTouches?_293.targetTouches[0].clientY:_293.pageY);if(Math.abs(_28e.panX)>14||Math.abs(_28e.panY)>14){_28e.downX=_28e.downY=null;_28e.handleDragEnd();return;}_28e.downX=_28e.downY=null;if(!_28e.disableAutoZoom){if(!_28e._centerImg||!_28e._centerImg._loaded){return;}if(_28e.zoom!=1){_28e.set("animatedZoom",1);return;}var pos=dojo._abs(_28e.domNode);var _294=_28e.size.w/_28e._centerImg.width;var _295=_28e.size.h/_28e._centerImg.height;_28e.zoomTo(((x-pos.x)/_294)-_28e.panX,((y-pos.y)/_295)-_28e.panY,_28e.autoZoomLevel);}});dojo.connect(this.domNode,"flick",this,"handleFlick");},isAnimating:function(){return this._anim&&this._anim.status()=="playing";},handleDragEnd:function(){this.downX=this.downY=null;if(this.zoom==1){if(!this.panX){return;}var _296=(this._leftImg&&this._leftImg._loaded)||(this._leftSmallImg&&this._leftSmallImg._loaded);var _297=(this._rightImg&&this._rightImg._loaded)||(this._rightSmallImg&&this._rightSmallImg._loaded);var _298=!(Math.abs(this.panX)<this._centerImg._baseWidth/2)&&((this.panX>0&&_296?1:0)||(this.panX<0&&_297?1:0));if(!_298){this._animPanTo(0,dojo.fx.easing.expoOut,700);}else{this.moveTo(this.panX);}}else{if(!this.panX&&!this.panY){return;}this.zoomCenterX-=(this.panX/this.zoom);this.zoomCenterY-=(this.panY/this.zoom);this.panX=this.panY=0;}},handleFlick:function(_299){if(this.zoom==1&&_299.duration<500){if(_299.direction=="ltr"){this.moveTo(1);}else{if(_299.direction=="rtl"){this.moveTo(-1);}}this.downX=this.downY=null;}},moveTo:function(_29a){_29a=_29a>0?1:-1;var _29b;if(_29a<1){if(this._rightImg&&this._rightImg._loaded){_29b=this._rightImg;}else{if(this._rightSmallImg&&this._rightSmallImg._loaded){_29b=this._rightSmallImg;}}}else{if(this._leftImg&&this._leftImg._loaded){_29b=this._leftImg;}else{if(this._leftSmallImg&&this._leftSmallImg._loaded){_29b=this._leftSmallImg;}}}this._moveDir=_29a;var _29c=this;if(_29b&&_29b._loaded){this._animPanTo(this.size.w*_29a,null,500,function(){_29c.panX=0;_29c.panY=0;if(_29a<0){_29c._switchImage("left","right");}else{_29c._switchImage("right","left");}_29c.render();_29c.onChange(_29a*-1);});}else{this._animPanTo(0,dojo.fx.easing.expoOut,700);}},_switchImage:function(_29d,_29e){var _29f="_"+_29d+"SmallImg";var _2a0="_"+_29d+"Img";var _2a1="_"+_29e+"SmallImg";var _2a2="_"+_29e+"Img";this[_2a0]=this._centerImg;this[_29f]=this._centerSmallImg;this[_2a0]._type=_29d;if(this[_29f]){this[_29f]._type=_29d;}this._centerImg=this[_2a2];this._centerSmallImg=this[_2a1];this._centerImg._type="center";if(this._centerSmallImg){this._centerSmallImg._type="center";}this[_2a2]=this[_2a1]=null;},_animPanTo:function(to,_2a3,_2a4,_2a5){this._animCallback=_2a5;this._anim=new dojo.Animation({curve:[this.panX,to],onAnimate:this._updateAnimatedPan,duration:_2a4||500,easing:_2a3,onEnd:this._onAnimPanEnd});this._anim.play();return this._anim;},onChange:function(_2a6){},_updateAnimatedPan:function(_2a7){this.panX=_2a7;this.render();},_onAnimPanEnd:function(){this.panX=this.panY=0;if(this._animCallback){this._animCallback();}},zoomTo:function(_2a8,_2a9,zoom){this.set("zoomCenterX",_2a8);this.set("zoomCenterY",_2a9);this.set("animatedZoom",zoom);},render:function(){var cxt=this.canvas.getContext("2d");cxt.clearRect(0,0,this.canvas.width,this.canvas.height);this._renderImg(this._centerSmallImg,this._centerImg,this.zoom==1?(this.panX<0?1:this.panX>0?-1:0):0);if(this.zoom==1&&this.panX!=0){if(this.panX>0){this._renderImg(this._leftSmallImg,this._leftImg,1);}else{this._renderImg(this._rightSmallImg,this._rightImg,-1);}}},_renderImg:function(_2aa,_2ab,_2ac){var img=(_2ab&&_2ab._loaded)?_2ab:_2aa;if(!img||!img._loaded){return;}var cxt=this.canvas.getContext("2d");var _2ad=img._baseWidth;var _2ae=img._baseHeight;var _2af=_2ad*this.zoom;var _2b0=_2ae*this.zoom;var _2b1=Math.min(this.size.w,_2af);var _2b2=Math.min(this.size.h,_2b0);var _2b3=this.dispWidth=img.width*(_2b1/_2af);var _2b4=this.dispHeight=img.height*(_2b2/_2b0);var _2b5=this.zoomCenterX-(this.panX/this.zoom);var _2b6=this.zoomCenterY-(this.panY/this.zoom);var _2b7=Math.floor(Math.max(_2b3/2,Math.min(img.width-_2b3/2,_2b5)));var _2b8=Math.floor(Math.max(_2b4/2,Math.min(img.height-_2b4/2,_2b6)));var _2b9=Math.max(0,Math.round((img.width-_2b3)/2+(_2b7-img._centerX)));var _2ba=Math.max(0,Math.round((img.height-_2b4)/2+(_2b8-img._centerY)));var _2bb=Math.round(Math.max(0,this.canvas.width-_2b1)/2);var _2bc=Math.round(Math.max(0,this.canvas.height-_2b2)/2);var _2bd=_2b1;var _2be=_2b3;if(this.zoom==1&&_2ac&&this.panX){if(this.panX<0){if(_2ac>0){_2b1-=Math.abs(this.panX);_2bb=0;}else{if(_2ac<0){_2b1=Math.max(1,Math.abs(this.panX)-5);_2bb=this.size.w-_2b1;}}}else{if(_2ac>0){_2b1=Math.max(1,Math.abs(this.panX)-5);_2bb=0;}else{if(_2ac<0){_2b1-=Math.abs(this.panX);_2bb=this.size.w-_2b1;}}}_2b3=Math.max(1,Math.floor(_2b3*(_2b1/_2bd)));if(_2ac>0){_2b9=(_2b9+_2be)-(_2b3);}_2b9=Math.floor(_2b9);}try{cxt.drawImage(img,Math.max(0,_2b9),_2ba,Math.min(_2be,_2b3),_2b4,_2bb,_2bc,Math.min(_2bd,_2b1),_2b2);}catch(e){}},_setZoomAttr:function(_2bf){this.zoom=Math.min(this.maxZoom,Math.max(1,_2bf));if(this.zoom==1&&this._centerImg&&this._centerImg._loaded){if(!this.isAnimating()){this.zoomCenterX=this._centerImg.width/2;this.zoomCenterY=this._centerImg.height/2;}this.panX=this.panY=0;}this.render();},_setZoomCenterXAttr:function(_2c0){if(_2c0!=this.zoomCenterX){if(this._centerImg&&this._centerImg._loaded){_2c0=Math.min(this._centerImg.width,_2c0);}this.zoomCenterX=Math.max(0,Math.round(_2c0));}},_setZoomCenterYAttr:function(_2c1){if(_2c1!=this.zoomCenterY){if(this._centerImg&&this._centerImg._loaded){_2c1=Math.min(this._centerImg.height,_2c1);}this.zoomCenterY=Math.max(0,Math.round(_2c1));}},_setZoomCenterAttr:function(_2c2){if(_2c2.x!=this.zoomCenterX||_2c2.y!=this.zoomCenterY){this.set("zoomCenterX",_2c2.x);this.set("zoomCenterY",_2c2.y);this.render();}},_setAnimatedZoomAttr:function(_2c3){if(this._anim&&this._anim.status()=="playing"){return;}this._anim=new dojo.Animation({curve:[this.zoom,_2c3],onAnimate:this._updateAnimatedZoom,onEnd:this._onAnimEnd});this._anim.play();},_updateAnimatedZoom:function(_2c4){this._setZoomAttr(_2c4);},_setCenterUrlAttr:function(_2c5){this._setImage("center",_2c5);},_setLeftUrlAttr:function(_2c6){this._setImage("left",_2c6);},_setRightUrlAttr:function(_2c7){this._setImage("right",_2c7);},_setImage:function(name,_2c8){var _2c9=null;var _2ca=null;if(dojo.isString(_2c8)){_2ca=_2c8;}else{_2ca=_2c8.large;_2c9=_2c8.small;}if(this["_"+name+"Img"]&&this["_"+name+"Img"]._src==_2ca){return;}var _2cb=this["_"+name+"Img"]=new Image();_2cb._type=name;_2cb._loaded=false;_2cb._src=_2ca;_2cb._conn=dojo.connect(_2cb,"onload",this.handleLoad);if(_2c9){var _2cc=this["_"+name+"SmallImg"]=new Image();_2cc._type=name;_2cc._loaded=false;_2cc._conn=dojo.connect(_2cc,"onload",this.handleLoad);_2cc._isSmall=true;_2cc._src=_2c9;_2cc.src=_2c9;}_2cb.src=_2ca;},handleLoad:function(evt){var img=evt.target;img._loaded=true;dojo.disconnect(img._conn);var type=img._type;switch(type){case "center":this.zoomCenterX=img.width/2;this.zoomCenterY=img.height/2;break;}var _2cd=img.height;var _2ce=img.width;if(_2ce/this.size.w<_2cd/this.size.h){img._baseHeight=this.canvas.height;img._baseWidth=_2ce/(_2cd/this.size.h);}else{img._baseWidth=this.canvas.width;img._baseHeight=_2cd/(_2ce/this.size.w);}img._centerX=_2ce/2;img._centerY=_2cd/2;this.render();this.onLoad(img._type,img._src,img._isSmall);},onLoad:function(type,url,_2cf){}});});},"dijit/_base/focus":function(){define("dijit/_base/focus",["dojo/_base/array","dojo/dom","dojo/_base/lang","dojo/topic","dojo/_base/window","../focus",".."],function(_2d0,dom,lang,_2d1,win,_2d2,_2d3){lang.mixin(_2d3,{_curFocus:null,_prevFocus:null,isCollapsed:function(){return _2d3.getBookmark().isCollapsed;},getBookmark:function(){var bm,rg,tg,sel=win.doc.selection,cf=_2d2.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(_2d4){var _2d5=win.doc,mark=_2d4.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(_2d5.selection&&mark){var rg;if(mark.pRange){rg=mark.range;}else{if(lang.isArray(mark)){rg=_2d5.body.createControlRange();_2d0.forEach(mark,function(n){rg.addElement(n);});}else{rg=_2d5.body.createTextRange();rg.moveToBookmark(mark);}}rg.select();}}}},getFocus:function(menu,_2d6){var node=!_2d2.curNode||(menu&&dom.isDescendant(_2d2.curNode,menu.domNode))?_2d3._prevFocus:_2d2.curNode;return {node:node,bookmark:node&&(node==_2d2.curNode)&&win.withGlobal(_2d6||win.global,_2d3.getBookmark),openedForWindow:_2d6};},_activeStack:[],registerIframe:function(_2d7){return _2d2.registerIframe(_2d7);},unregisterIframe:function(_2d8){_2d8&&_2d8.remove();},registerWin:function(_2d9,_2da){return _2d2.registerWin(_2d9,_2da);},unregisterWin:function(_2db){_2db&&_2db.remove();}});_2d2.focus=function(_2dc){if(!_2dc){return;}var node="node" in _2dc?_2dc.node:_2dc,_2dd=_2dc.bookmark,_2de=_2dc.openedForWindow,_2df=_2dd?_2dd.isCollapsed:false;if(node){var _2e0=(node.tagName.toLowerCase()=="iframe")?node.contentWindow:node;if(_2e0&&_2e0.focus){try{_2e0.focus();}catch(e){}}_2d2._onFocusNode(node);}if(_2dd&&win.withGlobal(_2de||win.global,_2d3.isCollapsed)&&!_2df){if(_2de){_2de.focus();}try{win.withGlobal(_2de||win.global,_2d3.moveToBookmark,null,[_2dd]);}catch(e2){}}};_2d2.watch("curNode",function(name,_2e1,_2e2){_2d3._curFocus=_2e2;_2d3._prevFocus=_2e1;if(_2e2){_2d1.publish("focusNode",_2e2);}});_2d2.watch("activeStack",function(name,_2e3,_2e4){_2d3._activeStack=_2e4;});_2d2.on("widget-blur",function(_2e5,by){_2d1.publish("widgetBlur",_2e5,by);});_2d2.on("widget-focus",function(_2e6,by){_2d1.publish("widgetFocus",_2e6,by);});return _2d3;});},"dojox/mobile/ListItem":function(){define("dojox/mobile/ListItem",["dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/_base/lang","dojo/dom-class","dojo/dom-construct","dojo/has","./common","./_ItemBase","./TransitionEvent"],function(_2e7,_2e8,_2e9,lang,_2ea,_2eb,has,_2ec,_2ed,_2ee){return _2e9("dojox.mobile.ListItem",_2ed,{rightText:"",rightIcon:"",rightIcon2:"",anchorLabel:false,noArrow:false,selected:false,checked:false,arrowClass:"mblDomButtonArrow",checkClass:"mblDomButtonCheck",variableHeight:false,rightIconTitle:"",rightIcon2Title:"",btnClass:"",btnClass2:"",tag:"li",postMixInProperties:function(){if(this.btnClass){this.rightIcon=this.btnClass;}this._setBtnClassAttr=this._setRightIconAttr;this._setBtnClass2Attr=this._setRightIcon2Attr;},buildRendering:function(){this.domNode=this.srcNodeRef||_2eb.create(this.tag);this.inherited(arguments);this.domNode.className="mblListItem"+(this.selected?" mblItemSelected":"");var box=this.box=_2eb.create("DIV");box.className="mblListItemTextBox";if(this.anchorLabel){box.style.cursor="pointer";}var r=this.srcNodeRef;if(r&&!this.label){this.label="";for(var i=0,len=r.childNodes.length;i<len;i++){var n=r.firstChild;if(n.nodeType===3&&lang.trim(n.nodeValue)!==""){n.nodeValue=this._cv?this._cv(n.nodeValue):n.nodeValue;this.labelNode=_2eb.create("SPAN",{className:"mblListItemLabel"});this.labelNode.appendChild(n);n=this.labelNode;}box.appendChild(n);}}if(!this.labelNode){this.labelNode=_2eb.create("SPAN",{className:"mblListItemLabel"},box);}if(this.anchorLabel){box.style.display="inline";}var a=this.anchorNode=_2eb.create("A");a.className="mblListItemAnchor";this.domNode.appendChild(a);a.appendChild(box);},startup:function(){if(this._started){return;}this.inheritParams();var _2ef=this.getParent();if(this.moveTo||this.href||this.url||this.clickable||(_2ef&&_2ef.select)){this._onClickHandle=this.connect(this.anchorNode,"onclick","onClick");}this.setArrow();if(_2ea.contains(this.domNode,"mblVariableHeight")){this.variableHeight=true;}if(this.variableHeight){_2ea.add(this.domNode,"mblVariableHeight");setTimeout(lang.hitch(this,"layoutVariableHeight"));}this.set("icon",this.icon);if(!this.checked&&this.checkClass.indexOf(",")!==-1){this.set("checked",this.checked);}this.inherited(arguments);},resize:function(){if(this.variableHeight){this.layoutVariableHeight();}},onClick:function(e){var a=e.currentTarget;var li=a.parentNode;if(_2ea.contains(li,"mblItemSelected")){return;}if(this.anchorLabel){for(var p=e.target;p.tagName!==this.tag.toUpperCase();p=p.parentNode){if(p.className=="mblListItemTextBox"){_2ea.add(p,"mblListItemTextBoxSelected");setTimeout(function(){_2ea.remove(p,"mblListItemTextBoxSelected");},has("android")?300:1000);this.onAnchorLabelClicked(e);return;}}}var _2f0=this.getParent();if(_2f0.select){if(_2f0.select==="single"){if(!this.checked){this.set("checked",true);}}else{if(_2f0.select==="multiple"){this.set("checked",!this.checked);}}}this.select();if(this.href&&this.hrefTarget){_2ec.openWindow(this.href,this.hrefTarget);return;}var _2f1;if(this.moveTo||this.href||this.url||this.scene){_2f1={moveTo:this.moveTo,href:this.href,url:this.url,scene:this.scene,transition:this.transition,transitionDir:this.transitionDir};}else{if(this.transitionOptions){_2f1=this.transitionOptions;}}if(_2f1){this.setTransitionPos(e);return new _2ee(this.domNode,_2f1,e).dispatch();}},select:function(){var _2f2=this.getParent();if(_2f2.stateful){_2f2.deselectAll();}else{var _2f3=this;setTimeout(function(){_2f3.deselect();},has("android")?300:1000);}_2ea.add(this.domNode,"mblItemSelected");},deselect:function(){_2ea.remove(this.domNode,"mblItemSelected");},onAnchorLabelClicked:function(e){},layoutVariableHeight:function(){var h=this.anchorNode.offsetHeight;if(h===this.anchorNodeHeight){return;}this.anchorNodeHeight=h;_2e7.forEach([this.rightTextNode,this.rightIcon2Node,this.rightIconNode,this.iconNode],function(n){if(n){var t=Math.round((h-n.offsetHeight)/2);n.style.marginTop=t+"px";}});},setArrow:function(){if(this.checked){return;}var c="";var _2f4=this.getParent();if(this.moveTo||this.href||this.url||this.clickable){if(!this.noArrow&&!(_2f4&&_2f4.stateful)){c=this.arrowClass;}}if(c){this._setRightIconAttr(c);}},_setIconAttr:function(icon){if(!this.getParent()){return;}this.icon=icon;var a=this.anchorNode;if(!this.iconNode){if(icon){var ref=this.rightIconNode||this.rightIcon2Node||this.rightTextNode||this.box;this.iconNode=_2eb.create("DIV",{className:"mblListItemIcon"},ref,"before");}}else{_2eb.empty(this.iconNode);}if(icon&&icon!=="none"){_2ec.createIcon(icon,this.iconPos,null,this.alt,this.iconNode);if(this.iconPos){_2ea.add(this.iconNode.firstChild,"mblListItemSpriteIcon");}_2ea.remove(a,"mblListItemAnchorNoIcon");}else{_2ea.add(a,"mblListItemAnchorNoIcon");}},_setCheckedAttr:function(_2f5){var _2f6=this.getParent();if(_2f6&&_2f6.select==="single"&&_2f5){_2e7.forEach(_2f6.getChildren(),function(_2f7){_2f7.set("checked",false);});}this._setRightIconAttr(this.checkClass);var _2f8=this.rightIconNode.childNodes;if(_2f8.length===1){this.rightIconNode.style.display=_2f5?"":"none";}else{_2f8[0].style.display=_2f5?"":"none";_2f8[1].style.display=!_2f5?"":"none";}_2ea.toggle(this.domNode,"mblListItemChecked",_2f5);if(_2f6&&this.checked!==_2f5){_2f6.onCheckStateChanged(this,_2f5);}this.checked=_2f5;},_setRightTextAttr:function(text){if(!this.rightTextNode){this.rightTextNode=_2eb.create("DIV",{className:"mblListItemRightText"},this.box,"before");}this.rightText=text;this.rightTextNode.innerHTML=this._cv?this._cv(text):text;},_setRightIconAttr:function(icon){if(!this.rightIconNode){var ref=this.rightIcon2Node||this.rightTextNode||this.box;this.rightIconNode=_2eb.create("DIV",{className:"mblListItemRightIcon"},ref,"before");}else{_2eb.empty(this.rightIconNode);}this.rightIcon=icon;var arr=(icon||"").split(/,/);if(arr.length===1){_2ec.createIcon(icon,null,null,this.rightIconTitle,this.rightIconNode);}else{_2ec.createIcon(arr[0],null,null,this.rightIconTitle,this.rightIconNode);_2ec.createIcon(arr[1],null,null,this.rightIconTitle,this.rightIconNode);}},_setRightIcon2Attr:function(icon){if(!this.rightIcon2Node){var ref=this.rightTextNode||this.box;this.rightIcon2Node=_2eb.create("DIV",{className:"mblListItemRightIcon2"},ref,"before");}else{_2eb.empty(this.rightIcon2Node);}this.rightIcon2=icon;_2ec.createIcon(icon,null,null,this.rightIcon2Title,this.rightIcon2Node);},_setLabelAttr:function(text){this.label=text;this.labelNode.innerHTML=this._cv?this._cv(text):text;}});});},"dojox/mobile/app/StageController":function(){define(["dijit","dojo","dojox","dojo/require!dojox/mobile/app/SceneController"],function(_2f9,dojo,_2fa){dojo.provide("dojox.mobile.app.StageController");dojo.experimental("dojox.mobile.app.StageController");dojo.require("dojox.mobile.app.SceneController");dojo.declare("dojox.mobile.app.StageController",null,{scenes:null,effect:"fade",constructor:function(node){this.domNode=node;this.scenes=[];if(dojo.config.mobileAnim){this.effect=dojo.config.mobileAnim;}},getActiveSceneController:function(){return this.scenes[this.scenes.length-1];},pushScene:function(_2fb,_2fc){if(this._opInProgress){return;}this._opInProgress=true;var node=dojo.create("div",{"class":"scene-wrapper",style:{visibility:"hidden"}},this.domNode);var _2fd=new _2fa.mobile.app.SceneController({},node);if(this.scenes.length>0){this.scenes[this.scenes.length-1].assistant.deactivate();}this.scenes.push(_2fd);var _2fe=this;dojo.forEach(this.scenes,this.setZIndex);_2fd.stageController=this;_2fd.init(_2fb,_2fc).addCallback(function(){if(_2fe.scenes.length==1){_2fd.domNode.style.visibility="visible";_2fe.scenes[_2fe.scenes.length-1].assistant.activate(_2fc);_2fe._opInProgress=false;}else{_2fe.scenes[_2fe.scenes.length-2].performTransition(_2fe.scenes[_2fe.scenes.length-1].domNode,1,_2fe.effect,null,function(){_2fe.scenes[_2fe.scenes.length-1].assistant.activate(_2fc);_2fe._opInProgress=false;});}});},setZIndex:function(_2ff,idx){dojo.style(_2ff.domNode,"zIndex",idx+1);},popScene:function(data){if(this._opInProgress){return;}var _300=this;if(this.scenes.length>1){this._opInProgress=true;this.scenes[_300.scenes.length-2].assistant.activate(data);this.scenes[_300.scenes.length-1].performTransition(_300.scenes[this.scenes.length-2].domNode,-1,this.effect,null,function(){_300._destroyScene(_300.scenes[_300.scenes.length-1]);_300.scenes.splice(_300.scenes.length-1,1);_300._opInProgress=false;});}else{}},popScenesTo:function(_301,data){if(this._opInProgress){return;}while(this.scenes.length>2&&this.scenes[this.scenes.length-2].sceneName!=_301){this._destroyScene(this.scenes[this.scenes.length-2]);this.scenes.splice(this.scenes.length-2,1);}this.popScene(data);},_destroyScene:function(_302){_302.assistant.deactivate();_302.assistant.destroy();_302.destroyRecursive();}});});},"dijit/place":function(){define("dijit/place",["dojo/_base/array","dojo/dom-geometry","dojo/dom-style","dojo/_base/kernel","dojo/_base/window","dojo/window","."],function(_303,_304,_305,_306,win,_307,_308){function _309(node,_30a,_30b,_30c){var view=_307.getBox();if(!node.parentNode||String(node.parentNode.tagName).toLowerCase()!="body"){win.body().appendChild(node);}var best=null;_303.some(_30a,function(_30d){var _30e=_30d.corner;var pos=_30d.pos;var _30f=0;var _310={w:{"L":view.l+view.w-pos.x,"R":pos.x-view.l,"M":view.w}[_30e.charAt(1)],h:{"T":view.t+view.h-pos.y,"B":pos.y-view.t,"M":view.h}[_30e.charAt(0)]};if(_30b){var res=_30b(node,_30d.aroundCorner,_30e,_310,_30c);_30f=typeof res=="undefined"?0:res;}var _311=node.style;var _312=_311.display;var _313=_311.visibility;if(_311.display=="none"){_311.visibility="hidden";_311.display="";}var mb=_304.getMarginBox(node);_311.display=_312;_311.visibility=_313;var _314={"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)}[_30e.charAt(1)],_315={"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)}[_30e.charAt(0)],_316=Math.max(view.l,_314),_317=Math.max(view.t,_315),endX=Math.min(view.l+view.w,_314+mb.w),endY=Math.min(view.t+view.h,_315+mb.h),_318=endX-_316,_319=endY-_317;_30f+=(mb.w-_318)+(mb.h-_319);if(best==null||_30f<best.overflow){best={corner:_30e,aroundCorner:_30d.aroundCorner,x:_316,y:_317,w:_318,h:_319,overflow:_30f,spaceAvailable:_310};}return !_30f;});if(best.overflow&&_30b){_30b(node,best.aroundCorner,best.corner,best.spaceAvailable,_30c);}var l=_304.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";return best;};return (_308.place={at:function(node,pos,_31a,_31b){var _31c=_303.map(_31a,function(_31d){var c={corner:_31d,pos:{x:pos.x,y:pos.y}};if(_31b){c.pos.x+=_31d.charAt(1)=="L"?_31b.x:-_31b.x;c.pos.y+=_31d.charAt(0)=="T"?_31b.y:-_31b.y;}return c;});return _309(node,_31c);},around:function(node,_31e,_31f,_320,_321){var _322=(typeof _31e=="string"||"offsetWidth" in _31e)?_304.position(_31e,true):_31e;if(_31e.parentNode){var _323=_31e.parentNode;while(_323&&_323.nodeType==1&&_323.nodeName!="BODY"){var _324=_304.position(_323,true);var _325=_305.getComputedStyle(_323).overflow;if(_325=="hidden"||_325=="auto"||_325=="scroll"){var _326=Math.min(_322.y+_322.h,_324.y+_324.h);var _327=Math.min(_322.x+_322.w,_324.x+_324.w);_322.x=Math.max(_322.x,_324.x);_322.y=Math.max(_322.y,_324.y);_322.h=_326-_322.y;_322.w=_327-_322.x;}_323=_323.parentNode;}}var x=_322.x,y=_322.y,_328="w" in _322?_322.w:(_322.w=_322.width),_329="h" in _322?_322.h:(_306.deprecated("place.around: dijit.place.__Rectangle: { x:"+x+", y:"+y+", height:"+_322.height+", width:"+_328+" } has been deprecated. Please use { x:"+x+", y:"+y+", h:"+_322.height+", w:"+_328+" }","","2.0"),_322.h=_322.height);var _32a=[];function push(_32b,_32c){_32a.push({aroundCorner:_32b,corner:_32c,pos:{x:{"L":x,"R":x+_328,"M":x+(_328>>1)}[_32b.charAt(1)],y:{"T":y,"B":y+_329,"M":y+(_329>>1)}[_32b.charAt(0)]}});};_303.forEach(_31f,function(pos){var ltr=_320;switch(pos){case "above-centered":push("TM","BM");break;case "below-centered":push("BM","TM");break;case "after-centered":ltr=!ltr;case "before-centered":push(ltr?"ML":"MR",ltr?"MR":"ML");break;case "after":ltr=!ltr;case "before":push(ltr?"TL":"TR",ltr?"TR":"TL");push(ltr?"BL":"BR",ltr?"BR":"BL");break;case "below-alt":ltr=!ltr;case "below":push(ltr?"BL":"BR",ltr?"TL":"TR");push(ltr?"BR":"BL",ltr?"TR":"TL");break;case "above-alt":ltr=!ltr;case "above":push(ltr?"TL":"TR",ltr?"BL":"BR");push(ltr?"TR":"TL",ltr?"BR":"BL");break;default:push(pos.aroundCorner,pos.corner);}});var _32d=_309(node,_32a,_321,{w:_328,h:_329});_32d.aroundNodePos=_322;return _32d;}});});},"dojox/mobile/app/_event":function(){define(["dijit","dojo","dojox"],function(_32e,dojo,_32f){dojo.provide("dojox.mobile.app._event");dojo.experimental("dojox.mobile.app._event.js");dojo.mixin(_32f.mobile.app,{eventMap:{},connectFlick:function(_330,_331,_332){var _333;var _334;var _335=false;var _336;var _337;var _338;var _339;var _33a;var time;var _33b=dojo.connect("onmousedown",_330,function(_33c){_335=false;_333=_33c.targetTouches?_33c.targetTouches[0].clientX:_33c.clientX;_334=_33c.targetTouches?_33c.targetTouches[0].clientY:_33c.clientY;time=(new Date()).getTime();_338=dojo.connect(_330,"onmousemove",_33d);_339=dojo.connect(_330,"onmouseup",onUp);});var _33d=function(_33e){dojo.stopEvent(_33e);_336=_33e.targetTouches?_33e.targetTouches[0].clientX:_33e.clientX;_337=_33e.targetTouches?_33e.targetTouches[0].clientY:_33e.clientY;if(Math.abs(Math.abs(_336)-Math.abs(_333))>15){_335=true;_33a=(_336>_333)?"ltr":"rtl";}else{if(Math.abs(Math.abs(_337)-Math.abs(_334))>15){_335=true;_33a=(_337>_334)?"ttb":"btt";}}};var onUp=function(_33f){dojo.stopEvent(_33f);_338&&dojo.disconnect(_338);_339&&dojo.disconnect(_339);if(_335){var _340={target:_330,direction:_33a,duration:(new Date()).getTime()-time};if(_331&&_332){_331[_332](_340);}else{_332(_340);}}};}});_32f.mobile.app.isIPhone=(dojo.isSafari&&(navigator.userAgent.indexOf("iPhone")>-1||navigator.userAgent.indexOf("iPod")>-1));_32f.mobile.app.isWebOS=(navigator.userAgent.indexOf("webOS")>-1);_32f.mobile.app.isAndroid=(navigator.userAgent.toLowerCase().indexOf("android")>-1);if(_32f.mobile.app.isIPhone||_32f.mobile.app.isAndroid){_32f.mobile.app.eventMap={onmousedown:"ontouchstart",mousedown:"ontouchstart",onmouseup:"ontouchend",mouseup:"ontouchend",onmousemove:"ontouchmove",mousemove:"ontouchmove"};}dojo._oldConnect=dojo._connect;dojo._connect=function(obj,_341,_342,_343,_344){_341=_32f.mobile.app.eventMap[_341]||_341;if(_341=="flick"||_341=="onflick"){if(dojo.global["Mojo"]){_341=Mojo.Event.flick;}else{return _32f.mobile.app.connectFlick(obj,_342,_343);}}return dojo._oldConnect(obj,_341,_342,_343,_344);};});},"dojox/mobile/_base":function(){define("dojox/mobile/_base",["./common","./View","./Heading","./RoundRect","./RoundRectCategory","./EdgeToEdgeCategory","./RoundRectList","./EdgeToEdgeList","./ListItem","./Switch","./ToolBarButton","./ProgressIndicator"],function(_345,View,_346,_347,_348,_349,_34a,_34b,_34c,_34d,_34e,_34f){return _345;});},"dojox/mobile/Button":function(){define(["dojo/_base/array","dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dijit/_WidgetBase","dijit/form/_ButtonMixin","dijit/form/_FormWidgetMixin"],function(_350,_351,_352,_353,_354,_355,_356){return _351("dojox.mobile.Button",[_354,_356,_355],{baseClass:"mblButton",_setTypeAttr:null,duration:1000,_onClick:function(e){var ret=this.inherited(arguments);if(ret&&this.duration>=0){var _357=this.focusNode||this.domNode;var _358=(this.baseClass+" "+this["class"]).split(" ");_358=_350.map(_358,function(c){return c+"Selected";});_352.add(_357,_358);setTimeout(function(){_352.remove(_357,_358);},this.duration);}return ret;},isFocusable:function(){return false;},buildRendering:function(){if(!this.srcNodeRef){this.srcNodeRef=_353.create("button",{"type":this.type});}else{if(this._cv){var n=this.srcNodeRef.firstChild;if(n&&n.nodeType===3){n.nodeValue=this._cv(n.nodeValue);}}}this.inherited(arguments);this.focusNode=this.domNode;},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onclick","_onClick");},_setLabelAttr:function(_359){this.inherited(arguments,[this._cv?this._cv(_359):_359]);}});});},"dojox/mobile/Switch":function(){define("dojox/mobile/Switch",["dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/_base/event","dojo/_base/window","dojo/dom-class","dijit/_Contained","dijit/_WidgetBase","./sniff"],function(_35a,_35b,_35c,_35d,win,_35e,_35f,_360,has){return _35c("dojox.mobile.Switch",[_360,_35f],{value:"on",name:"",leftLabel:"ON",rightLabel:"OFF",_width:53,buildRendering:function(){this.domNode=win.doc.createElement("DIV");var c=(this.srcNodeRef&&this.srcNodeRef.className)||this.className||this["class"];this._swClass=(c||"").replace(/ .*/,"");this.domNode.className="mblSwitch";var _361=this.name?" name=\""+this.name+"\"":"";this.domNode.innerHTML="<div class=\"mblSwitchInner\">"+"<div class=\"mblSwitchBg mblSwitchBgLeft\">"+"<div class=\"mblSwitchText mblSwitchTextLeft\"></div>"+"</div>"+"<div class=\"mblSwitchBg mblSwitchBgRight\">"+"<div class=\"mblSwitchText mblSwitchTextRight\"></div>"+"</div>"+"<div class=\"mblSwitchKnob\"></div>"+"<input type=\"hidden\""+_361+"></div>"+"</div>";var n=this.inner=this.domNode.firstChild;this.left=n.childNodes[0];this.right=n.childNodes[1];this.knob=n.childNodes[2];this.input=n.childNodes[3];},postCreate:function(){this.connect(this.domNode,"onclick","onClick");this.connect(this.domNode,has("touch")?"touchstart":"onmousedown","onTouchStart");this._initialValue=this.value;},_changeState:function(_362,anim){var on=(_362==="on");this.left.style.display="";this.right.style.display="";this.inner.style.left="";if(anim){_35e.add(this.domNode,"mblSwitchAnimation");}_35e.remove(this.domNode,on?"mblSwitchOff":"mblSwitchOn");_35e.add(this.domNode,on?"mblSwitchOn":"mblSwitchOff");var _363=this;setTimeout(function(){_363.left.style.display=on?"":"none";_363.right.style.display=!on?"":"none";_35e.remove(_363.domNode,"mblSwitchAnimation");},anim?300:0);},startup:function(){if(this._swClass.indexOf("Round")!=-1){var r=Math.round(this.domNode.offsetHeight/2);this.createRoundMask(this._swClass,r,this.domNode.offsetWidth);}},createRoundMask:function(_364,r,w){if(!has("webkit")||!_364){return;}if(!this._createdMasks){this._createdMasks=[];}if(this._createdMasks[_364]){return;}this._createdMasks[_364]=1;var ctx=win.doc.getCSSCanvasContext("2d",_364+"Mask",w,100);ctx.fillStyle="#000000";ctx.beginPath();ctx.moveTo(r,0);ctx.arcTo(0,0,0,2*r,r);ctx.arcTo(0,2*r,r,2*r,r);ctx.lineTo(w-r,2*r);ctx.arcTo(w,2*r,w,r,r);ctx.arcTo(w,0,w-r,0,r);ctx.closePath();ctx.fill();},onClick:function(e){if(this._moved){return;}this.value=this.input.value=(this.value=="on")?"off":"on";this._changeState(this.value,true);this.onStateChanged(this.value);},onTouchStart:function(e){this._moved=false;this.innerStartX=this.inner.offsetLeft;if(!this._conn){this._conn=[];this._conn.push(_35b.connect(this.inner,has("touch")?"touchmove":"onmousemove",this,"onTouchMove"));this._conn.push(_35b.connect(this.inner,has("touch")?"touchend":"onmouseup",this,"onTouchEnd"));}this.touchStartX=e.touches?e.touches[0].pageX:e.clientX;this.left.style.display="";this.right.style.display="";_35d.stop(e);},onTouchMove:function(e){e.preventDefault();var dx;if(e.targetTouches){if(e.targetTouches.length!=1){return false;}dx=e.targetTouches[0].clientX-this.touchStartX;}else{dx=e.clientX-this.touchStartX;}var pos=this.innerStartX+dx;var d=10;if(pos<=-(this._width-d)){pos=-this._width;}if(pos>=-d){pos=0;}this.inner.style.left=pos+"px";if(Math.abs(dx)>d){this._moved=true;}},onTouchEnd:function(e){_35a.forEach(this._conn,_35b.disconnect);this._conn=null;if(this.innerStartX==this.inner.offsetLeft){if(has("touch")){var ev=win.doc.createEvent("MouseEvents");ev.initEvent("click",true,true);this.inner.dispatchEvent(ev);}return;}var _365=(this.inner.offsetLeft<-(this._width/2))?"off":"on";this._changeState(_365,true);if(_365!=this.value){this.value=this.input.value=_365;this.onStateChanged(_365);}},onStateChanged:function(_366){},_setValueAttr:function(_367){this._changeState(_367,false);if(this.value!=_367){this.onStateChanged(_367);}this.value=this.input.value=_367;},_setLeftLabelAttr:function(_368){this.leftLabel=_368;this.left.firstChild.innerHTML=this._cv?this._cv(_368):_368;},_setRightLabelAttr:function(_369){this.rightLabel=_369;this.right.firstChild.innerHTML=this._cv?this._cv(_369):_369;},reset:function(){this.set("value",this._initialValue);}});});},"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(_36a,_36b,dom,_36c,_36d,_36e,lang,on,_36f,has,_370,_371,win,_372,a11y,_373,_374){var _375=_36b([_370,_36e],{curNode:null,activeStack:[],constructor:function(){var _376=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);}});_36a.before(_36d,"empty",_376);_36a.before(_36d,"destroy",_376);},registerIframe:function(_377){return this.registerWin(_377.contentWindow,_377);},registerWin:function(_378,_379){var _37a=this;var _37b=function(evt){_37a._justMouseDowned=true;setTimeout(function(){_37a._justMouseDowned=false;},0);if(has("ie")&&evt&&evt.srcElement&&evt.srcElement.parentNode==null){return;}_37a._onTouchNode(_379||evt.target||evt.srcElement,"mouse");};var doc=has("ie")?_378.document.documentElement:_378.document;if(doc){if(has("ie")){_378.document.body.attachEvent("onmousedown",_37b);var _37c=function(evt){var tag=evt.srcElement.tagName.toLowerCase();if(tag=="#document"||tag=="body"){return;}if(a11y.isTabNavigable(evt.srcElement)){_37a._onFocusNode(_379||evt.srcElement);}else{_37a._onTouchNode(_379||evt.srcElement);}};doc.attachEvent("onactivate",_37c);var _37d=function(evt){_37a._onBlurNode(_379||evt.srcElement);};doc.attachEvent("ondeactivate",_37d);return {remove:function(){_378.document.detachEvent("onmousedown",_37b);doc.detachEvent("onactivate",_37c);doc.detachEvent("ondeactivate",_37d);doc=null;}};}else{doc.body.addEventListener("mousedown",_37b,true);doc.body.addEventListener("touchstart",_37b,true);var _37e=function(evt){_37a._onFocusNode(_379||evt.target);};doc.addEventListener("focus",_37e,true);var _37f=function(evt){_37a._onBlurNode(_379||evt.target);};doc.addEventListener("blur",_37f,true);return {remove:function(){doc.body.removeEventListener("mousedown",_37b,true);doc.body.removeEventListener("touchstart",_37b,true);doc.removeEventListener("focus",_37e,true);doc.removeEventListener("blur",_37f,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 _380=[];try{while(node){var _381=_36c.get(node,"dijitPopupParent");if(_381){node=_373.byId(_381).domNode;}else{if(node.tagName&&node.tagName.toLowerCase()=="body"){if(node===win.body()){break;}node=_372.get(node.ownerDocument).frameElement;}else{var id=node.getAttribute&&node.getAttribute("widgetId"),_382=id&&_373.byId(id);if(_382&&!(by=="mouse"&&_382.get("disabled"))){_380.unshift(id);}node=node.parentNode;}}}}catch(e){}this._setStack(_380,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(_383,by){var _384=this.activeStack;this.set("activeStack",_383);for(var _385=0;_385<Math.min(_384.length,_383.length);_385++){if(_384[_385]!=_383[_385]){break;}}var _386;for(var i=_384.length-1;i>=_385;i--){_386=_373.byId(_384[i]);if(_386){_386._hasBeenBlurred=true;_386.set("focused",false);if(_386._focusManager==this){_386._onBlur(by);}this.emit("widget-blur",_386,by);}}for(i=_385;i<_383.length;i++){_386=_373.byId(_383[i]);if(_386){_386.set("focused",true);if(_386._focusManager==this){_386._onFocus(by);}this.emit("widget-focus",_386,by);}}},focus:function(node){if(node){try{node.focus();}catch(e){}}}});var _387=new _375();_36f(function(){var _388=_387.registerWin(win.doc.parentWindow||win.doc.defaultView);if(has("ie")){_371.addOnWindowUnload(function(){_388.remove();_388=null;});}});_374.focus=function(node){_387.focus(node);};for(var attr in _387){if(!/^_/.test(attr)){_374.focus[attr]=typeof _387[attr]=="function"?lang.hitch(_387,attr):_387[attr];}}_387.watch(function(attr,_389,_38a){_374.focus[attr]=_38a;});return _387;});},"dijit/_base/sniff":function(){define("dijit/_base/sniff",["dojo/uacss"],function(){});},"dijit/main":function(){define("dijit/main",["dojo/_base/kernel"],function(dojo){return dojo.dijit;});},"dojox/mobile/RoundRect":function(){define("dojox/mobile/RoundRect",["dojo/_base/array","dojo/_base/declare","dojo/_base/window","dijit/_Contained","dijit/_Container","dijit/_WidgetBase"],function(_38b,_38c,win,_38d,_38e,_38f){return _38c("dojox.mobile.RoundRect",[_38f,_38e,_38d],{shadow:false,buildRendering:function(){this.domNode=this.containerNode=this.srcNodeRef||win.doc.createElement("DIV");this.domNode.className=this.shadow?"mblRoundRect mblShadow":"mblRoundRect";},resize:function(){_38b.forEach(this.getChildren(),function(_390){if(_390.resize){_390.resize();}});}});});},"dijit/form/_ButtonMixin":function(){define("dijit/form/_ButtonMixin",["dojo/_base/declare","dojo/dom","dojo/_base/event","../registry"],function(_391,dom,_392,_393){return _391("dijit.form._ButtonMixin",null,{label:"",type:"button",_onClick:function(e){if(this.disabled){_392.stop(e);return false;}var _394=this.onClick(e)===false;if(!_394&&this.type=="submit"&&!(this.valueNode||this.focusNode).form){for(var node=this.domNode;node.parentNode;node=node.parentNode){var _395=_393.byNode(node);if(_395&&typeof _395._onSubmit=="function"){_395._onSubmit(e);_394=true;break;}}}if(_394){e.preventDefault();}return !_394;},postCreate:function(){this.inherited(arguments);dom.setSelectable(this.focusNode,false);},onClick:function(){return true;},_setLabelAttr:function(_396){this._set("label",_396);(this.containerNode||this.focusNode).innerHTML=_396;}});});},"dijit/_base/typematic":function(){define("dijit/_base/typematic",["../typematic"],function(){});},"dojox/mobile/RoundRectCategory":function(){define("dojox/mobile/RoundRectCategory",["dojo/_base/declare","dojo/_base/window","dijit/_Contained","dijit/_WidgetBase"],function(_397,win,_398,_399){return _397("dojox.mobile.RoundRectCategory",[_399,_398],{label:"",buildRendering:function(){this.domNode=this.containerNode=this.srcNodeRef||win.doc.createElement("H2");this.domNode.className="mblRoundRectCategory";if(!this.label){this.label=this.domNode.innerHTML;}},_setLabelAttr:function(_39a){this.label=_39a;this.domNode.innerHTML=this._cv?this._cv(_39a):_39a;}});});},"dojox/mobile/app/TextBox":function(){define(["dijit","dojo","dojox","dojo/require!dojox/mobile/TextBox"],function(_39b,dojo,_39c){dojo.provide("dojox.mobile.app.TextBox");dojo.deprecated("dojox.mobile.app.TextBox is deprecated","dojox.mobile.app.TextBox moved to dojox.mobile.TextBox",1.8);dojo.require("dojox.mobile.TextBox");_39c.mobile.app.TextBox=_39c.mobile.TextBox;});},"dojox/mobile/app/SceneAssistant":function(){define(["dijit","dojo","dojox"],function(_39d,dojo,_39e){dojo.provide("dojox.mobile.app.SceneAssistant");dojo.experimental("dojox.mobile.app.SceneAssistant");dojo.declare("dojox.mobile.app.SceneAssistant",null,{constructor:function(){},setup:function(){},activate:function(_39f){},deactivate:function(){},destroy:function(){var _3a0=dojo.query("> [widgetId]",this.containerNode).map(_39d.byNode);dojo.forEach(_3a0,function(_3a1){_3a1.destroyRecursive();});this.disconnect();},connect:function(obj,_3a2,_3a3){if(!this._connects){this._connects=[];}this._connects.push(dojo.connect(obj,_3a2,_3a3));},disconnect:function(){dojo.forEach(this._connects,dojo.disconnect);this._connects=[];}});});},"dijit/_base/popup":function(){define("dijit/_base/popup",["dojo/dom-class","../popup","../BackgroundIframe"],function(_3a4,_3a5){var _3a6=_3a5._createWrapper;_3a5._createWrapper=function(_3a7){if(!_3a7.declaredClass){_3a7={_popupWrapper:(_3a7.parentNode&&_3a4.contains(_3a7.parentNode,"dijitPopup"))?_3a7.parentNode:null,domNode:_3a7,destroy:function(){}};}return _3a6.call(this,_3a7);};var _3a8=_3a5.open;_3a5.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 _3a8.call(this,args);};return _3a5;});},"dojox/mobile/transition":function(){define(["dojo/_base/Deferred","dojo/_base/config"],function(_3a9,_3aa){if(_3aa["mblCSS3Transition"]){var _3ab=new _3a9();require([_3aa["mblCSS3Transition"]],function(_3ac){_3ab.resolve(_3ac);});return _3ab;}return null;});},"dijit/_base/wai":function(){define("dijit/_base/wai",["dojo/dom-attr","dojo/_base/lang","..","../hccss"],function(_3ad,lang,_3ae){lang.mixin(_3ae,{hasWaiRole:function(elem,role){var _3af=this.getWaiRole(elem);return role?(_3af.indexOf(role)>-1):(_3af.length>0);},getWaiRole:function(elem){return lang.trim((_3ad.get(elem,"role")||"").replace("wairole:",""));},setWaiRole:function(elem,role){_3ad.set(elem,"role",role);},removeWaiRole:function(elem,role){var _3b0=_3ad.get(elem,"role");if(!_3b0){return;}if(role){var t=lang.trim((" "+_3b0+" ").replace(" "+role+" "," "));_3ad.set(elem,"role",t);}else{elem.removeAttribute("role");}},hasWaiState:function(elem,_3b1){return elem.hasAttribute?elem.hasAttribute("aria-"+_3b1):!!elem.getAttribute("aria-"+_3b1);},getWaiState:function(elem,_3b2){return elem.getAttribute("aria-"+_3b2)||"";},setWaiState:function(elem,_3b3,_3b4){elem.setAttribute("aria-"+_3b3,_3b4);},removeWaiState:function(elem,_3b5){elem.removeAttribute("aria-"+_3b5);}});return _3ae;});},"dojo/window":function(){define(["./_base/lang","./_base/sniff","./_base/window","./dom","./dom-geometry","./dom-style"],function(lang,has,_3b6,dom,geom,_3b7){var _3b8=lang.getObject("dojo.window",true);_3b8.getBox=function(){var _3b9=(_3b6.doc.compatMode=="BackCompat")?_3b6.body():_3b6.doc.documentElement,_3ba=geom.docScroll(),w,h;if(has("touch")){var _3bb=_3b6.doc.parentWindow||_3b6.doc.defaultView;w=_3bb.innerWidth||_3b9.clientWidth;h=_3bb.innerHeight||_3b9.clientHeight;}else{w=_3b9.clientWidth;h=_3b9.clientHeight;}return {l:_3ba.x,t:_3ba.y,w:w,h:h};};_3b8.get=function(doc){if(has("ie")&&_3b8!==document.parentWindow){doc.parentWindow.execScript("document._parentWindow = window;","Javascript");var win=doc._parentWindow;doc._parentWindow=null;return win;}return doc.parentWindow||doc.defaultView;};_3b8.scrollIntoView=function(node,pos){try{node=dom.byId(node);var doc=node.ownerDocument||_3b6.doc,body=doc.body||_3b6.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 _3bc=doc.compatMode=="BackCompat",_3bd=(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):(_3bc?body:html),_3be=isWK?body:_3bd,_3bf=_3bd.clientWidth,_3c0=_3bd.clientHeight,rtl=!geom.isBodyLtr(),_3c1=pos||geom.position(node),el=node.parentNode,_3c2=function(el){return ((isIE<=6||(isIE&&_3bc))?false:(_3b7.get(el,"position").toLowerCase()=="fixed"));};if(_3c2(node)){return;}while(el){if(el==body){el=_3be;}var _3c3=geom.position(el),_3c4=_3c2(el);if(el==_3be){_3c3.w=_3bf;_3c3.h=_3c0;if(_3be==html&&isIE&&rtl){_3c3.x+=_3be.offsetWidth-_3c3.w;}if(_3c3.x<0||!isIE){_3c3.x=0;}if(_3c3.y<0||!isIE){_3c3.y=0;}}else{var pb=geom.getPadBorderExtents(el);_3c3.w-=pb.w;_3c3.h-=pb.h;_3c3.x+=pb.l;_3c3.y+=pb.t;var _3c5=el.clientWidth,_3c6=_3c3.w-_3c5;if(_3c5>0&&_3c6>0){_3c3.w=_3c5;_3c3.x+=(rtl&&(isIE||el.clientLeft>pb.l))?_3c6:0;}_3c5=el.clientHeight;_3c6=_3c3.h-_3c5;if(_3c5>0&&_3c6>0){_3c3.h=_3c5;}}if(_3c4){if(_3c3.y<0){_3c3.h+=_3c3.y;_3c3.y=0;}if(_3c3.x<0){_3c3.w+=_3c3.x;_3c3.x=0;}if(_3c3.y+_3c3.h>_3c0){_3c3.h=_3c0-_3c3.y;}if(_3c3.x+_3c3.w>_3bf){_3c3.w=_3bf-_3c3.x;}}var l=_3c1.x-_3c3.x,t=_3c1.y-Math.max(_3c3.y,0),r=l+_3c1.w-_3c3.w,bot=t+_3c1.h-_3c3.h;if(r*l>0){var s=Math[l<0?"max":"min"](l,r);if(rtl&&((isIE==8&&!_3bc)||isIE>=9)){s=-s;}_3c1.x+=el.scrollLeft;el.scrollLeft+=s;_3c1.x-=el.scrollLeft;}if(bot*t>0){_3c1.y+=el.scrollTop;el.scrollTop+=Math[t<0?"max":"min"](t,bot);_3c1.y-=el.scrollTop;}el=(el!=_3be)&&!_3c4&&el.parentNode;}}catch(error){console.error("scrollIntoView: "+error);node.scrollIntoView(false);}};return _3b8;});},"dojox/mobile/EdgeToEdgeList":function(){define("dojox/mobile/EdgeToEdgeList",["dojo/_base/declare","./RoundRectList"],function(_3c7,_3c8){return _3c7("dojox.mobile.EdgeToEdgeList",_3c8,{buildRendering:function(){this.inherited(arguments);this.domNode.className="mblEdgeToEdgeList";}});});},"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(_3c9,_3ca,_3cb,_3cc,dom,_3cd,_3ce,_3cf,_3d0,_3d1,keys,lang,on,has,win,_3d2,_3d3,_3d4){var _3d5=_3cc(null,{_stack:[],_beginZIndex:1000,_idGen:1,_createWrapper:function(_3d6){var _3d7=_3d6._popupWrapper,node=_3d6.domNode;if(!_3d7){_3d7=_3ce.create("div",{"class":"dijitPopup",style:{display:"none"},role:"presentation"},win.body());_3d7.appendChild(node);var s=node.style;s.display="";s.visibility="";s.position="";s.top="0px";_3d6._popupWrapper=_3d7;_3ca.after(_3d6,"destroy",function(){_3ce.destroy(_3d7);delete _3d6._popupWrapper;});}return _3d7;},moveOffScreen:function(_3d8){var _3d9=this._createWrapper(_3d8);_3d0.set(_3d9,{visibility:"hidden",top:"-9999px",display:""});},hide:function(_3da){var _3db=this._createWrapper(_3da);_3d0.set(_3db,"display","none");},getTopPopup:function(){var _3dc=this._stack;for(var pi=_3dc.length-1;pi>0&&_3dc[pi].parent===_3dc[pi-1].widget;pi--){}return _3dc[pi];},open:function(args){var _3dd=this._stack,_3de=args.popup,_3df=args.orient||["below","below-alt","above","above-alt"],ltr=args.parent?args.parent.isLeftToRight():_3cf.isBodyLtr(),_3e0=args.around,id=(args.around&&args.around.id)?(args.around.id+"_dropdown"):("popup_"+this._idGen++);while(_3dd.length&&(!args.parent||!dom.isDescendant(args.parent.domNode,_3dd[_3dd.length-1].widget.domNode))){this.close(_3dd[_3dd.length-1].widget);}var _3e1=this._createWrapper(_3de);_3cd.set(_3e1,{id:id,style:{zIndex:this._beginZIndex+_3dd.length},"class":"dijitPopup "+(_3de.baseClass||_3de["class"]||"").split(" ")[0]+"Popup",dijitPopupParent:args.parent?args.parent.id:""});if(has("ie")||has("mozilla")){if(!_3de.bgIframe){_3de.bgIframe=new _3d3(_3e1);}}var best=_3e0?_3d2.around(_3e1,_3e0,_3df,ltr,_3de.orient?lang.hitch(_3de,"orient"):null):_3d2.at(_3e1,args,_3df=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],args.padding);_3e1.style.display="";_3e1.style.visibility="visible";_3de.domNode.style.visibility="visible";var _3e2=[];_3e2.push(on(_3e1,_3cb._keypress,lang.hitch(this,function(evt){if(evt.charOrCode==keys.ESCAPE&&args.onCancel){_3d1.stop(evt);args.onCancel();}else{if(evt.charOrCode===keys.TAB){_3d1.stop(evt);var _3e3=this.getTopPopup();if(_3e3&&_3e3.onCancel){_3e3.onCancel();}}}})));if(_3de.onCancel&&args.onCancel){_3e2.push(_3de.on("cancel",args.onCancel));}_3e2.push(_3de.on(_3de.onExecute?"execute":"change",lang.hitch(this,function(){var _3e4=this.getTopPopup();if(_3e4&&_3e4.onExecute){_3e4.onExecute();}})));_3dd.push({widget:_3de,parent:args.parent,onExecute:args.onExecute,onCancel:args.onCancel,onClose:args.onClose,handlers:_3e2});if(_3de.onOpen){_3de.onOpen(best);}return best;},close:function(_3e5){var _3e6=this._stack;while((_3e5&&_3c9.some(_3e6,function(elem){return elem.widget==_3e5;}))||(!_3e5&&_3e6.length)){var top=_3e6.pop(),_3e7=top.widget,_3e8=top.onClose;if(_3e7.onClose){_3e7.onClose();}var h;while(h=top.handlers.pop()){h.remove();}if(_3e7&&_3e7.domNode){this.hide(_3e7);}if(_3e8){_3e8();}}}});return (_3d4.popup=new _3d5());});},"dojox/mobile/uacss":function(){define("dojox/mobile/uacss",["dojo/_base/kernel","dojo/_base/lang","dojo/_base/window","dojox/mobile/sniff"],function(dojo,lang,win,has){win.doc.documentElement.className+=lang.trim([has("bb")?"dj_bb":"",has("android")?"dj_android":"",has("iphone")?"dj_iphone":"",has("ipod")?"dj_ipod":"",has("ipad")?"dj_ipad":""].join(" ").replace(/ +/g," "));return dojo;});},"dijit/_base/window":function(){define("dijit/_base/window",["dojo/window",".."],function(_3e9,_3ea){_3ea.getDocumentWindow=function(doc){return _3e9.get(doc);};});},"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(_3eb,_3ec,_3ed,_3ee,_3ef,_3f0,dom,_3f1,_3f2,_3f3,_3f4,_3f5,_3f6,lang,on,_3f7,_3f8,_3f9,win,_3fa){if(!_3f6.isAsync){_3f7(0,function(){var _3fb=["dijit/_base/manager"];_3eb(_3fb);});}var _3fc={};function _3fd(obj){var ret={};for(var attr in obj){ret[attr.toLowerCase()]=true;}return ret;};function _3fe(attr){return function(val){_3f1[val?"set":"remove"](this.domNode,attr,val);this._set(attr,val);};};return _3f0("dijit._WidgetBase",_3f8,{id:"",_setIdAttr:"domNode",lang:"",_setLangAttr:_3fe("lang"),dir:"",_setDirAttr:_3fe("dir"),textDir:"","class":"",_setClassAttr:{node:"domNode",type:"class"},style:"",title:"",tooltip:"",baseClass:"",srcNodeRef:null,domNode:null,containerNode:null,attributeMap:{},_blankGif:_3ee.blankGif||_3eb.toUrl("dojo/resources/blank.gif"),postscript:function(_3ff,_400){this.create(_3ff,_400);},create:function(_401,_402){this.srcNodeRef=dom.byId(_402);this._connects=[];this._supportingWidgets=[];if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){this.id=this.srcNodeRef.id;}if(_401){this.params=_401;lang.mixin(this,_401);}this.postMixInProperties();if(!this.id){this.id=_3fa.getUniqueId(this.declaredClass.replace(/\./g,"_"));}_3fa.add(this);this.buildRendering();if(this.domNode){this._applyAttributes();var _403=this.srcNodeRef;if(_403&&_403.parentNode&&this.domNode!==_403){_403.parentNode.replaceChild(this.domNode,_403);}}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 _404=ctor.prototype;for(var _405 in _404){if(_405 in this.attributeMap){continue;}var _406="_set"+_405.replace(/^[a-z]|-[a-zA-Z]/g,function(c){return c.charAt(c.length-1).toUpperCase();})+"Attr";if(_406 in _404){list.push(_405);}}}_3ec.forEach(list,function(attr){if(this.params&&attr in this.params){}else{if(this[attr]){this.set(attr,this[attr]);}}},this);for(var _407 in this.params){this.set(_407,this[_407]);}},postMixInProperties:function(){},buildRendering:function(){if(!this.domNode){this.domNode=this.srcNodeRef||_3f3.create("div");}if(this.baseClass){var _408=this.baseClass.split(" ");if(!this.isLeftToRight()){_408=_408.concat(_3ec.map(_408,function(name){return name+"Rtl";}));}_3f2.add(this.domNode,_408);}},postCreate:function(){},startup:function(){if(this._started){return;}this._started=true;_3ec.forEach(this.getChildren(),function(obj){if(!obj._started&&!obj._destroyed&&lang.isFunction(obj.startup)){obj.startup();obj._started=true;}});},destroyRecursive:function(_409){this._beingDestroyed=true;this.destroyDescendants(_409);this.destroy(_409);},destroy:function(_40a){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(_40a);_3fa.remove(this.id);this._destroyed=true;},destroyRendering:function(_40b){if(this.bgIframe){this.bgIframe.destroy(_40b);delete this.bgIframe;}if(this.domNode){if(_40b){_3f1.remove(this.domNode,"widgetId");}else{_3f3.destroy(this.domNode);}delete this.domNode;}if(this.srcNodeRef){if(!_40b){_3f3.destroy(this.srcNodeRef);}delete this.srcNodeRef;}},destroyDescendants:function(_40c){_3ec.forEach(this.getChildren(),function(_40d){if(_40d.destroyRecursive){_40d.destroyRecursive(_40c);}});},uninitialize:function(){return false;},_setStyleAttr:function(_40e){var _40f=this.domNode;if(lang.isObject(_40e)){_3f5.set(_40f,_40e);}else{if(_40f.style.cssText){_40f.style.cssText+="; "+_40e;}else{_40f.style.cssText=_40e;}}this._set("style",_40e);},_attrToDom:function(attr,_410,_411){_411=arguments.length>=3?_411:this.attributeMap[attr];_3ec.forEach(lang.isArray(_411)?_411:[_411],function(_412){var _413=this[_412.node||_412||"domNode"];var type=_412.type||"attribute";switch(type){case "attribute":if(lang.isFunction(_410)){_410=lang.hitch(this,_410);}var _414=_412.attribute?_412.attribute:(/^on[A-Z][a-zA-Z]*$/.test(attr)?attr.toLowerCase():attr);_3f1.set(_413,_414,_410);break;case "innerText":_413.innerHTML="";_413.appendChild(win.doc.createTextNode(_410));break;case "innerHTML":_413.innerHTML=_410;break;case "class":_3f2.replace(_413,_410,this[attr]);break;}},this);},get:function(name){var _415=this._getAttrNames(name);return this[_415.g]?this[_415.g]():this[name];},set:function(name,_416){if(typeof name==="object"){for(var x in name){this.set(x,name[x]);}return this;}var _417=this._getAttrNames(name),_418=this[_417.s];if(lang.isFunction(_418)){var _419=_418.apply(this,Array.prototype.slice.call(arguments,1));}else{var _41a=this.focusNode&&!lang.isFunction(this.focusNode)?"focusNode":"domNode",tag=this[_41a].tagName,_41b=_3fc[tag]||(_3fc[tag]=_3fd(this[_41a])),map=name in this.attributeMap?this.attributeMap[name]:_417.s in this?this[_417.s]:((_417.l in _41b&&typeof _416!="function")||/^aria-|^data-|^role$/.test(name))?_41a:null;if(map!=null){this._attrToDom(name,_416,map);}this._set(name,_416);}return _419||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,_41c){var _41d=this[name];this[name]=_41c;if(this._watchCallbacks&&this._created&&_41c!==_41d){this._watchCallbacks(name,_41d,_41c);}},on:function(type,func){return _3ed.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?_3fa.findWidgets(this.containerNode):[];},getParent:function(){return _3fa.getEnclosingWidget(this.domNode.parentNode);},connect:function(obj,_41e,_41f){var _420=_3ef.connect(obj,_41e,this,_41f);this._connects.push(_420);return _420;},disconnect:function(_421){var i=_3ec.indexOf(this._connects,_421);if(i!=-1){_421.remove();this._connects.splice(i,1);}},subscribe:function(t,_422){var _423=_3f9.subscribe(t,lang.hitch(this,_422));this._connects.push(_423);return _423;},unsubscribe:function(_424){this.disconnect(_424);},isLeftToRight:function(){return this.dir?(this.dir=="ltr"):_3f4.isBodyLtr();},isFocusable:function(){return this.focus&&(_3f5.get(this.domNode,"display")!="none");},placeAt:function(_425,_426){if(_425.declaredClass&&_425.addChild){_425.addChild(this,_426);}else{_3f3.place(this.domNode,_425,_426);}return this;},getTextDir:function(text,_427){return _427;},applyTextDir:function(){}});});},"dojox/mobile/app/AlertDialog":function(){define(["dijit","dojo","dojox","dojo/require!dijit/_WidgetBase"],function(_428,dojo,_429){dojo.provide("dojox.mobile.app.AlertDialog");dojo.experimental("dojox.mobile.app.AlertDialog");dojo.require("dijit._WidgetBase");dojo.declare("dojox.mobile.app.AlertDialog",_428._WidgetBase,{title:"",text:"",controller:null,buttons:null,defaultButtonLabel:"OK",onChoose:null,constructor:function(){this.onClick=dojo.hitch(this,this.onClick);this._handleSelect=dojo.hitch(this,this._handleSelect);},buildRendering:function(){this.domNode=dojo.create("div",{"class":"alertDialog"});var _42a=dojo.create("div",{"class":"alertDialogBody"},this.domNode);dojo.create("div",{"class":"alertTitle",innerHTML:this.title||""},_42a);dojo.create("div",{"class":"alertText",innerHTML:this.text||""},_42a);var _42b=dojo.create("div",{"class":"alertBtns"},_42a);if(!this.buttons||this.buttons.length==0){this.buttons=[{label:this.defaultButtonLabel,value:"ok","class":"affirmative"}];}var _42c=this;dojo.forEach(this.buttons,function(_42d){var btn=new _429.mobile.Button({btnClass:_42d["class"]||"",label:_42d.label});btn._dialogValue=_42d.value;dojo.place(btn.domNode,_42b);_42c.connect(btn,"onClick",_42c._handleSelect);});var _42e=this.controller.getWindowSize();this.mask=dojo.create("div",{"class":"dialogUnderlayWrapper",innerHTML:"<div class=\"dialogUnderlay\"></div>",style:{width:_42e.w+"px",height:_42e.h+"px"}},this.controller.assistant.domNode);this.connect(this.mask,"onclick",function(){_42c.onChoose&&_42c.onChoose();_42c.hide();});},postCreate:function(){this.subscribe("/dojox/mobile/app/goback",this._handleSelect);},_handleSelect:function(_42f){var node;if(_42f&&_42f.target){node=_42f.target;while(!_428.byNode(node)){node-node.parentNode;}}if(this.onChoose){this.onChoose(node?_428.byNode(node)._dialogValue:undefined);}this.hide();},show:function(){this._doTransition(1);},hide:function(){this._doTransition(-1);},_doTransition:function(dir){var anim;var h=dojo.marginBox(this.domNode.firstChild).h;var _430=this.controller.getWindowSize().h;var high=_430-h;var low=_430;var _431=dojo.fx.slideTo({node:this.domNode,duration:400,top:{start:dir<0?high:low,end:dir<0?low:high}});var _432=dojo[dir<0?"fadeOut":"fadeIn"]({node:this.mask,duration:400});var anim=dojo.fx.combine([_431,_432]);var _433=this;dojo.connect(anim,"onEnd",this,function(){if(dir<0){_433.domNode.style.display="none";dojo.destroy(_433.domNode);dojo.destroy(_433.mask);}});anim.play();},destroy:function(){this.inherited(arguments);dojo.destroy(this.mask);},onClick:function(){}});});}}});require(["dojo/i18n"],function(i18n){i18n._preloadLocalizations("dojox/mobile/nls/app",[]);});define("dojox/mobile/app",["./app/_base"],function(_434){return _434;});
\ No newline at end of file diff --git a/js/dojo/dojox/mobile/app.js.uncompressed.js b/js/dojo/dojox/mobile/app.js.uncompressed.js new file mode 100644 index 0000000..d291f6e --- /dev/null +++ b/js/dojo/dojox/mobile/app.js.uncompressed.js @@ -0,0 +1,12449 @@ +/* + 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 +*/ + +/* + This is an optimized version of Dojo, built for deployment and not for + development. To get sources and documentation, please visit: + + http://dojotoolkit.org +*/ + +//>>built +require({cache:{ +'dojo/uacss':function(){ +define(["./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; +}); + +}, +'dojox/mobile/app/_Widget':function(){ +// wrapped by build app +define(["dijit","dojo","dojox","dojo/require!dijit/_WidgetBase"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app._Widget"); +dojo.experimental("dojox.mobile.app._Widget"); + +dojo.require("dijit._WidgetBase"); + +dojo.declare("dojox.mobile.app._Widget", dijit._WidgetBase, { + // summary: + // The base mobile app widget. + + getScroll: function(){ + // summary: + // Returns the scroll position. + return { + x: dojo.global.scrollX, + y: dojo.global.scrollY + }; + }, + + connect: function(target, event, fn){ + if(event.toLowerCase() == "dblclick" + || event.toLowerCase() == "ondblclick"){ + + if(dojo.global["Mojo"]){ + // Handle webOS tap event + return this.connect(target, Mojo.Event.tap, fn); + } + } + return this.inherited(arguments); + } +}); +}); + +}, +'dojox/mobile/app/ImageThumbView':function(){ +// wrapped by build app +define(["dijit","dojo","dojox","dojo/require!dijit/_WidgetBase,dojo/string"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.ImageThumbView"); +dojo.experimental("dojox.mobile.app.ImageThumbView"); + +dojo.require("dijit._WidgetBase"); +dojo.require("dojo.string"); + +dojo.declare("dojox.mobile.app.ImageThumbView", dijit._WidgetBase, { + // summary: + // An image thumbnail gallery + + // items: Array + // The data items from which the image urls are retrieved. + // If an item is a string, it is expected to be a URL. Otherwise + // by default it is expected to have a 'url' member. This can + // be configured using the 'urlParam' attribute on this widget. + items: [], + + // urlParam: String + // The paramter name used to retrieve an image url from a JSON object + urlParam: "url", + + labelParam: null, + + itemTemplate: '<div class="mblThumbInner">' + + '<div class="mblThumbOverlay"></div>' + + '<div class="mblThumbMask">' + + '<div class="mblThumbSrc" style="background-image:url(${url})"></div>' + + '</div>' + + '</div>', + + minPadding: 4, + + maxPerRow: 3, + + maxRows: -1, + + baseClass: "mblImageThumbView", + + thumbSize: "medium", + + animationEnabled: true, + + selectedIndex: -1, + + cache: null, + + cacheMustMatch: false, + + clickEvent: "onclick", + + cacheBust: false, + + disableHide: false, + + constructor: function(params, node){ + }, + + postCreate: function(){ + + this.inherited(arguments); + var _this = this; + + var hoverCls = "mblThumbHover"; + + this.addThumb = dojo.hitch(this, this.addThumb); + this.handleImgLoad = dojo.hitch(this, this.handleImgLoad); + this.hideCached = dojo.hitch(this, this.hideCached); + + this._onLoadImages = {}; + + this.cache = []; + this.visibleImages = []; + + this._cacheCounter = 0; + + this.connect(this.domNode, this.clickEvent, function(event){ + var itemNode = _this._getItemNodeFromEvent(event); + + if(itemNode && !itemNode._cached){ + _this.onSelect(itemNode._item, itemNode._index, _this.items); + dojo.query(".selected", this.domNode).removeClass("selected"); + dojo.addClass(itemNode, "selected"); + } + }); + + dojo.addClass(this.domNode, this.thumbSize); + + this.resize(); + this.render(); + }, + + onSelect: function(item, index, items){ + // summary: + // Dummy function that is triggered when an image is selected. + }, + + _setAnimationEnabledAttr: function(value){ + this.animationEnabled = value; + dojo[value ? "addClass" : "removeClass"](this.domNode, "animated"); + }, + + _setItemsAttr: function(items){ + this.items = items || []; + + var urls = {}; + var i; + for(i = 0; i < this.items.length; i++){ + urls[this.items[i][this.urlParam]] = 1; + } + + var clearedUrls = []; + for(var url in this._onLoadImages){ + if(!urls[url] && this._onLoadImages[url]._conn){ + dojo.disconnect(this._onLoadImages[url]._conn); + this._onLoadImages[url].src = null; + clearedUrls.push(url); + } + } + + for(i = 0; i < clearedUrls.length; i++){ + delete this._onLoadImages[url]; + } + + this.render(); + }, + + _getItemNode: function(node){ + while(node && !dojo.hasClass(node, "mblThumb") && node != this.domNode){ + node = node.parentNode; + } + + return (node == this.domNode) ? null : node; + }, + + _getItemNodeFromEvent: function(event){ + if(event.touches && event.touches.length > 0){ + event = event.touches[0]; + } + return this._getItemNode(event.target); + }, + + resize: function(){ + this._thumbSize = null; + + this._size = dojo.contentBox(this.domNode); + + this.disableHide = true; + this.render(); + this.disableHide = false; + }, + + hideCached: function(){ + // summary: + // Hides all cached nodes, so that they're no invisible and overlaying + // other screen elements. + for(var i = 0; i < this.cache.length; i++){ + if (this.cache[i]) { + dojo.style(this.cache[i], "display", "none"); + } + } + }, + + render: function(){ + var i; + var url; + var item; + + var thumb; + while(this.visibleImages && this.visibleImages.length > 0){ + thumb = this.visibleImages.pop(); + this.cache.push(thumb); + + if (!this.disableHide) { + dojo.addClass(thumb, "hidden"); + } + thumb._cached = true; + } + + if(this.cache && this.cache.length > 0){ + setTimeout(this.hideCached, 1000); + } + + if(!this.items || this.items.length == 0){ + return; + } + + for(i = 0; i < this.items.length; i++){ + item = this.items[i]; + url = (dojo.isString(item) ? item : item[this.urlParam]); + + this.addThumb(item, url, i); + + if(this.maxRows > 0 && (i + 1) / this.maxPerRow >= this.maxRows){ + break; + } + } + + if(!this._thumbSize){ + return; + } + + var column = 0; + var row = -1; + + var totalThumbWidth = this._thumbSize.w + (this.padding * 2); + var totalThumbHeight = this._thumbSize.h + (this.padding * 2); + + var nodes = this.thumbNodes = + dojo.query(".mblThumb", this.domNode); + + var pos = 0; + nodes = this.visibleImages; + for(i = 0; i < nodes.length; i++){ + if(nodes[i]._cached){ + continue; + } + + if(pos % this.maxPerRow == 0){ + row ++; + } + column = pos % this.maxPerRow; + + this.place( + nodes[i], + (column * totalThumbWidth) + this.padding, // x position + (row * totalThumbHeight) + this.padding // y position + ); + + if(!nodes[i]._loading){ + dojo.removeClass(nodes[i], "hidden"); + } + + if(pos == this.selectedIndex){ + dojo[pos == this.selectedIndex ? "addClass" : "removeClass"] + (nodes[i], "selected"); + } + pos++; + } + + var numRows = Math.ceil(pos / this.maxPerRow); + + this._numRows = numRows; + + this.setContainerHeight((numRows * (this._thumbSize.h + this.padding * 2))); + }, + + setContainerHeight: function(amount){ + dojo.style(this.domNode, "height", amount + "px"); + }, + + addThumb: function(item, url, index){ + + var thumbDiv; + var cacheHit = false; + if(this.cache.length > 0){ + // Reuse a previously created node if possible + var found = false; + // Search for an image with the same url first + for(var i = 0; i < this.cache.length; i++){ + if(this.cache[i]._url == url){ + thumbDiv = this.cache.splice(i, 1)[0]; + found = true; + break + } + } + + // if no image with the same url is found, just take the last one + if(!thumbDiv && !this.cacheMustMatch){ + thumbDiv = this.cache.pop(); + dojo.removeClass(thumbDiv, "selected"); + } else { + cacheHit = true; + } + } + + if(!thumbDiv){ + + // Create a new thumb + thumbDiv = dojo.create("div", { + "class": "mblThumb hidden", + innerHTML: dojo.string.substitute(this.itemTemplate, { + url: url + }, null, this) + }, this.domNode); + } + + if(this.labelParam) { + var labelNode = dojo.query(".mblThumbLabel", thumbDiv)[0]; + if(!labelNode) { + labelNode = dojo.create("div", { + "class": "mblThumbLabel" + }, thumbDiv); + } + labelNode.innerHTML = item[this.labelParam] || ""; + } + + dojo.style(thumbDiv, "display", ""); + if (!this.disableHide) { + dojo.addClass(thumbDiv, "hidden"); + } + + if (!cacheHit) { + var loader = dojo.create("img", {}); + loader._thumbDiv = thumbDiv; + loader._conn = dojo.connect(loader, "onload", this.handleImgLoad); + loader._url = url; + thumbDiv._loading = true; + + this._onLoadImages[url] = loader; + if (loader) { + loader.src = url; + } + } + this.visibleImages.push(thumbDiv); + + thumbDiv._index = index; + thumbDiv._item = item; + thumbDiv._url = url; + thumbDiv._cached = false; + + if(!this._thumbSize){ + this._thumbSize = dojo.marginBox(thumbDiv); + + if(this._thumbSize.h == 0){ + this._thumbSize.h = 100; + this._thumbSize.w = 100; + } + + if(this.labelParam){ + this._thumbSize.h += 8; + } + + this.calcPadding(); + } + }, + + handleImgLoad: function(event){ + var img = event.target; + dojo.disconnect(img._conn); + dojo.removeClass(img._thumbDiv, "hidden"); + img._thumbDiv._loading = false; + img._conn = null; + + var url = img._url; + if(this.cacheBust){ + url += (url.indexOf("?") > -1 ? "&" : "?") + + "cacheBust=" + (new Date()).getTime() + "_" + (this._cacheCounter++); + } + + dojo.query(".mblThumbSrc", img._thumbDiv) + .style("backgroundImage", "url(" + url + ")"); + + delete this._onLoadImages[img._url]; + }, + + calcPadding: function(){ + var width = this._size.w; + + var thumbWidth = this._thumbSize.w; + + var imgBounds = thumbWidth + this.minPadding; + + this.maxPerRow = Math.floor(width / imgBounds); + + this.padding = Math.floor((width - (thumbWidth * this.maxPerRow)) / (this.maxPerRow * 2)); + }, + + place: function(node, x, y){ + dojo.style(node, { + "-webkit-transform" :"translate(" + x + "px," + y + "px)" + }); + }, + + destroy: function(){ + // Stop the loading of any more images + + var img; + var counter = 0; + for (var url in this._onLoadImages){ + img = this._onLoadImages[url]; + if (img) { + img.src = null; + counter++; + } + } + + this.inherited(arguments); + } +}); +}); + +}, +'dojox/mobile/TransitionEvent':function(){ +define("dojox/mobile/TransitionEvent", [ + "dojo/_base/declare", + "dojo/_base/Deferred", + "dojo/_base/lang", + "dojo/on", + "./transition" +], function(declare, Deferred, lang, on, transitDeferred){ + + return declare("dojox.mobile.TransitionEvent", null, { + constructor: function(target, transitionOptions, triggerEvent){ + this.transitionOptions=transitionOptions; + this.target = target; + this.triggerEvent=triggerEvent||null; + }, + + dispatch: function(){ + var opts = {bubbles:true, cancelable:true, detail: this.transitionOptions, triggerEvent: this.triggerEvent}; + //console.log("Target: ", this.target, " opts: ", opts); + + var evt = on.emit(this.target,"startTransition", opts); + //console.log('evt: ', evt); + if(evt){ + Deferred.when(transitDeferred, lang.hitch(this, function(transition){ + Deferred.when(transition.call(this, evt), lang.hitch(this, function(results){ + this.endTransition(results); + })); + })); + } + }, + + endTransition: function(results){ + on.emit(this.target, "endTransition" , {detail: results.transitionOptions}); + } + }); +}); + +}, +'dojox/mobile/ViewController':function(){ +define([ + "dojo/_base/kernel", + "dojo/_base/array", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom", + "dojo/dom-class", + "dojo/dom-construct", +// "dojo/hash", // optionally prereq'ed + "dojo/on", + "dojo/ready", + "dijit/registry", // registry.byId + "./ProgressIndicator", + "./TransitionEvent" +], function(dojo, array, connect, declare, lang, win, dom, domClass, domConstruct, on, ready, registry, ProgressIndicator, TransitionEvent){ + + // module: + // dojox/mobile/ViewController + // summary: + // A singleton class that controlls view transition. + + var dm = lang.getObject("dojox.mobile", true); + + var Controller = declare("dojox.mobile.ViewController", null, { + // summary: + // A singleton class that controlls view transition. + // description: + // This class listens to the "startTransition" events and performs + // view transitions. If the transition destination is an external + // view specified with the url parameter, retrieves the view + // content and parses it to create a new target view. + + constructor: function(){ + this.viewMap={}; + this.currentView=null; + this.defaultView=null; + ready(lang.hitch(this, function(){ + on(win.body(), "startTransition", lang.hitch(this, "onStartTransition")); + })); + }, + + findCurrentView: function(moveTo,src){ + // summary: + // Searches for the currently showing view. + if(moveTo){ + var w = registry.byId(moveTo); + if(w && w.getShowingView){ return w.getShowingView(); } + } + if(dm.currentView){ + return dm.currentView; //TODO:1.8 may not return an expected result especially when views are nested + } + //TODO:1.8 probably never reaches here + w = src; + while(true){ + w = w.getParent(); + if(!w){ return null; } + if(domClass.contains(w.domNode, "mblView")){ break; } + } + return w; + }, + + onStartTransition: function(evt){ + // summary: + // A handler that performs view transition. + + evt.preventDefault(); + if(!evt.detail || (evt.detail && !evt.detail.moveTo && !evt.detail.href && !evt.detail.url && !evt.detail.scene)){ return; } + var w = this.findCurrentView(evt.detail.moveTo, (evt.target && evt.target.id)?registry.byId(evt.target.id):registry.byId(evt.target)); // the current view widget + if(!w || (evt.detail && evt.detail.moveTo && w === registry.byId(evt.detail.moveTo))){ return; } + if(evt.detail.href){ + var t = registry.byId(evt.target.id).hrefTarget; + if(t){ + dm.openWindow(evt.detail.href, t); + }else{ + w.performTransition(null, evt.detail.transitionDir, evt.detail.transition, evt.target, function(){location.href = evt.detail.href;}); + } + return; + } else if(evt.detail.scene){ + connect.publish("/dojox/mobile/app/pushScene", [evt.detail.scene]); + return; + } + var moveTo = evt.detail.moveTo; + if(evt.detail.url){ + var id; + if(dm._viewMap && dm._viewMap[evt.detail.url]){ + // external view has already been loaded + id = dm._viewMap[evt.detail.url]; + }else{ + // get the specified external view and append it to the <body> + var text = this._text; + if(!text){ + if(registry.byId(evt.target.id).sync){ + // We do not add explicit dependency on dojo/_base/xhr to this module + // to be able to create a build that does not contain dojo/_base/xhr. + // User applications that do sync loading here need to explicitly + // require dojo/_base/xhr up front. + dojo.xhrGet({url:evt.detail.url, sync:true, load:function(result){ + text = lang.trim(result); + }}); + }else{ + var s = "dojo/_base/xhr"; // assign to a variable so as not to be picked up by the build tool + require([s], lang.hitch(this, function(xhr){ + var prog = ProgressIndicator.getInstance(); + win.body().appendChild(prog.domNode); + prog.start(); + var obj = xhr.get({ + url: evt.detail.url, + handleAs: "text" + }); + obj.addCallback(lang.hitch(this, function(response, ioArgs){ + prog.stop(); + if(response){ + this._text = response; + new TransitionEvent(evt.target, { + transition: evt.detail.transition, + transitionDir: evt.detail.transitionDir, + moveTo: moveTo, + href: evt.detail.href, + url: evt.detail.url, + scene: evt.detail.scene}, + evt.detail) + .dispatch(); + } + })); + obj.addErrback(function(error){ + prog.stop(); + console.log("Failed to load "+evt.detail.url+"\n"+(error.description||error)); + }); + })); + return; + } + } + this._text = null; + id = this._parse(text, registry.byId(evt.target.id).urlTarget); + if(!dm._viewMap){ + dm._viewMap = []; + } + dm._viewMap[evt.detail.url] = id; + } + moveTo = id; + w = this.findCurrentView(moveTo,registry.byId(evt.target.id)) || w; // the current view widget + } + w.performTransition(moveTo, evt.detail.transitionDir, evt.detail.transition, null, null); + }, + + _parse: function(text, id){ + // summary: + // Parses the given view content. + // description: + // If the content is html fragment, constructs dom tree with it + // and runs the parser. If the content is json data, passes it + // to _instantiate(). + var container, view, i, j, len; + var currentView = this.findCurrentView(); + var target = registry.byId(id) && registry.byId(id).containerNode + || dom.byId(id) + || currentView && currentView.domNode.parentNode + || win.body(); + // if a fixed bottom bar exists, a new view should be placed before it. + var refNode = null; + for(j = target.childNodes.length - 1; j >= 0; j--){ + var c = target.childNodes[j]; + if(c.nodeType === 1){ + if(c.getAttribute("fixed") === "bottom"){ + refNode = c; + } + break; + } + } + if(text.charAt(0) === "<"){ // html markup + container = domConstruct.create("DIV", {innerHTML: text}); + for(i = 0; i < container.childNodes.length; i++){ + var n = container.childNodes[i]; + if(n.nodeType === 1){ + view = n; // expecting <div dojoType="dojox.mobile.View"> + break; + } + } + if(!view){ + console.log("dojox.mobile.ViewController#_parse: invalid view content"); + return; + } + view.style.visibility = "hidden"; + target.insertBefore(container, refNode); + var ws = dojo.parser.parse(container); + array.forEach(ws, function(w){ + if(w && !w._started && w.startup){ + w.startup(); + } + }); + + // allows multiple root nodes in the fragment, + // but transition will be performed to the 1st view. + for(i = 0, len = container.childNodes.length; i < len; i++){ + target.insertBefore(container.firstChild, refNode); // reparent + } + target.removeChild(container); + + registry.byNode(view)._visible = true; + }else if(text.charAt(0) === "{"){ // json + container = domConstruct.create("DIV"); + target.insertBefore(container, refNode); + this._ws = []; + view = this._instantiate(eval('('+text+')'), container); + for(i = 0; i < this._ws.length; i++){ + var w = this._ws[i]; + w.startup && !w._started && (!w.getParent || !w.getParent()) && w.startup(); + } + this._ws = null; + } + view.style.display = "none"; + view.style.visibility = "visible"; + return dojo.hash ? "#" + view.id : view.id; + }, + + _instantiate: function(/*Object*/obj, /*DomNode*/node, /*Widget*/parent){ + // summary: + // Given the evaluated json data, does the same thing as what + // the parser does. + var widget; + for(var key in obj){ + if(key.charAt(0) == "@"){ continue; } + var cls = lang.getObject(key); + if(!cls){ continue; } + var params = {}; + var proto = cls.prototype; + var objs = lang.isArray(obj[key]) ? obj[key] : [obj[key]]; + for(var i = 0; i < objs.length; i++){ + for(var prop in objs[i]){ + if(prop.charAt(0) == "@"){ + var val = objs[i][prop]; + prop = prop.substring(1); + if(typeof proto[prop] == "string"){ + params[prop] = val; + }else if(typeof proto[prop] == "number"){ + params[prop] = val - 0; + }else if(typeof proto[prop] == "boolean"){ + params[prop] = (val != "false"); + }else if(typeof proto[prop] == "object"){ + params[prop] = eval("(" + val + ")"); + } + } + } + widget = new cls(params, node); + if(node){ // to call View's startup() + widget._visible = true; + this._ws.push(widget); + } + if(parent && parent.addChild){ + parent.addChild(widget); + } + this._instantiate(objs[i], null, widget); + } + } + return widget && widget.domNode; + } + }); + new Controller(); // singleton + return Controller; +}); + + +}, +'dojox/mobile/ToolBarButton':function(){ +define("dojox/mobile/ToolBarButton", [ + "dojo/_base/declare", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-style", + "./common", + "./_ItemBase" +], function(declare, win, domClass, domConstruct, domStyle, common, ItemBase){ +/*===== + var ItemBase = dojox.mobile._ItemBase; +=====*/ + + // module: + // dojox/mobile/ToolBarButton + // summary: + // A button widget that is placed in the Heading widget. + + return declare("dojox.mobile.ToolBarButton", ItemBase, { + // summary: + // A button widget that is placed in the Heading widget. + // description: + // ToolBarButton is a button that is placed in the Heading + // widget. It is a subclass of dojox.mobile._ItemBase just like + // ListItem or IconItem. So, unlike Button, it has basically the + // same capability as ListItem or IconItem, such as icon support, + // transition, etc. + + // selected: Boolean + // If true, the button is in the selected status. + selected: false, + + // btnClass: String + // Deprecated. + btnClass: "", + + /* internal properties */ + _defaultColor: "mblColorDefault", + _selColor: "mblColorDefaultSel", + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement("div"); + this.inheritParams(); + domClass.add(this.domNode, "mblToolBarButton mblArrowButtonText"); + var color; + if(this.selected){ + color = this._selColor; + }else if(this.domNode.className.indexOf("mblColor") == -1){ + color = this._defaultColor; + } + domClass.add(this.domNode, color); + + if(!this.label){ + this.label = this.domNode.innerHTML; + } + + if(this.icon && this.icon != "none"){ + this.iconNode = domConstruct.create("div", {className:"mblToolBarButtonIcon"}, this.domNode); + common.createIcon(this.icon, this.iconPos, null, this.alt, this.iconNode); + if(this.iconPos){ + domClass.add(this.iconNode.firstChild, "mblToolBarButtonSpriteIcon"); + } + }else{ + if(common.createDomButton(this.domNode)){ + domClass.add(this.domNode, "mblToolBarButtonDomButton"); + }else{ + domClass.add(this.domNode, "mblToolBarButtonText"); + } + } + this.connect(this.domNode, "onclick", "onClick"); + }, + + select: function(){ + // summary: + // Makes this widget in the selected state. + domClass.toggle(this.domNode, this._selColor, !arguments[0]); + this.selected = !arguments[0]; + }, + + deselect: function(){ + // summary: + // Makes this widget in the deselected state. + this.select(true); + }, + + onClick: function(e){ + this.setTransitionPos(e); + this.defaultClickAction(); + }, + + _setBtnClassAttr: function(/*String*/btnClass){ + var node = this.domNode; + if(node.className.match(/(mblDomButton\w+)/)){ + domClass.remove(node, RegExp.$1); + } + domClass.add(node, btnClass); + if(common.createDomButton(this.domNode)){ + domClass.add(this.domNode, "mblToolBarButtonDomButton"); + } + }, + + _setLabelAttr: function(/*String*/text){ + this.label = text; + this.domNode.innerHTML = this._cv ? this._cv(text) : text; + } + }); +}); + +}, +'dojox/mobile/_ItemBase':function(){ +define("dojox/mobile/_ItemBase", [ + "dojo/_base/kernel", + "dojo/_base/config", + "dojo/_base/declare", + "dijit/registry", // registry.getEnclosingWidget + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase", + "./TransitionEvent", + "./View" +], function(kernel, config, declare, registry, Contained, Container, WidgetBase, TransitionEvent, View){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; + var TransitionEvent = dojox.mobile.TransitionEvent; + var View = dojox.mobile.View; +=====*/ + + // module: + // dojox/mobile/_ItemBase + // summary: + // A base class for item classes (e.g. ListItem, IconItem, etc.) + + return declare("dojox.mobile._ItemBase", [WidgetBase, Container, Contained],{ + // summary: + // A base class for item classes (e.g. ListItem, IconItem, etc.) + // description: + // _ItemBase is a base class for widgets that have capability to + // make a view transition when clicked. + + // icon: String + // An icon image to display. The value can be either a path for an + // image file or a class name of a DOM button. If icon is not + // specified, the iconBase parameter of the parent widget is used. + icon: "", + + // iconPos: String + // The position of an aggregated icon. IconPos is comma separated + // values like top,left,width,height (ex. "0,0,29,29"). If iconPos + // is not specified, the iconPos parameter of the parent widget is + // used. + iconPos: "", // top,left,width,height (ex. "0,0,29,29") + + // alt: String + // An alt text for the icon image. + alt: "", + + // href: String + // A URL of another web page to go to. + href: "", + + // hrefTarget: String + // A target that specifies where to open a page specified by + // href. The value will be passed to the 2nd argument of + // window.open(). + hrefTarget: "", + + // moveTo: String + // The id of the transition destination view which resides in the + // current page. + // + // If the value has a hash sign ('#') before the id (e.g. #view1) + // and the dojo.hash module is loaded by the user application, the + // view transition updates the hash in the browser URL so that the + // user can bookmark the destination view. In this case, the user + // can also use the browser's back/forward button to navigate + // through the views in the browser history. + // + // If null, transitions to a blank view. + // If '#', returns immediately without transition. + moveTo: "", + + // scene: String + // The name of a scene. Used from dojox.mobile.app. + scene: "", + + // clickable: Boolean + // If true, this item becomes clickable even if a transition + // destination (moveTo, etc.) is not specified. + clickable: false, + + // url: String + // A URL of an html fragment page or JSON data that represents a + // new view content. The view content is loaded with XHR and + // inserted in the current page. Then a view transition occurs to + // the newly created view. The view is cached so that subsequent + // requests would not load the content again. + url: "", + + // urlTarget: String + // Node id under which a new view will be created according to the + // url parameter. If not specified, The new view will be created as + // a sibling of the current view. + urlTarget: "", + + // transition: String + // A type of animated transition effect. You can choose from the + // standard transition types, "slide", "fade", "flip", or from the + // extended transition types, "cover", "coverv", "dissolve", + // "reveal", "revealv", "scaleIn", "scaleOut", "slidev", + // "swirl", "zoomIn", "zoomOut". If "none" is specified, transition + // occurs immediately without animation. + transition: "", + + // transitionDir: Number + // The transition direction. If 1, transition forward. If -1, + // transition backward. For example, the slide transition slides + // the view from right to left when dir == 1, and from left to + // right when dir == -1. + transitionDir: 1, + + // transitionOptions: Object + // A hash object that holds transition options. + transitionOptions: null, + + // callback: Function|String + // A callback function that is called when the transition has been + // finished. A function reference, or name of a function in + // context. + callback: null, + + // sync: Boolean + // If true, XHR for the view content specified with the url + // parameter is performed synchronously. If false, it is done + // asynchronously and the progress indicator is displayed while + // loading the content. This parameter is effective only when the + // url parameter is used. + sync: true, + + // label: String + // A label of the item. If the label is not specified, innerHTML is + // used as a label. + label: "", + + // toggle: Boolean + // If true, the item acts like a toggle button. + toggle: false, + + // _duration: Number + // Duration of selection, milliseconds. + _duration: 800, + + + inheritParams: function(){ + var parent = this.getParent(); + if(parent){ + if(!this.transition){ this.transition = parent.transition; } + if(this.icon && parent.iconBase && + parent.iconBase.charAt(parent.iconBase.length - 1) === '/'){ + this.icon = parent.iconBase + this.icon; + } + if(!this.icon){ this.icon = parent.iconBase; } + if(!this.iconPos){ this.iconPos = parent.iconPos; } + } + }, + + select: function(){ + // summary: + // Makes this widget in the selected state. + // description: + // Subclass must implement. + }, + + deselect: function(){ + // summary: + // Makes this widget in the deselected state. + // description: + // Subclass must implement. + }, + + defaultClickAction: function(e){ + if(this.toggle){ + if(this.selected){ + this.deselect(); + }else{ + this.select(); + } + }else if(!this.selected){ + this.select(); + if(!this.selectOne){ + var _this = this; + setTimeout(function(){ + _this.deselect(); + }, this._duration); + } + var transOpts; + if(this.moveTo || this.href || this.url || this.scene){ + transOpts = {moveTo: this.moveTo, href: this.href, url: this.url, scene: this.scene, transition: this.transition, transitionDir: this.transitionDir}; + }else if(this.transitionOptions){ + transOpts = this.transitionOptions; + } + if(transOpts){ + return new TransitionEvent(this.domNode,transOpts,e).dispatch(); + } + } + }, + + getParent: function(){ + // summary: + // Gets the parent widget. + // description: + // Almost equivalent to _Contained#getParent, but this method + // does not cause a script error even if this widget has no + // parent yet. + var ref = this.srcNodeRef || this.domNode; + return ref && ref.parentNode ? registry.getEnclosingWidget(ref.parentNode) : null; + }, + + setTransitionPos: function(e){ + // summary: + // Stores the clicked position for later use. + // description: + // Some of the transition animations (e.g. ScaleIn) needs the + // clicked position. + var w = this; + while(true){ + w = w.getParent(); + if(!w || w instanceof View){ break; } + } + if(w){ + w.clickedPosX = e.clientX; + w.clickedPosY = e.clientY; + } + }, + + transitionTo: function(moveTo, href, url, scene){ + // summary: + // Performs a view transition. + // description: + // Given a transition destination, this method performs a view + // transition. This method is typically called when this item + // is clicked. + 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 + "::transitionTo() is deprecated." + + caller, "", "2.0"); + alreadyCalledHash[caller] = true; + } + } + new TransitionEvent(this.domNode, {moveTo: moveTo, href: href, url: url, scene: scene, + transition: this.transition, transitionDir: this.transitionDir}).dispatch(); + } + }); +}); + +}, +'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. + + 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); + } + } + }); + } +}); + +}, +'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 + + return declare("dijit._Contained", null, { + // summary: + // Mixin for widgets that are children of a container widget + // + // example: + // | // make a basic custom widget that knows about it's parents + // | declare("my.customClass",[dijit._Widget,dijit._Contained],{}); + + _getSibling: function(/*String*/ which){ + // summary: + // Returns next or previous sibling + // which: + // Either "next" or "previous" + // tags: + // private + var node = this.domNode; + do{ + node = node[which+"Sibling"]; + }while(node && node.nodeType != 1); + return node && registry.byNode(node); // dijit._Widget + }, + + getPreviousSibling: function(){ + // summary: + // Returns null if this is the first child of the parent, + // otherwise returns the next element sibling to the "left". + + return this._getSibling("previous"); // dijit._Widget + }, + + getNextSibling: function(){ + // summary: + // Returns null if this is the last child of the parent, + // otherwise returns the next element sibling to the "right". + + return this._getSibling("next"); // dijit._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 + + var p = this.getParent(); + if(!p || !p.getIndexOfChild){ + return -1; // int + } + return p.getIndexOfChild(this); // int + } + }); +}); + +}, +'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 + +var _TextBoxMixin = declare("dijit.form._TextBoxMixin", null, { + // summary: + // A mixin for textbox form input widgets + + // trim: Boolean + // Removes leading and trailing whitespace if true. Default is false. + trim: false, + + // uppercase: Boolean + // Converts all characters to uppercase if true. Default is false. + uppercase: false, + + // lowercase: Boolean + // Converts all characters to lowercase if true. Default is false. + lowercase: false, + + // propercase: Boolean + // Converts the first character of each word to uppercase if true. + propercase: false, + + // maxLength: String + // HTML INPUT tag maxLength declaration. + maxLength: "", + + // selectOnClick: [const] Boolean + // If true, all text will be selected when focused with mouse + selectOnClick: false, + + // placeHolder: String + // Defines a hint to help users fill out the input field (as defined in HTML 5). + // This should only contain plain text (no html markup). + placeHolder: "", + + _getValueAttr: function(){ + // summary: + // Hook so get('value') works as we like. + // description: + // For `dijit.form.TextBox` this basically returns the value of the <input>. + // + // For `dijit.form.MappedTextBox` subclasses, which have both + // a "displayed value" and a separate "submit value", + // This treats the "displayed value" as the master value, computing the + // submit value from it via this.parse(). + return this.parse(this.get('displayedValue'), this.constraints); + }, + + _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ + // summary: + // Hook so set('value', ...) works. + // + // description: + // Sets the value of the widget to "value" which can be of + // any type as determined by the widget. + // + // value: + // The visual element value is also set to a corresponding, + // but not necessarily the same, value. + // + // formattedValue: + // If specified, used to set the visual element value, + // otherwise a computed visual value is used. + // + // priorityChange: + // If true, an onChange event is fired immediately instead of + // waiting for the next blur event. + + var filteredValue; + if(value !== undefined){ + // TODO: this is calling filter() on both the display value and the actual value. + // I added a comment to the filter() definition about this, but it should be changed. + filteredValue = this.filter(value); + if(typeof formattedValue != "string"){ + if(filteredValue !== null && ((typeof filteredValue != "number") || !isNaN(filteredValue))){ + formattedValue = this.filter(this.format(filteredValue, this.constraints)); + }else{ formattedValue = ''; } + } + } + if(formattedValue != null && formattedValue != undefined && ((typeof formattedValue) != "number" || !isNaN(formattedValue)) && this.textbox.value != formattedValue){ + this.textbox.value = formattedValue; + this._set("displayedValue", this.get("displayedValue")); + } + + if(this.textDir == "auto"){ + this.applyTextDir(this.focusNode, formattedValue); + } + + this.inherited(arguments, [filteredValue, priorityChange]); + }, + + // displayedValue: String + // For subclasses like ComboBox where the displayed value + // (ex: Kentucky) and the serialized value (ex: KY) are different, + // this represents the displayed value. + // + // Setting 'displayedValue' through set('displayedValue', ...) + // updates 'value', and vice-versa. Otherwise 'value' is updated + // from 'displayedValue' periodically, like onBlur etc. + // + // TODO: move declaration to MappedTextBox? + // Problem is that ComboBox references displayedValue, + // for benefit of FilteringSelect. + displayedValue: "", + + _getDisplayedValueAttr: function(){ + // summary: + // Hook so get('displayedValue') works. + // description: + // Returns the displayed value (what the user sees on the screen), + // after filtering (ie, trimming spaces etc.). + // + // For some subclasses of TextBox (like ComboBox), the displayed value + // is different from the serialized value that's actually + // sent to the server (see dijit.form.ValidationTextBox.serialize) + + // TODO: maybe we should update this.displayedValue on every keystroke so that we don't need + // this method + // TODO: this isn't really the displayed value when the user is typing + return this.filter(this.textbox.value); + }, + + _setDisplayedValueAttr: function(/*String*/ value){ + // summary: + // Hook so set('displayedValue', ...) works. + // description: + // Sets the value of the visual element to the string "value". + // The widget value is also set to a corresponding, + // but not necessarily the same, value. + + if(value === null || 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); + } + }, + + format: function(value /*=====, constraints =====*/){ + // summary: + // Replaceable function to convert a value to a properly formatted string. + // value: String + // constraints: Object + // tags: + // protected extension + return ((value == null || value == undefined) ? "" : (value.toString ? value.toString() : value)); + }, + + parse: function(value /*=====, constraints =====*/){ + // summary: + // Replaceable function to convert a formatted string to a value + // value: String + // constraints: Object + // tags: + // protected extension + + return value; // String + }, + + _refreshState: function(){ + // summary: + // After the user types some characters, etc., this method is + // called to check the field for validity etc. The base method + // in `dijit.form.TextBox` does nothing, but subclasses override. + // tags: + // protected + }, + + /*===== + onInput: function(event){ + // summary: + // Connect to this function to receive notifications of various user data-input events. + // Return false to cancel the event and prevent it from being processed. + // event: + // keydown | keypress | cut | paste | input + // tags: + // callback + }, + =====*/ + onInput: function(){}, + + __skipInputEvent: false, + _onInput: function(){ + // summary: + // Called AFTER the input event has happened + // set text direction according to textDir that was defined in creation + if(this.textDir == "auto"){ + this.applyTextDir(this.focusNode, this.focusNode.value); + } + + this._refreshState(); + + // In case someone is watch()'ing for changes to displayedValue + this._set("displayedValue", this.get("displayedValue")); + }, + + postCreate: function(){ + // setting the value here is needed since value="" in the template causes "undefined" + // and setting in the DOM (instead of the JS object) helps with form reset actions + this.textbox.setAttribute("value", this.textbox.value); // DOM and JS values should be the same + + this.inherited(arguments); + + // normalize input events to reduce spurious event processing + // onkeydown: do not forward modifier keys + // set charOrCode to numeric keycode + // onkeypress: do not forward numeric charOrCode keys (already sent through onkeydown) + // onpaste & oncut: set charOrCode to 229 (IME) + // oninput: if primary event not already processed, set charOrCode to 229 (IME), else do not forward + var handleEvent = function(e){ + var 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" ], function(event){ + this.connect(this.textbox, event, handleEvent); + }, this); + }, + + _blankValue: '', // if the textbox is blank, what value should be reported + filter: function(val){ + // summary: + // Auto-corrections (such as trimming) that are applied to textbox + // value on blur or form submit. + // description: + // For MappedTextBox subclasses, this is called twice + // - once with the display value + // - once the value as set/returned by set('value', ...) + // and get('value'), ex: a Number for NumberTextBox. + // + // In the latter case it does corrections like converting null to NaN. In + // the former case the NumberTextBox.filter() method calls this.inherited() + // to execute standard trimming code in TextBox.filter(). + // + // TODO: break this into two methods in 2.0 + // + // tags: + // protected extension + if(val === null){ return this._blankValue; } + if(typeof val != "string"){ return val; } + if(this.trim){ + val = lang.trim(val); + } + if(this.uppercase){ + val = val.toUpperCase(); + } + if(this.lowercase){ + val = val.toLowerCase(); + } + if(this.propercase){ + val = val.replace(/[^\s]+/g, function(word){ + return word.substring(0,1).toUpperCase() + word.substring(1); + }); + } + return val; + }, + + _setBlurValue: function(){ + this._setValueAttr(this.get('value'), true); + }, + + _onBlur: function(e){ + if(this.disabled){ return; } + this._setBlurValue(); + this.inherited(arguments); + + 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(); + }, + + 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; +}); + +}, +'dojox/mobile/parser':function(){ +define([ + "dojo/_base/kernel", + "dojo/_base/config", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/ready" +], function(dojo, config, lang, win, ready){ + + // module: + // dojox/mobile/parser + // summary: + // A lightweight parser. + + var dm = lang.getObject("dojox.mobile", true); + + var parser = new function(){ + // summary: + // A lightweight parser. + // description: + // dojox.mobile.parser is an extremely small subset of + // dojo.parser. It has no extended features over dojo.parser, so + // there is no reason you have to use dojox.mobile.parser instead + // of dojo.parser. However, if dojox.mobile.parser's capability is + // enough for your application, use of it could reduce the total + // code size. + + this.instantiate = function(/* Array */nodes, /* Object? */mixin, /* Object? */args){ + // summary: + // Function for instantiating a list of widget nodes. + // nodes: + // The list of DOMNodes to walk and instantiate widgets on. + mixin = mixin || {}; + args = args || {}; + var i, ws = []; + if(nodes){ + for(i = 0; i < nodes.length; i++){ + var n = nodes[i]; + var cls = lang.getObject(n.getAttribute("dojoType") || n.getAttribute("data-dojo-type")); + var proto = cls.prototype; + var params = {}, prop, v, t; + lang.mixin(params, eval('({'+(n.getAttribute("data-dojo-props")||"")+'})')); + lang.mixin(params, args.defaults); + lang.mixin(params, mixin); + for(prop in proto){ + v = n.getAttributeNode(prop); + v = v && v.nodeValue; + t = typeof proto[prop]; + if(!v && (t !== "boolean" || v !== "")){ continue; } + if(t === "string"){ + params[prop] = v; + }else if(t === "number"){ + params[prop] = v - 0; + }else if(t === "boolean"){ + params[prop] = (v !== "false"); + }else if(t === "object"){ + params[prop] = eval("(" + v + ")"); + } + } + params["class"] = n.className; + params.style = n.style && n.style.cssText; + v = n.getAttribute("data-dojo-attach-point"); + if(v){ params.dojoAttachPoint = v; } + v = n.getAttribute("data-dojo-attach-event"); + if(v){ params.dojoAttachEvent = v; } + var instance = new cls(params, n); + ws.push(instance); + var jsId = n.getAttribute("jsId") || n.getAttribute("data-dojo-id"); + if(jsId){ + lang.setObject(jsId, instance); + } + } + for(i = 0; i < ws.length; i++){ + var w = ws[i]; + !args.noStart && w.startup && !w._started && w.startup(); + } + } + return ws; + }; + + this.parse = function(rootNode, args){ + // summary: + // Function to handle parsing for widgets in the current document. + // It is not as powerful as the full parser, but it will handle basic + // use cases fine. + // rootNode: + // The root node in the document to parse from + if(!rootNode){ + rootNode = win.body(); + }else if(!args && rootNode.rootNode){ + // Case where 'rootNode' is really a params object. + args = rootNode; + rootNode = rootNode.rootNode; + } + + var nodes = rootNode.getElementsByTagName("*"); + var i, list = []; + for(i = 0; i < nodes.length; i++){ + var n = nodes[i]; + if(n.getAttribute("dojoType") || n.getAttribute("data-dojo-type")){ + list.push(n); + } + } + var mixin = args && args.template ? {template: true} : null; + return this.instantiate(list, mixin, args); + }; + }(); + if(config.parseOnLoad){ + ready(100, parser, "parse"); + } + dm.parser = parser; // for backward compatibility + dojo.parser = parser; // in case user application calls dojo.parser + return parser; +}); + +}, +'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. + + 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); + if(!this.containerNode){ + // all widgets with descendants must set containerNode + this.containerNode = this.domNode; + } + }, + + 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). + + var refNode = this.containerNode; + if(insertIndex && typeof insertIndex == "number"){ + var children = this.getChildren(); + if(children && children.length >= insertIndex){ + refNode = children[insertIndex-1].domNode; + insertIndex = "after"; + } + } + domConstruct.place(widget.domNode, refNode, insertIndex); + + // If I've been started but the child widget hasn't been started, + // start it now. Make sure to do this after widget has been + // inserted into the DOM tree, so it can see that it's being controlled by me, + // so it doesn't try to size itself. + if(this._started && !widget._started){ + widget.startup(); + } + }, + + removeChild: function(/*Widget|int*/ widget){ + // summary: + // Removes the passed widget instance from this widget but does + // not destroy it. You can also pass in an integer indicating + // the index within the container to remove + + if(typeof widget == "number"){ + widget = this.getChildren()[widget]; + } + + if(widget){ + var node = widget.domNode; + if(node && node.parentNode){ + node.parentNode.removeChild(node); // detach but don't destroy + } + } + }, + + hasChildren: function(){ + // summary: + // Returns true if widget has children, i.e. if this.containerNode contains something. + return this.getChildren().length > 0; // Boolean + }, + + _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 + }, + + 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 + } + }); +}); + +}, +'dojox/mobile/app/SceneController':function(){ +// wrapped by build app +define(["dijit","dojo","dojox","dojo/require!dojox/mobile/_base"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.SceneController"); +dojo.experimental("dojox.mobile.app.SceneController"); +dojo.require("dojox.mobile._base"); + +(function(){ + + var app = dojox.mobile.app; + + var templates = {}; + + dojo.declare("dojox.mobile.app.SceneController", dojox.mobile.View, { + + stageController: null, + + keepScrollPos: false, + + init: function(sceneName, params){ + // summary: + // Initializes the scene by loading the HTML template and code, if it has + // not already been loaded + + this.sceneName = sceneName; + this.params = params; + var templateUrl = app.resolveTemplate(sceneName); + + this._deferredInit = new dojo.Deferred(); + + if(templates[sceneName]){ + // If the template has been cached, do not load it again. + this._setContents(templates[sceneName]); + }else{ + // Otherwise load the template + dojo.xhrGet({ + url: templateUrl, + handleAs: "text" + }).addCallback(dojo.hitch(this, this._setContents)); + } + + return this._deferredInit; + }, + + _setContents: function(templateHtml){ + // summary: + // Sets the content of the View, and invokes either the loading or + // initialization of the scene assistant. + templates[this.sceneName] = templateHtml; + + this.domNode.innerHTML = "<div>" + templateHtml + "</div>"; + + var sceneAssistantName = ""; + + var nameParts = this.sceneName.split("-"); + + for(var i = 0; i < nameParts.length; i++){ + sceneAssistantName += nameParts[i].substring(0, 1).toUpperCase() + + nameParts[i].substring(1); + } + sceneAssistantName += "Assistant"; + this.sceneAssistantName = sceneAssistantName; + + var _this = this; + + dojox.mobile.app.loadResourcesForScene(this.sceneName, function(){ + + console.log("All resources for ",_this.sceneName," loaded"); + + var assistant; + if(typeof(dojo.global[sceneAssistantName]) != "undefined"){ + _this._initAssistant(); + }else{ + var assistantUrl = app.resolveAssistant(_this.sceneName); + + dojo.xhrGet({ + url: assistantUrl, + handleAs: "text" + }).addCallback(function(text){ + try{ + dojo.eval(text); + }catch(e){ + console.log("Error initializing code for scene " + _this.sceneName + + '. Please check for syntax errors'); + throw e; + } + _this._initAssistant(); + }); + } + }); + + }, + + _initAssistant: function(){ + // summary: + // Initializes the scene assistant. At this point, the View is + // populated with the HTML template, and the scene assistant type + // is declared. + + console.log("Instantiating the scene assistant " + this.sceneAssistantName); + + var cls = dojo.getObject(this.sceneAssistantName); + + if(!cls){ + throw Error("Unable to resolve scene assistant " + + this.sceneAssistantName); + } + + this.assistant = new cls(this.params); + + this.assistant.controller = this; + this.assistant.domNode = this.domNode.firstChild; + + this.assistant.setup(); + + this._deferredInit.callback(); + }, + + query: function(selector, node){ + // summary: + // Queries for DOM nodes within either the node passed in as an argument + // or within this view. + + return dojo.query(selector, node || this.domNode) + }, + + parse: function(node){ + var widgets = this._widgets = + dojox.mobile.parser.parse(node || this.domNode, { + controller: this + }); + + // Tell all widgets what their controller is. + for(var i = 0; i < widgets.length; i++){ + widgets[i].set("controller", this); + } + }, + + getWindowSize: function(){ + // TODO, this needs cross browser testing + + return { + w: dojo.global.innerWidth, + h: dojo.global.innerHeight + } + }, + + showAlertDialog: function(props){ + + var size = dojo.marginBox(this.assistant.domNode); + var dialog = new dojox.mobile.app.AlertDialog( + dojo.mixin(props, {controller: this})); + this.assistant.domNode.appendChild(dialog.domNode); + + console.log("Appended " , dialog.domNode, " to ", this.assistant.domNode); + dialog.show(); + }, + + popupSubMenu: function(info){ + var widget = new dojox.mobile.app.ListSelector({ + controller: this, + destroyOnHide: true, + onChoose: info.onChoose + }); + + this.assistant.domNode.appendChild(widget.domNode); + + widget.set("data", info.choices); + widget.show(info.fromNode); + } + }); + +})(); +}); + +}, +'dojox/mobile/app/_base':function(){ +// wrapped by build app +define(["dijit","dojo","dojox","dojo/require!dijit/_base,dijit/_WidgetBase,dojox/mobile,dojox/mobile/parser,dojox/mobile/Button,dojox/mobile/app/_event,dojox/mobile/app/_Widget,dojox/mobile/app/StageController,dojox/mobile/app/SceneController,dojox/mobile/app/SceneAssistant,dojox/mobile/app/AlertDialog,dojox/mobile/app/List,dojox/mobile/app/ListSelector,dojox/mobile/app/TextBox,dojox/mobile/app/ImageView,dojox/mobile/app/ImageThumbView"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app._base"); +dojo.experimental("dojox.mobile.app._base"); + +dojo.require("dijit._base"); +dojo.require("dijit._WidgetBase"); +dojo.require("dojox.mobile"); +dojo.require("dojox.mobile.parser"); +dojo.require("dojox.mobile.Button"); + +dojo.require("dojox.mobile.app._event"); +dojo.require("dojox.mobile.app._Widget"); +dojo.require("dojox.mobile.app.StageController"); +dojo.require("dojox.mobile.app.SceneController"); +dojo.require("dojox.mobile.app.SceneAssistant"); +dojo.require("dojox.mobile.app.AlertDialog"); +dojo.require("dojox.mobile.app.List"); +dojo.require("dojox.mobile.app.ListSelector"); +dojo.require("dojox.mobile.app.TextBox"); +dojo.require("dojox.mobile.app.ImageView"); +dojo.require("dojox.mobile.app.ImageThumbView"); + +(function(){ + + var stageController; + var appInfo; + + var jsDependencies = [ + "dojox.mobile", + "dojox.mobile.parser" + ]; + + var loadedResources = {}; + var loadingDependencies; + + var rootNode; + + var sceneResources = []; + + // Load the required resources asynchronously, since not all mobile OSes + // support dojo.require and sync XHR + function loadResources(resources, callback){ + // summary: + // Loads one or more JavaScript files asynchronously. When complete, + // the first scene is pushed onto the stack. + // resources: + // An array of module names, e.g. 'dojox.mobile.AlertDialog' + + var resource; + var url; + + do { + resource = resources.pop(); + if (resource.source) { + url = resource.source; + }else if (resource.module) { + url= dojo.moduleUrl(resource.module)+".js"; + }else { + console.log("Error: invalid JavaScript resource " + dojo.toJson(resource)); + return; + } + }while (resources.length > 0 && loadedResources[url]); + + if(resources.length < 1 && loadedResources[url]){ + // All resources have already been loaded + callback(); + return; + } + + dojo.xhrGet({ + url: url, + sync: false + }).addCallbacks(function(text){ + dojo["eval"](text); + loadedResources[url] = true; + if(resources.length > 0){ + loadResources(resources, callback); + }else{ + callback(); + } + }, + function(){ + console.log("Failed to load resource " + url); + }); + } + + var pushFirstScene = function(){ + // summary: + // Pushes the first scene onto the stack. + + stageController = new dojox.mobile.app.StageController(rootNode); + var defaultInfo = { + id: "com.test.app", + version: "1.0.0", + initialScene: "main" + }; + + // If the application info has been defined, as it should be, + // use it. + if(dojo.global["appInfo"]){ + dojo.mixin(defaultInfo, dojo.global["appInfo"]); + } + appInfo = dojox.mobile.app.info = defaultInfo; + + // Set the document title from the app info title if it exists + if(appInfo.title){ + var titleNode = dojo.query("head title")[0] || + dojo.create("title", {},dojo.query("head")[0]); + document.title = appInfo.title; + } + + stageController.pushScene(appInfo.initialScene); + }; + + var initBackButton = function(){ + var hasNativeBack = false; + if(dojo.global.BackButton){ + // Android phonegap support + BackButton.override(); + dojo.connect(document, 'backKeyDown', function(e) { + dojo.publish("/dojox/mobile/app/goback"); + }); + hasNativeBack = true; + }else if(dojo.global.Mojo){ + // TODO: add webOS support + } + if(hasNativeBack){ + dojo.addClass(dojo.body(), "mblNativeBack"); + } + }; + + dojo.mixin(dojox.mobile.app, { + init: function(node){ + // summary: + // Initializes the mobile app. Creates the + + rootNode = node || dojo.body(); + dojox.mobile.app.STAGE_CONTROLLER_ACTIVE = true; + + dojo.subscribe("/dojox/mobile/app/goback", function(){ + stageController.popScene(); + }); + + dojo.subscribe("/dojox/mobile/app/alert", function(params){ + dojox.mobile.app.getActiveSceneController().showAlertDialog(params); + }); + + dojo.subscribe("/dojox/mobile/app/pushScene", function(sceneName, params){ + stageController.pushScene(sceneName, params || {}); + }); + + // Get the list of files to load per scene/view + dojo.xhrGet({ + url: "view-resources.json", + load: function(data){ + var resources = []; + + if(data){ + // Should be an array + sceneResources = data = dojo.fromJson(data); + + // Get the list of files to load that have no scene + // specified, and therefore should be loaded on + // startup + for(var i = 0; i < data.length; i++){ + if(!data[i].scene){ + resources.push(data[i]); + } + } + } + if(resources.length > 0){ + loadResources(resources, pushFirstScene); + }else{ + pushFirstScene(); + } + }, + error: pushFirstScene + }); + + initBackButton(); + }, + + getActiveSceneController: function(){ + // summary: + // Gets the controller for the active scene. + + return stageController.getActiveSceneController(); + }, + + getStageController: function(){ + // summary: + // Gets the stage controller. + return stageController; + }, + + loadResources: function(resources, callback){ + loadResources(resources, callback); + }, + + loadResourcesForScene: function(sceneName, callback){ + var resources = []; + + // Get the list of files to load that have no scene + // specified, and therefore should be loaded on + // startup + for(var i = 0; i < sceneResources.length; i++){ + if(sceneResources[i].scene == sceneName){ + resources.push(sceneResources[i]); + } + } + + if(resources.length > 0){ + loadResources(resources, callback); + }else{ + callback(); + } + }, + + resolveTemplate: function(sceneName){ + // summary: + // Given the name of a scene, returns the path to it's template + // file. For example, for a scene named 'main', the file + // returned is 'app/views/main/main-scene.html' + // This function can be overridden if it is desired to have + // a different name to file mapping. + return "app/views/" + sceneName + "/" + sceneName + "-scene.html"; + }, + + resolveAssistant: function(sceneName){ + // summary: + // Given the name of a scene, returns the path to it's assistant + // file. For example, for a scene named 'main', the file + // returned is 'app/assistants/main-assistant.js' + // This function can be overridden if it is desired to have + // a different name to file mapping. + return "app/assistants/" + sceneName + "-assistant.js"; + } + }); +})(); +}); + +}, +'dijit/_base/scroll':function(){ +define("dijit/_base/scroll", [ + "dojo/window", // windowUtils.scrollIntoView + ".." // export symbol to dijit +], function(windowUtils, dijit){ + // module: + // dijit/_base/scroll + // summary: + // Back compatibility module, new code should use windowUtils directly instead of using this module. + + dijit.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){ + // summary: + // Scroll the passed node into view, if it is not already. + // Deprecated, use `windowUtils.scrollIntoView` instead. + + windowUtils.scrollIntoView(node, pos); + }; +}); + +}, +'dojo/fx':function(){ +define([ + "./_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/_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 + + return dijit._base; +}); + +}, +'dojox/mobile/sniff':function(){ +define("dojox/mobile/sniff", [ + "dojo/_base/window", + "dojo/_base/sniff" +], function(win, has){ + + var ua = navigator.userAgent; + + // BlackBerry (OS 6 or later only) + has.add("bb", ua.indexOf("BlackBerry") >= 0 && parseFloat(ua.split("Version/")[1]) || undefined, undefined, true); + + // Android + has.add("android", parseFloat(ua.split("Android ")[1]) || undefined, undefined, true); + + // iPhone, iPod, or iPad + // If iPod or iPad is detected, in addition to has("ipod") or has("ipad"), + // has("iphone") will also have iOS version number. + if(ua.match(/(iPhone|iPod|iPad)/)){ + var p = RegExp.$1.replace(/P/, 'p'); + var v = ua.match(/OS ([\d_]+)/) ? RegExp.$1 : "1"; + var os = parseFloat(v.replace(/_/, '.').replace(/_/g, '')); + has.add(p, os, undefined, true); + has.add("iphone", os, undefined, true); + } + + if(has("webkit")){ + has.add("touch", (typeof win.doc.documentElement.ontouchstart != "undefined" && + navigator.appVersion.indexOf("Mobile") != -1) || !!has("android"), undefined, true); + } + + return has; +}); + +}, +'dojox/mobile/ProgressIndicator':function(){ +define("dojox/mobile/ProgressIndicator", [ + "dojo/_base/config", + "dojo/_base/declare", + "dojo/dom-construct", + "dojo/dom-style", + "dojo/has" +], function(config, declare, domConstruct, domStyle, has){ + + // module: + // dojox/mobile/ProgressIndicator + // summary: + // A progress indication widget. + + var cls = declare("dojox.mobile.ProgressIndicator", null, { + // summary: + // A progress indication widget. + // description: + // ProgressIndicator is a round spinning graphical representation + // that indicates the current task is on-going. + + // interval: Number + // The time interval in milliseconds for updating the spinning + // indicator. + interval: 100, + + // colors: Array + // An array of indicator colors. + colors: [ + "#C0C0C0", "#C0C0C0", "#C0C0C0", "#C0C0C0", + "#C0C0C0", "#C0C0C0", "#B8B9B8", "#AEAFAE", + "#A4A5A4", "#9A9A9A", "#8E8E8E", "#838383" + ], + + constructor: function(){ + this._bars = []; + this.domNode = domConstruct.create("DIV"); + this.domNode.className = "mblProgContainer"; + if(config["mblAndroidWorkaround"] !== false && has("android") >= 2.2 && has("android") < 3){ + // workaround to avoid the side effects of the fixes for android screen flicker problem + domStyle.set(this.domNode, "webkitTransform", "translate3d(0,0,0)"); + } + this.spinnerNode = domConstruct.create("DIV", null, this.domNode); + for(var i = 0; i < this.colors.length; i++){ + var div = domConstruct.create("DIV", {className:"mblProg mblProg"+i}, this.spinnerNode); + this._bars.push(div); + } + }, + + start: function(){ + // summary: + // Starts the ProgressIndicator spinning. + if(this.imageNode){ + var img = this.imageNode; + var l = Math.round((this.domNode.offsetWidth - img.offsetWidth) / 2); + var t = Math.round((this.domNode.offsetHeight - img.offsetHeight) / 2); + img.style.margin = t+"px "+l+"px"; + return; + } + var cntr = 0; + var _this = this; + var n = this.colors.length; + this.timer = setInterval(function(){ + cntr--; + cntr = cntr < 0 ? n - 1 : cntr; + var c = _this.colors; + for(var i = 0; i < n; i++){ + var idx = (cntr + i) % n; + _this._bars[i].style.backgroundColor = c[idx]; + } + }, this.interval); + }, + + stop: function(){ + // summary: + // Stops the ProgressIndicator spinning. + if(this.timer){ + clearInterval(this.timer); + } + this.timer = null; + if(this.domNode.parentNode){ + this.domNode.parentNode.removeChild(this.domNode); + } + }, + + setImage: function(/*String*/file){ + // summary: + // Sets an indicator icon image file (typically animated GIF). + // If null is specified, restores the default spinner. + if(file){ + this.imageNode = domConstruct.create("IMG", {src:file}, this.domNode); + this.spinnerNode.style.display = "none"; + }else{ + if(this.imageNode){ + this.domNode.removeChild(this.imageNode); + this.imageNode = null; + } + this.spinnerNode.style.display = ""; + } + } + }); + + cls._instance = null; + cls.getInstance = function(){ + if(!cls._instance){ + cls._instance = new cls(); + } + return cls._instance; + }; + + return cls; +}); + +}, +'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. + +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. + + // name: [const] String + // Name used when submitting form; same as "name" attribute or plain HTML elements + name: "", + + // alt: String + // Corresponds to the native HTML <input> element's attribute. + alt: "", + + // value: String + // Corresponds to the native HTML <input> element's attribute. + value: "", + + // type: [const] String + // Corresponds to the native HTML <input> element's attribute. + type: "text", + + // 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> + + // disabled: Boolean + // Should this widget respond to user input? + // In markup, this is specified as "disabled='disabled'", or just "disabled". + disabled: false, + + // intermediateChanges: Boolean + // Fires onChange for each value change or only on demand + intermediateChanges: false, + + // scrollOnFocus: Boolean + // On focus, should this widget scroll into view? + scrollOnFocus: true, + + // Override _WidgetBase mapping id to this.domNode, needs to be on focusNode so <label> etc. + // works with screen reader + _setIdAttr: "focusNode", + + postCreate: function(){ + this.inherited(arguments); + this.connect(this.domNode, "onmousedown", "_onMouseDown"); + }, + + _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); + + 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(e){ + if(this.scrollOnFocus){ + winUtils.scrollIntoView(this.domNode); + } + this.inherited(arguments); + }, + + isFocusable: function(){ + // summary: + // Tells if this widget is focusable or not. Used internally by dijit. + // tags: + // protected + return !this.disabled && this.focusNode && (domStyle.get(this.domNode, "display") != "none"); + }, + + focus: function(){ + // summary: + // Put focus on this widget + if(!this.disabled && this.focusNode.focus){ + try{ this.focusNode.focus(); }catch(e){}/*squelch errors from hidden nodes*/ + } + }, + + compare: function(/*anything*/ val1, /*anything*/ val2){ + // summary: + // Compare 2 values (as returned by get('value') for this widget). + // tags: + // protected + if(typeof val1 == "number" && typeof val2 == "number"){ + return (isNaN(val1) && isNaN(val2)) ? 0 : val1 - val2; + }else if(val1 > val2){ + return 1; + }else if(val1 < val2){ + return -1; + }else{ + return 0; + } + }, + + onChange: function(/*===== newValue =====*/){ + // summary: + // Callback when this widget's value is changed. + // tags: + // callback + }, + + // _onChangeActive: [private] Boolean + // Indicates that changes to the value should call onChange() callback. + // This is false during widget initialization, to avoid calling onChange() + // when the initial value is set. + _onChangeActive: false, + + _handleOnChange: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ + // summary: + // Called when the value of the widget is set. Calls onChange() if appropriate + // newValue: + // the new value + // priorityChange: + // For a slider, for example, dragging the slider is priorityChange==false, + // but on mouse up, it's priorityChange==true. If intermediateChanges==false, + // onChange is only called form priorityChange=true events. + // tags: + // private + if(this._lastValueReported == undefined && (priorityChange === null || !this._onChangeActive)){ + // this block executes not for a change, but during initialization, + // and is used to store away the original value (or for ToggleButton, the original checked state) + this._resetValue = this._lastValueReported = newValue; + } + this._pendingOnChange = this._pendingOnChange + || (typeof newValue != typeof this._lastValueReported) + || (this.compare(newValue, this._lastValueReported) != 0); + if((this.intermediateChanges || priorityChange || priorityChange === undefined) && this._pendingOnChange){ + this._lastValueReported = newValue; + this._pendingOnChange = false; + if(this._onChangeActive){ + if(this._onChangeHandle){ + clearTimeout(this._onChangeHandle); + } + // setTimeout allows hidden value processing to run and + // also the onChange handler can safely adjust focus, etc + this._onChangeHandle = setTimeout(lang.hitch(this, + function(){ + this._onChangeHandle = null; + this.onChange(newValue); + }), 0); // try to collapse multiple onChange's fired faster than can be processed + } + } + }, + + create: function(){ + // Overrides _Widget.create() + this.inherited(arguments); + this._onChangeActive = true; + }, + + destroy: function(){ + if(this._onChangeHandle){ // destroy called before last onChange has fired + clearTimeout(this._onChangeHandle); + this.onChange(this._lastValueReported); + } + this.inherited(arguments); + }, + + _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. + // IE exhibits strange scrolling behavior when focusing a node so only do it when !focused. + // FF needs the extra help to make sure the mousedown actually gets to the focusNode + if((!this.focused || !has("ie")) && !e.ctrlKey && mouse.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(win.body(), "onmouseup", function(){ + if(this.isFocusable()){ + this.focus(); + } + this.disconnect(mouseUpConnector); + }); + } + } +}); + +}); + +}, +'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 + + // TODO: remove _frames, it isn't being used much, since popups never release their + // iframes (see [22236]) + var _frames = new function(){ + // summary: + // cache of iframes + + var queue = []; + + this.pop = function(){ + var iframe; + if(queue.length){ + iframe = queue.pop(); + iframe.style.display=""; + }else{ + if(has("ie") < 9){ + var burl = config["dojoBlankHtmlUrl"] || require.toUrl("dojo/resources/blank.html") || "javascript:\"\""; + var html="<iframe src='" + burl + "' role='presentation'" + + " style='position: absolute; left: 0px; top: 0px;" + + "z-index: -1; filter:Alpha(Opacity=\"0\");'>"; + iframe = win.doc.createElement(html); + }else{ + iframe = domConstruct.create("iframe"); + iframe.src = 'javascript:""'; + iframe.className = "dijitBackgroundIframe"; + iframe.setAttribute("role", "presentation"); + domStyle.set(iframe, "opacity", 0.1); + } + iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didn't work. + } + return iframe; + }; + + this.push = function(iframe){ + iframe.style.display="none"; + queue.push(iframe); + } + }(); + + + dijit.BackgroundIframe = function(/*DomNode*/ node){ + // summary: + // For IE/FF z-index schenanigans. id attribute is required. + // + // description: + // new dijit.BackgroundIframe(node) + // Makes a background iframe as a child of node, that fills + // area (and position) of node + + if(!node.id){ throw new Error("no id"); } + if(has("ie") || has("mozilla")){ + var iframe = (this.iframe = _frames.pop()); + node.appendChild(iframe); + if(has("ie")<7 || has("quirks")){ + this.resize(node); + this._conn = on(node, 'resize', lang.hitch(this, function(){ + this.resize(node); + })); + }else{ + domStyle.set(iframe, { + width: '100%', + height: '100%' + }); + } + } + }; + + lang.extend(dijit.BackgroundIframe, { + resize: function(node){ + // summary: + // Resize the iframe so it's the same size as node. + // Needed on IE6 and IE/quirks because height:100% doesn't work right. + if(this.iframe){ + domStyle.set(this.iframe, { + width: node.offsetWidth + 'px', + height: node.offsetHeight + 'px' + }); + } + }, + destroy: function(){ + // summary: + // destroy the iframe + if(this._conn){ + this._conn.remove(); + this._conn = null; + } + if(this.iframe){ + _frames.push(this.iframe); + delete this.iframe; + } + } + }); + + return dijit.BackgroundIframe; +}); + +}, +'dojox/mobile':function(){ +define([ + ".", + "dojo/_base/lang", + "dojox/mobile/_base" +], function(dojox, lang, base){ + lang.getObject("mobile", true, dojox); + return dojox.mobile; +}); + +}, +'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. + + return declare("dijit.form._FormValueMixin", _FormWidgetMixin, { + // summary: + // Mixin for widgets corresponding to native HTML elements such as <input> or <select> that have user changeable values. + // description: + // Each _FormValueMixin represents a single input value, and has a (possibly hidden) <input> element, + // to which it serializes it's input value, so that form submission (either normal submission or via FormBind?) + // works as expected. + + // readOnly: Boolean + // Should this widget respond to user input? + // In markup, this is specified as "readOnly". + // Similar to disabled except readOnly form values are submitted. + readOnly: false, + + _setReadOnlyAttr: function(/*Boolean*/ value){ + domAttr.set(this.focusNode, 'readOnly', value); + this.focusNode.setAttribute("aria-readonly", value); + this._set("readOnly", value); + }, + + postCreate: function(){ + this.inherited(arguments); + + if(has("ie")){ // IE won't stop the event with keypress + this.connect(this.focusNode || this.domNode, "onkeydown", this._onKeyDown); + } + // Update our reset value if it hasn't yet been set (because this.set() + // is only called when there *is* a value) + if(this._resetValue === undefined){ + this._lastValueReported = this._resetValue = this.value; + } + }, + + _setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ + // summary: + // Hook so set('value', value) works. + // description: + // Sets the value of the widget. + // If the value has changed, then fire onChange event, unless priorityChange + // is specified as null (or false?) + this._handleOnChange(newValue, priorityChange); + }, + + _handleOnChange: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ + // summary: + // Called when the value of the widget has changed. Saves the new value in this.value, + // and calls onChange() if appropriate. See _FormWidget._handleOnChange() for details. + this._set("value", newValue); + this.inherited(arguments); + }, + + undo: function(){ + // summary: + // Restore the value to the last value passed to onChange + this._setValueAttr(this._lastValueReported, false); + }, + + reset: function(){ + // summary: + // Reset the widget's value to what it was at initialization time + this._hasBeenBlurred = false; + this._setValueAttr(this._resetValue, true); + }, + + _onKeyDown: function(e){ + if(e.keyCode == keys.ESCAPE && !(e.ctrlKey || e.altKey || e.metaKey)){ + 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); + } + } + } + }); +}); + +}, +'dojox/mobile/common':function(){ +define("dojox/mobile/common", [ + "dojo/_base/kernel", // to test dojo.hash + "dojo/_base/array", + "dojo/_base/config", + "dojo/_base/connect", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-style", +// "dojo/hash", // optionally prereq'ed + "dojo/ready", + "dijit/registry", // registry.toArray + "./sniff", + "./uacss" +], function(dojo, array, config, connect, lang, win, domClass, domConstruct, domStyle, ready, registry, has, uacss){ + + var dm = lang.getObject("dojox.mobile", true); +/*===== + var dm = dojox.mobile; +=====*/ + + // module: + // dojox/mobile/common + // summary: + // A common module for dojox.mobile. + // description: + // This module includes common utility functions that are used by + // dojox.mobile widgets. Also, it provides functions that are commonly + // necessary for mobile web applications, such as the hide address bar + // function. + + dm.getScreenSize = function(){ + // summary: + // Returns the dimensions of the browser window. + return { + h: win.global.innerHeight || win.doc.documentElement.clientHeight, + w: win.global.innerWidth || win.doc.documentElement.clientWidth + }; + }; + + dm.updateOrient = function(){ + // summary: + // Updates the orientation specific css classes, 'dj_portrait' and + // 'dj_landscape'. + var dim = dm.getScreenSize(); + domClass.replace(win.doc.documentElement, + dim.h > dim.w ? "dj_portrait" : "dj_landscape", + dim.h > dim.w ? "dj_landscape" : "dj_portrait"); + }; + dm.updateOrient(); + + dm.tabletSize = 500; + dm.detectScreenSize = function(/*Boolean?*/force){ + // summary: + // Detects the screen size and determines if the screen is like + // phone or like tablet. If the result is changed, + // it sets either of the following css class to <html> + // - 'dj_phone' + // - 'dj_tablet' + // and it publishes either of the following events. + // - '/dojox/mobile/screenSize/phone' + // - '/dojox/mobile/screenSize/tablet' + var dim = dm.getScreenSize(); + var sz = Math.min(dim.w, dim.h); + var from, to; + if(sz >= dm.tabletSize && (force || (!this._sz || this._sz < dm.tabletSize))){ + from = "phone"; + to = "tablet"; + }else if(sz < dm.tabletSize && (force || (!this._sz || this._sz >= dm.tabletSize))){ + from = "tablet"; + to = "phone"; + } + if(to){ + domClass.replace(win.doc.documentElement, "dj_"+to, "dj_"+from); + connect.publish("/dojox/mobile/screenSize/"+to, [dim]); + } + this._sz = sz; + }; + dm.detectScreenSize(); + + dm.setupIcon = function(/*DomNode*/iconNode, /*String*/iconPos){ + // summary: + // Sets up CSS sprite for a foreground image. + if(iconNode && iconPos){ + var arr = array.map(iconPos.split(/[ ,]/),function(item){return item-0}); + var t = arr[0]; // top + var r = arr[1] + arr[2]; // right + var b = arr[0] + arr[3]; // bottom + var l = arr[1]; // left + domStyle.set(iconNode, { + clip: "rect("+t+"px "+r+"px "+b+"px "+l+"px)", + top: (iconNode.parentNode ? domStyle.get(iconNode, "top") : 0) - t + "px", + left: -l + "px" + }); + } + }; + + // dojox.mobile.hideAddressBarWait: Number + // The time in milliseconds to wait before the fail-safe hiding address + // bar runs. The value must be larger than 800. + dm.hideAddressBarWait = typeof(config["mblHideAddressBarWait"]) === "number" ? + config["mblHideAddressBarWait"] : 1500; + + dm.hide_1 = function(force){ + // summary: + // Internal function to hide the address bar. + scrollTo(0, 1); + var h = dm.getScreenSize().h + "px"; + if(has("android")){ + if(force){ + win.body().style.minHeight = h; + } + dm.resizeAll(); + }else{ + if(force || dm._h === h && h !== win.body().style.minHeight){ + win.body().style.minHeight = h; + dm.resizeAll(); + } + } + dm._h = h; + }; + + dm.hide_fs = function(){ + // summary: + // Internal function to hide the address bar for fail-safe. + // description: + // Resets the height of the body, performs hiding the address + // bar, and calls resizeAll(). + // This is for fail-safe, in case of failure to complete the + // address bar hiding in time. + var t = win.body().style.minHeight; + win.body().style.minHeight = (dm.getScreenSize().h * 2) + "px"; // to ensure enough height for scrollTo to work + scrollTo(0, 1); + setTimeout(function(){ + dm.hide_1(1); + dm._hiding = false; + }, 1000); + }; + dm.hideAddressBar = function(/*Event?*/evt){ + // summary: + // Hides the address bar. + // description: + // Tries hiding of the address bar a couple of times to do it as + // quick as possible while ensuring resize is done after the hiding + // finishes. + if(dm.disableHideAddressBar || dm._hiding){ return; } + dm._hiding = true; + dm._h = 0; + win.body().style.minHeight = (dm.getScreenSize().h * 2) + "px"; // to ensure enough height for scrollTo to work + setTimeout(dm.hide_1, 0); + setTimeout(dm.hide_1, 200); + setTimeout(dm.hide_1, 800); + setTimeout(dm.hide_fs, dm.hideAddressBarWait); + }; + + dm.resizeAll = function(/*Event?*/evt, /*Widget?*/root){ + // summary: + // Call the resize() method of all the top level resizable widgets. + // description: + // Find all widgets that do not have a parent or the parent does not + // have the resize() method, and call resize() for them. + // If a widget has a parent that has resize(), call of the widget's + // resize() is its parent's responsibility. + // evt: + // Native event object + // root: + // If specified, search the specified widget recursively for top level + // resizable widgets. + // root.resize() is always called regardless of whether root is a + // top level widget or not. + // If omitted, search the entire page. + if(dm.disableResizeAll){ return; } + connect.publish("/dojox/mobile/resizeAll", [evt, root]); + dm.updateOrient(); + dm.detectScreenSize(); + var isTopLevel = function(w){ + var parent = w.getParent && w.getParent(); + return !!((!parent || !parent.resize) && w.resize); + }; + var resizeRecursively = function(w){ + array.forEach(w.getChildren(), function(child){ + if(isTopLevel(child)){ child.resize(); } + resizeRecursively(child); + }); + }; + if(root){ + if(root.resize){ root.resize(); } + resizeRecursively(root); + }else{ + array.forEach(array.filter(registry.toArray(), isTopLevel), + function(w){ w.resize(); }); + } + }; + + dm.openWindow = function(url, target){ + // summary: + // Opens a new browser window with the given url. + win.global.open(url, target || "_blank"); + }; + + dm.createDomButton = function(/*DomNode*/refNode, /*Object?*/style, /*DomNode?*/toNode){ + // summary: + // Creates a DOM button. + // description: + // DOM button is a simple graphical object that consists of one or + // more nested DIV elements with some CSS styling. It can be used + // in place of an icon image on ListItem, IconItem, and so on. + // The kind of DOM button to create is given as a class name of + // refNode. The number of DIVs to create is searched from the style + // sheets in the page. However, if the class name has a suffix that + // starts with an underscore, like mblDomButtonGoldStar_5, then the + // suffixed number is used instead. A class name for DOM button + // must starts with 'mblDomButton'. + // refNode: + // A node that has a DOM button class name. + // style: + // A hash object to set styles to the node. + // toNode: + // A root node to create a DOM button. If omitted, refNode is used. + + if(!dm._domButtons){ + if(has("webkit")){ + var findDomButtons = function(sheet, dic){ + // summary: + // Searches the style sheets for DOM buttons. + // description: + // Returns a key-value pair object whose keys are DOM + // button class names and values are the number of DOM + // elements they need. + var i, j; + if(!sheet){ + var dic = {}; + var ss = dojo.doc.styleSheets; + for (i = 0; i < ss.length; i++){ + ss[i] && findDomButtons(ss[i], dic); + } + return dic; + } + var rules = sheet.cssRules || []; + for (i = 0; i < rules.length; i++){ + var rule = rules[i]; + if(rule.href && rule.styleSheet){ + findDomButtons(rule.styleSheet, dic); + }else if(rule.selectorText){ + var sels = rule.selectorText.split(/,/); + for (j = 0; j < sels.length; j++){ + var sel = sels[j]; + var n = sel.split(/>/).length - 1; + if(sel.match(/(mblDomButton\w+)/)){ + var cls = RegExp.$1; + if(!dic[cls] || n > dic[cls]){ + dic[cls] = n; + } + } + } + } + } + } + dm._domButtons = findDomButtons(); + }else{ + dm._domButtons = {}; + } + } + + var s = refNode.className; + var node = toNode || refNode; + if(s.match(/(mblDomButton\w+)/) && s.indexOf("/") === -1){ + var btnClass = RegExp.$1; + var nDiv = 4; + if(s.match(/(mblDomButton\w+_(\d+))/)){ + nDiv = RegExp.$2 - 0; + }else if(dm._domButtons[btnClass] !== undefined){ + nDiv = dm._domButtons[btnClass]; + } + var props = null; + if(has("bb") && config["mblBBBoxShadowWorkaround"] !== false){ + // Removes box-shadow because BlackBerry incorrectly renders it. + props = {style:"-webkit-box-shadow:none"}; + } + for(var i = 0, p = node; i < nDiv; i++){ + p = p.firstChild || domConstruct.create("DIV", props, p); + } + if(toNode){ + setTimeout(function(){ + domClass.remove(refNode, btnClass); + }, 0); + domClass.add(toNode, btnClass); + } + }else if(s.indexOf(".") !== -1){ // file name + domConstruct.create("IMG", {src:s}, node); + }else{ + return null; + } + domClass.add(node, "mblDomButton"); + if(config["mblAndroidWorkaround"] !== false && has("android") >= 2.2){ + // Android workaround for the issue that domButtons' -webkit-transform styles sometimes invalidated + // by applying -webkit-transform:translated3d(x,y,z) style programmatically to non-ancestor elements, + // which results in breaking domButtons. + domStyle.set(node, "webkitTransform", "translate3d(0,0,0)"); + } + !!style && domStyle.set(node, style); + return node; + }; + + dm.createIcon = function(/*String*/icon, /*String*/iconPos, /*DomNode*/node, /*String?*/title, /*DomNode?*/parent){ + // summary: + // Creates or updates an icon node + // description: + // If node exists, updates the existing node. Otherwise, creates a new one. + // icon: + // Path for an image, or DOM button class name. + if(icon && icon.indexOf("mblDomButton") === 0){ + // DOM button + if(node && node.className.match(/(mblDomButton\w+)/)){ + domClass.remove(node, RegExp.$1); + }else{ + node = domConstruct.create("DIV"); + } + node.title = title; + domClass.add(node, icon); + dm.createDomButton(node); + }else if(icon && icon !== "none"){ + // Image + if(!node || node.nodeName !== "IMG"){ + node = domConstruct.create("IMG", { + alt: title + }); + } + node.src = (icon || "").replace("${theme}", dm.currentTheme); + dm.setupIcon(node, iconPos); + if(parent && iconPos){ + var arr = iconPos.split(/[ ,]/); + domStyle.set(parent, { + width: arr[2] + "px", + height: arr[3] + "px" + }); + } + } + if(parent){ + parent.appendChild(node); + } + return node; + }; + + // flag for iphone flicker workaround + dm._iw = config["mblIosWorkaround"] !== false && has("iphone"); + if(dm._iw){ + dm._iwBgCover = domConstruct.create("div"); // Cover to hide flicker in the background + } + + if(config.parseOnLoad){ + ready(90, function(){ + // avoid use of query + /* + var list = query('[lazy=true] [dojoType]', null); + list.forEach(function(node, index, nodeList){ + node.setAttribute("__dojoType", node.getAttribute("dojoType")); + node.removeAttribute("dojoType"); + }); + */ + + var nodes = win.body().getElementsByTagName("*"); + var i, len, s; + len = nodes.length; + for(i = 0; i < len; i++){ + s = nodes[i].getAttribute("dojoType"); + if(s){ + if(nodes[i].parentNode.getAttribute("lazy") == "true"){ + nodes[i].setAttribute("__dojoType", s); + nodes[i].removeAttribute("dojoType"); + } + } + } + }); + } + + ready(function(){ + dm.detectScreenSize(true); + if(config["mblApplyPageStyles"] !== false){ + domClass.add(win.doc.documentElement, "mobile"); + } + if(has("chrome")){ + // dojox.mobile does not load uacss (only _compat does), but we need dj_chrome. + domClass.add(win.doc.documentElement, "dj_chrome"); + } + + if(config["mblAndroidWorkaround"] !== false && has("android") >= 2.2){ // workaround for android screen flicker problem + if(config["mblAndroidWorkaroundButtonStyle"] !== false){ + // workaround to avoid buttons disappear due to the side-effect of the webkitTransform workaroud below + domConstruct.create("style", {innerHTML:"BUTTON,INPUT[type='button'],INPUT[type='submit'],INPUT[type='reset'],INPUT[type='file']::-webkit-file-upload-button{-webkit-appearance:none;}"}, win.doc.head, "first"); + } + if(has("android") < 3){ // for Android 2.2.x and 2.3.x + domStyle.set(win.doc.documentElement, "webkitTransform", "translate3d(0,0,0)"); + // workaround for auto-scroll issue when focusing input fields + connect.connect(null, "onfocus", null, function(e){ + domStyle.set(win.doc.documentElement, "webkitTransform", ""); + }); + connect.connect(null, "onblur", null, function(e){ + domStyle.set(win.doc.documentElement, "webkitTransform", "translate3d(0,0,0)"); + }); + }else{ // for Android 3.x + if(config["mblAndroid3Workaround"] !== false){ + domStyle.set(win.doc.documentElement, { + webkitBackfaceVisibility: "hidden", + webkitPerspective: 8000 + }); + } + } + } + + // You can disable hiding the address bar with the following djConfig. + // var djConfig = { mblHideAddressBar: false }; + var f = dm.resizeAll; + if(config["mblHideAddressBar"] !== false && + navigator.appVersion.indexOf("Mobile") != -1 || + config["mblForceHideAddressBar"] === true){ + dm.hideAddressBar(); + if(config["mblAlwaysHideAddressBar"] === true){ + f = dm.hideAddressBar; + } + } + connect.connect(null, (win.global.onorientationchange !== undefined && !has("android")) + ? "onorientationchange" : "onresize", null, f); + + // avoid use of query + /* + var list = query('[__dojoType]', null); + list.forEach(function(node, index, nodeList){ + node.setAttribute("dojoType", node.getAttribute("__dojoType")); + node.removeAttribute("__dojoType"); + }); + */ + + var nodes = win.body().getElementsByTagName("*"); + var i, len = nodes.length, s; + for(i = 0; i < len; i++){ + s = nodes[i].getAttribute("__dojoType"); + if(s){ + nodes[i].setAttribute("dojoType", s); + nodes[i].removeAttribute("__dojoType"); + } + } + + if(dojo.hash){ + // find widgets under root recursively + var findWidgets = function(root){ + if(!root){ return []; } + var arr = registry.findWidgets(root); + var widgets = arr; + for(var i = 0; i < widgets.length; i++){ + arr = arr.concat(findWidgets(widgets[i].containerNode)); + } + return arr; + }; + connect.subscribe("/dojo/hashchange", null, function(value){ + var view = dm.currentView; + if(!view){ return; } + var params = dm._params; + if(!params){ // browser back/forward button was pressed + var moveTo = value ? value : dm._defaultView.id; + var widgets = findWidgets(view.domNode); + var dir = 1, transition = "slide"; + for(i = 0; i < widgets.length; i++){ + var w = widgets[i]; + if("#"+moveTo == w.moveTo){ + // found a widget that has the given moveTo + transition = w.transition; + dir = (w instanceof dm.Heading) ? -1 : 1; + break; + } + } + params = [ moveTo, dir, transition ]; + } + view.performTransition.apply(view, params); + dm._params = null; + }); + } + + win.body().style.visibility = "visible"; + }); + + // To search _parentNode first. TODO:1.8 reconsider this redefinition. + registry.getEnclosingWidget = function(node){ + while(node){ + var id = node.getAttribute && node.getAttribute("widgetId"); + if(id){ + return registry.byId(id); + } + node = node._parentNode || node.parentNode; + } + return null; + }; + + return dm; +}); + +}, +'dojox/mobile/Heading':function(){ +define([ + "dojo/_base/array", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-style", + "dijit/registry", // registry.byId + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase", + "./View" +], function(array, connect, declare, lang, win, domClass, domConstruct, domStyle, registry, Contained, Container, WidgetBase, View){ + + var dm = lang.getObject("dojox.mobile", true); + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/Heading + // summary: + // A widget that represents a navigation bar. + + return declare("dojox.mobile.Heading", [WidgetBase, Container, Contained],{ + // summary: + // A widget that represents a navigation bar. + // description: + // Heading is a widget that represents a navigation bar, which + // usually appears at the top of an application. It usually + // displays the title of the current view and can contain a + // navigational control. If you use it with + // dojox.mobile.ScrollableView, it can also be used as a fixed + // header bar or a fixed footer bar. In such cases, specify the + // fixed="top" attribute to be a fixed header bar or the + // fixed="bottom" attribute to be a fixed footer bar. Heading can + // have one or more ToolBarButton widgets as its children. + + // back: String + // A label for the navigational control to return to the previous + // View. + back: "", + + // href: String + // A URL to open when the navigational control is pressed. + href: "", + + // moveTo: String + // The id of the transition destination view which resides in the + // current page. + // + // If the value has a hash sign ('#') before the id (e.g. #view1) + // and the dojo.hash module is loaded by the user application, the + // view transition updates the hash in the browser URL so that the + // user can bookmark the destination view. In this case, the user + // can also use the browser's back/forward button to navigate + // through the views in the browser history. + // + // If null, transitions to a blank view. + // If '#', returns immediately without transition. + moveTo: "", + + // transition: String + // A type of animated transition effect. You can choose from the + // standard transition types, "slide", "fade", "flip", or from the + // extended transition types, "cover", "coverv", "dissolve", + // "reveal", "revealv", "scaleIn", "scaleOut", "slidev", + // "swirl", "zoomIn", "zoomOut". If "none" is specified, transition + // occurs immediately without animation. + transition: "slide", + + // label: String + // A title text of the heading. If the label is not specified, the + // innerHTML of the node is used as a label. + label: "", + + // iconBase: String + // The default icon path for child items. + iconBase: "", + + // backProp: Object + // Properties for the back button. + backProp: {className: "mblArrowButton"}, + + // tag: String + // A name of html tag to create as domNode. + tag: "H1", + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement(this.tag); + this.domNode.className = "mblHeading"; + if(!this.label){ + array.forEach(this.domNode.childNodes, function(n){ + if(n.nodeType == 3){ + var v = lang.trim(n.nodeValue); + if(v){ + this.label = v; + this.labelNode = domConstruct.create("SPAN", {innerHTML:v}, n, "replace"); + } + } + }, this); + } + if(!this.labelNode){ + this.labelNode = domConstruct.create("SPAN", null, this.domNode); + } + this.labelNode.className = "mblHeadingSpanTitle"; + this.labelDivNode = domConstruct.create("DIV", { + className: "mblHeadingDivTitle", + innerHTML: this.labelNode.innerHTML + }, this.domNode); + }, + + startup: function(){ + if(this._started){ return; } + var parent = this.getParent && this.getParent(); + if(!parent || !parent.resize){ // top level widget + var _this = this; + setTimeout(function(){ // necessary to render correctly + _this.resize(); + }, 0); + } + this.inherited(arguments); + }, + + resize: function(){ + if(this._btn){ + this._btn.style.width = this._body.offsetWidth + this._head.offsetWidth + "px"; + } + if(this.labelNode){ + // find the rightmost left button (B), and leftmost right button (C) + // +-----------------------------+ + // | |A| |B| |C| |D| | + // +-----------------------------+ + var leftBtn, rightBtn; + var children = this.containerNode.childNodes; + for(var i = children.length - 1; i >= 0; i--){ + var c = children[i]; + if(c.nodeType === 1){ + if(!rightBtn && domClass.contains(c, "mblToolBarButton") && domStyle.get(c, "float") === "right"){ + rightBtn = c; + } + if(!leftBtn && (domClass.contains(c, "mblToolBarButton") && domStyle.get(c, "float") === "left" || c === this._btn)){ + leftBtn = c; + } + } + } + + if(!this.labelNodeLen && this.label){ + this.labelNode.style.display = "inline"; + this.labelNodeLen = this.labelNode.offsetWidth; + this.labelNode.style.display = ""; + } + + var bw = this.domNode.offsetWidth; // bar width + var rw = rightBtn ? bw - rightBtn.offsetLeft + 5 : 0; // rightBtn width + var lw = leftBtn ? leftBtn.offsetLeft + leftBtn.offsetWidth + 5 : 0; // leftBtn width + var tw = this.labelNodeLen || 0; // title width + domClass[bw - Math.max(rw,lw)*2 > tw ? "add" : "remove"](this.domNode, "mblHeadingCenterTitle"); + } + array.forEach(this.getChildren(), function(child){ + if(child.resize){ child.resize(); } + }); + }, + + _setBackAttr: function(/*String*/back){ + if (!back){ + domConstruct.destroy(this._btn); + this._btn = null; + this.back = ""; + }else{ + if(!this._btn){ + var btn = domConstruct.create("DIV", this.backProp, this.domNode, "first"); + var head = domConstruct.create("DIV", {className:"mblArrowButtonHead"}, btn); + var body = domConstruct.create("DIV", {className:"mblArrowButtonBody mblArrowButtonText"}, btn); + + this._body = body; + this._head = head; + this._btn = btn; + this.backBtnNode = btn; + this.connect(body, "onclick", "onClick"); + } + this.back = back; + this._body.innerHTML = this._cv ? this._cv(this.back) : this.back; + } + this.resize(); + }, + + _setLabelAttr: function(/*String*/label){ + this.label = label; + this.labelNode.innerHTML = this.labelDivNode.innerHTML = this._cv ? this._cv(label) : label; + }, + + findCurrentView: function(){ + // summary: + // Search for the view widget that contains this widget. + var w = this; + while(true){ + w = w.getParent(); + if(!w){ return null; } + if(w instanceof View){ break; } + } + return w; + }, + + onClick: function(e){ + var h1 = this.domNode; + domClass.add(h1, "mblArrowButtonSelected"); + setTimeout(function(){ + domClass.remove(h1, "mblArrowButtonSelected"); + }, 1000); + + if(this.back && !this.moveTo && !this.href && history){ + history.back(); + return; + } + + // keep the clicked position for transition animations + var view = this.findCurrentView(); + if(view){ + view.clickedPosX = e.clientX; + view.clickedPosY = e.clientY; + } + this.goTo(this.moveTo, this.href); + }, + + goTo: function(moveTo, href){ + // summary: + // Given the destination, makes a view transition. + var view = this.findCurrentView(); + if(!view){ return; } + if(href){ + view.performTransition(null, -1, this.transition, this, function(){location.href = href;}); + }else{ + if(dm.app && dm.app.STAGE_CONTROLLER_ACTIVE){ + // If in a full mobile app, then use its mechanisms to move back a scene + connect.publish("/dojox/mobile/app/goback"); + }else{ + // Basically transition should be performed between two + // siblings that share the same parent. + // However, when views are nested and transition occurs from + // an inner view, search for an ancestor view that is a sibling + // of the target view, and use it as a source view. + var node = registry.byId(view.convertToId(moveTo)); + if(node){ + var parent = node.getParent(); + while(view){ + var myParent = view.getParent(); + if(parent === myParent){ + break; + } + view = myParent; + } + } + if(view){ + view.performTransition(moveTo, -1, this.transition); + } + } + } + } + }); +}); + +}, +'dojox/main':function(){ +define("dojox/main", ["dojo/_base/kernel"], function(dojo) { + // module: + // dojox/main + // summary: + // The dojox package main module; dojox package is somewhat unusual in that the main module currently just provides an empty object. + + return dojo.dojox; +}); +}, +'dojox/mobile/RoundRectList':function(){ +define([ + "dojo/_base/array", + "dojo/_base/declare", + "dojo/_base/window", + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase" +], function(array, declare, win, Contained, Container, WidgetBase){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/RoundRectList + // summary: + // A rounded rectangle list. + + return declare("dojox.mobile.RoundRectList", [WidgetBase, Container, Contained], { + // summary: + // A rounded rectangle list. + // description: + // RoundRectList is a rounded rectangle list, which can be used to + // display a group of items. Each item must be + // dojox.mobile.ListItem. + + // transition: String + // The default animated transition effect for child items. + transition: "slide", + + // iconBase: String + // The default icon path for child items. + iconBase: "", + + // iconPos: String + // The default icon position for child items. + iconPos: "", + + // select: String + // Selection mode of the list. The check mark is shown for the + // selected list item(s). The value can be "single", "multiple", or + // "". If "single", there can be only one selected item at a time. + // If "multiple", there can be multiple selected items at a time. + select: "", + + // stateful: String + // If true, the last selected item remains highlighted. + stateful: false, + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement("UL"); + this.domNode.className = "mblRoundRectList"; + }, + + resize: function(){ + // summary: + // Calls resize() of each child widget. + array.forEach(this.getChildren(), function(child){ + if(child.resize){ child.resize(); } + }); + }, + + onCheckStateChanged: function(/*Widget*/listItem, /*String*/newState){ + // summary: + // Stub function to connect to from your application. + // description: + // Called when the check state has been changed. + }, + + _setStatefulAttr: function(stateful){ + this.stateful = stateful; + array.forEach(this.getChildren(), function(child){ + child.setArrow && child.setArrow(); + }); + }, + + deselectItem: function(/*ListItem*/item){ + // summary: + // Deselects the given item. + item.deselect(); + }, + + deselectAll: function(){ + // summary: + // Deselects all the items. + array.forEach(this.getChildren(), function(child){ + child.deselect && child.deselect(); + }); + }, + + selectItem: function(/*ListItem*/item){ + // summary: + // Selects the given item. + item.select(); + } + }); +}); + +}, +'dojo/Stateful':function(){ +define(["./_base/kernel", "./_base/declare", "./_base/lang", "./_base/array"], function(dojo, declare, lang, array) { + // module: + // dojo/Stateful + // summary: + // TODOC + +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); + } + }, + + get: function(/*String*/name){ + // summary: + // Get a property on a Stateful instance. + // name: + // The property to get. + // returns: + // The property value on this Stateful instance. + // 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]; //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. + + 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 + } + +}); + +}); + +}, +'dojox/mobile/app/List':function(){ +// wrapped by build app +define(["dijit","dojo","dojox","dojo/require!dojo/string,dijit/_WidgetBase"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.List"); +dojo.experimental("dojox.mobile.app.List"); + +dojo.require("dojo.string"); +dojo.require("dijit._WidgetBase"); + +(function(){ + + var templateCache = {}; + + dojo.declare("dojox.mobile.app.List", dijit._WidgetBase, { + // summary: + // A templated list widget. Given a simple array of data objects + // and a HTML template, it renders a list of elements, with + // support for a swipe delete action. An optional template + // can be provided for when the list is empty. + + // items: Array + // The array of data items that will be rendered. + items: null, + + // itemTemplate: String + // The URL to the HTML file containing the markup for each individual + // data item. + itemTemplate: "", + + // emptyTemplate: String + // The URL to the HTML file containing the HTML to display if there + // are no data items. This is optional. + emptyTemplate: "", + + // dividerTemplate: String + // The URL to the HTML file containing the markup for the dividers + // between groups of list items + dividerTemplate: "", + + // dividerFunction: Function + // Function to create divider elements. This should return a divider + // value for each item in the list + dividerFunction: null, + + // labelDelete: String + // The label to display for the Delete button + labelDelete: "Delete", + + // labelCancel: String + // The label to display for the Cancel button + labelCancel: "Cancel", + + // controller: Object + // + controller: null, + + // autoDelete: Boolean + autoDelete: true, + + // enableDelete: Boolean + enableDelete: true, + + // enableHold: Boolean + enableHold: true, + + // formatters: Object + // A name/value map of functions used to format data for display + formatters: null, + + // _templateLoadCount: Number + // The number of templates remaining to load before the list renders. + _templateLoadCount: 0, + + // _mouseDownPos: Object + // The coordinates of where a mouseDown event was detected + _mouseDownPos: null, + + baseClass: "list", + + constructor: function(){ + this._checkLoadComplete = dojo.hitch(this, this._checkLoadComplete); + this._replaceToken = dojo.hitch(this, this._replaceToken); + this._postDeleteAnim = dojo.hitch(this, this._postDeleteAnim); + }, + + postCreate: function(){ + + var _this = this; + + if(this.emptyTemplate){ + this._templateLoadCount++; + } + if(this.itemTemplate){ + this._templateLoadCount++; + } + if(this.dividerTemplate){ + this._templateLoadCount++; + } + + this.connect(this.domNode, "onmousedown", function(event){ + var touch = event; + if(event.targetTouches && event.targetTouches.length > 0){ + touch = event.targetTouches[0]; + } + + // Find the node that was tapped/clicked + var rowNode = _this._getRowNode(event.target); + + if(rowNode){ + // Add the rows data to the event so it can be picked up + // by any listeners + _this._setDataInfo(rowNode, event); + + // Select and highlight the row + _this._selectRow(rowNode); + + // Record the position that was tapped + _this._mouseDownPos = { + x: touch.pageX, + y: touch.pageY + }; + _this._dragThreshold = null; + } + }); + + this.connect(this.domNode, "onmouseup", function(event){ + // When the mouse/finger comes off the list, + // call the onSelect function and deselect the row. + if(event.targetTouches && event.targetTouches.length > 0){ + event = event.targetTouches[0]; + } + var rowNode = _this._getRowNode(event.target); + + if(rowNode){ + + _this._setDataInfo(rowNode, event); + + if(_this._selectedRow){ + _this.onSelect(rowNode._data, rowNode._idx, rowNode); + } + + this._deselectRow(); + } + }); + + // If swipe-to-delete is enabled, listen for the mouse moving + if(this.enableDelete){ + this.connect(this.domNode, "mousemove", function(event){ + dojo.stopEvent(event); + if(!_this._selectedRow){ + return; + } + var rowNode = _this._getRowNode(event.target); + + // Still check for enableDelete in case it's changed after + // this listener is added. + if(_this.enableDelete && rowNode && !_this._deleting){ + _this.handleDrag(event); + } + }); + } + + // Put the data and index onto each onclick event. + this.connect(this.domNode, "onclick", function(event){ + if(event.touches && event.touches.length > 0){ + event = event.touches[0]; + } + var rowNode = _this._getRowNode(event.target, true); + + if(rowNode){ + _this._setDataInfo(rowNode, event); + } + }); + + // If the mouse or finger moves off the selected row, + // deselect it. + this.connect(this.domNode, "mouseout", function(event){ + if(event.touches && event.touches.length > 0){ + event = event.touches[0]; + } + if(event.target == _this._selectedRow){ + _this._deselectRow(); + } + }); + + // If no item template has been provided, it is an error. + if(!this.itemTemplate){ + throw Error("An item template must be provided to " + this.declaredClass); + } + + // Load the item template + this._loadTemplate(this.itemTemplate, "itemTemplate", this._checkLoadComplete); + + if(this.emptyTemplate){ + // If the optional empty template has been provided, load it. + this._loadTemplate(this.emptyTemplate, "emptyTemplate", this._checkLoadComplete); + } + + if(this.dividerTemplate){ + this._loadTemplate(this.dividerTemplate, "dividerTemplate", this._checkLoadComplete); + } + }, + + handleDrag: function(event){ + // summary: + // Handles rows being swiped for deletion. + var touch = event; + if(event.targetTouches && event.targetTouches.length > 0){ + touch = event.targetTouches[0]; + } + + // Get the distance that the mouse or finger has moved since + // beginning the swipe action. + var diff = touch.pageX - this._mouseDownPos.x; + + var absDiff = Math.abs(diff); + if(absDiff > 10 && !this._dragThreshold){ + // Make the user drag the row 60% of the width to remove it + this._dragThreshold = dojo.marginBox(this._selectedRow).w * 0.6; + if(!this.autoDelete){ + this.createDeleteButtons(this._selectedRow); + } + } + + this._selectedRow.style.left = (absDiff > 10 ? diff : 0) + "px"; + + // If the user has dragged the row more than the threshold, slide + // it off the screen in preparation for deletion. + if(this._dragThreshold && this._dragThreshold < absDiff){ + this.preDelete(diff); + } + }, + + handleDragCancel: function(){ + // summary: + // Handle a drag action being cancelled, for whatever reason. + // Reset handles, remove CSS classes etc. + if(this._deleting){ + return; + } + dojo.removeClass(this._selectedRow, "hold"); + this._selectedRow.style.left = 0; + this._mouseDownPos = null; + this._dragThreshold = null; + + this._deleteBtns && dojo.style(this._deleteBtns, "display", "none"); + }, + + preDelete: function(currentLeftPos){ + // summary: + // Slides the row offscreen before it is deleted + + // TODO: do this with CSS3! + var self = this; + + this._deleting = true; + + dojo.animateProperty({ + node: this._selectedRow, + duration: 400, + properties: { + left: { + end: currentLeftPos + + ((currentLeftPos > 0 ? 1 : -1) * this._dragThreshold * 0.8) + } + }, + onEnd: dojo.hitch(this, function(){ + if(this.autoDelete){ + this.deleteRow(this._selectedRow); + } + }) + }).play(); + }, + + deleteRow: function(row){ + + // First make the row invisible + // Put it back where it came from + dojo.style(row, { + visibility: "hidden", + minHeight: "0px" + }); + dojo.removeClass(row, "hold"); + + this._deleteAnimConn = + this.connect(row, "webkitAnimationEnd", this._postDeleteAnim); + + dojo.addClass(row, "collapsed"); + }, + + _postDeleteAnim: function(event){ + // summary: + // Completes the deletion of a row. + + if(this._deleteAnimConn){ + this.disconnect(this._deleteAnimConn); + this._deleteAnimConn = null; + } + + var row = this._selectedRow; + var sibling = row.nextSibling; + var prevSibling = row.previousSibling; + + // If the previous node is a divider and either this is + // the last element in the list, or the next node is + // also a divider, remove the divider for the deleted section. + if(prevSibling && prevSibling._isDivider){ + if(!sibling || sibling._isDivider){ + prevSibling.parentNode.removeChild(prevSibling); + } + } + + row.parentNode.removeChild(row); + this.onDelete(row._data, row._idx, this.items); + + // Decrement the index of each following row + while(sibling){ + if(sibling._idx){ + sibling._idx--; + } + sibling = sibling.nextSibling; + } + + dojo.destroy(row); + + // Fix up the 'first' and 'last' CSS classes on the rows + dojo.query("> *:not(.buttons)", this.domNode).forEach(this.applyClass); + + this._deleting = false; + this._deselectRow(); + }, + + createDeleteButtons: function(aroundNode){ + // summary: + // Creates the two buttons displayed when confirmation is + // required before deletion of a row. + // aroundNode: + // The DOM node of the row about to be deleted. + var mb = dojo.marginBox(aroundNode); + var pos = dojo._abs(aroundNode, true); + + if(!this._deleteBtns){ + // Create the delete buttons. + this._deleteBtns = dojo.create("div",{ + "class": "buttons" + }, this.domNode); + + this.buttons = []; + + this.buttons.push(new dojox.mobile.Button({ + btnClass: "mblRedButton", + label: this.labelDelete + })); + this.buttons.push(new dojox.mobile.Button({ + btnClass: "mblBlueButton", + label: this.labelCancel + })); + + dojo.place(this.buttons[0].domNode, this._deleteBtns); + dojo.place(this.buttons[1].domNode, this._deleteBtns); + + dojo.addClass(this.buttons[0].domNode, "deleteBtn"); + dojo.addClass(this.buttons[1].domNode, "cancelBtn"); + + this._handleButtonClick = dojo.hitch(this._handleButtonClick); + this.connect(this._deleteBtns, "onclick", this._handleButtonClick); + } + dojo.removeClass(this._deleteBtns, "fade out fast"); + dojo.style(this._deleteBtns, { + display: "", + width: mb.w + "px", + height: mb.h + "px", + top: (aroundNode.offsetTop) + "px", + left: "0px" + }); + }, + + onDelete: function(data, index, array){ + // summary: + // Called when a row is deleted + // data: + // The data related to the row being deleted + // index: + // The index of the data in the total array + // array: + // The array of data used. + + array.splice(index, 1); + + // If the data is empty, rerender in case an emptyTemplate has + // been provided + if(array.length < 1){ + this.render(); + } + }, + + cancelDelete: function(){ + // summary: + // Cancels the deletion of a row. + this._deleting = false; + this.handleDragCancel(); + }, + + _handleButtonClick: function(event){ + // summary: + // Handles the click of one of the deletion buttons, either to + // delete the row or to cancel the deletion. + if(event.touches && event.touches.length > 0){ + event = event.touches[0]; + } + var node = event.target; + if(dojo.hasClass(node, "deleteBtn")){ + this.deleteRow(this._selectedRow); + }else if(dojo.hasClass(node, "cancelBtn")){ + this.cancelDelete(); + }else{ + return; + } + dojo.addClass(this._deleteBtns, "fade out"); + }, + + applyClass: function(node, idx, array){ + // summary: + // Applies the 'first' and 'last' CSS classes to the relevant + // rows. + + dojo.removeClass(node, "first last"); + if(idx == 0){ + dojo.addClass(node, "first"); + } + if(idx == array.length - 1){ + dojo.addClass(node, "last"); + } + }, + + _setDataInfo: function(rowNode, event){ + // summary: + // Attaches the data item and index for each row to any event + // that occurs on that row. + event.item = rowNode._data; + event.index = rowNode._idx; + }, + + onSelect: function(data, index, rowNode){ + // summary: + // Dummy function that is called when a row is tapped + }, + + _selectRow: function(row){ + // summary: + // Selects a row, applies the relevant CSS classes. + if(this._deleting && this._selectedRow && row != this._selectedRow){ + this.cancelDelete(); + } + + if(!dojo.hasClass(row, "row")){ + return; + } + if(this.enableHold || this.enableDelete){ + dojo.addClass(row, "hold"); + } + this._selectedRow = row; + }, + + _deselectRow: function(){ + // summary: + // Deselects a row, and cancels any drag actions that were + // occurring. + if(!this._selectedRow || this._deleting){ + return; + } + this.handleDragCancel(); + dojo.removeClass(this._selectedRow, "hold"); + this._selectedRow = null; + }, + + _getRowNode: function(fromNode, ignoreNoClick){ + // summary: + // Gets the DOM node of the row that is equal to or the parent + // of the node passed to this function. + while(fromNode && !fromNode._data && fromNode != this.domNode){ + if(!ignoreNoClick && dojo.hasClass(fromNode, "noclick")){ + return null; + } + fromNode = fromNode.parentNode; + } + return fromNode == this.domNode ? null : fromNode; + }, + + applyTemplate: function(template, data){ + return dojo._toDom(dojo.string.substitute( + template, data, this._replaceToken, this.formatters || this)); + }, + + render: function(){ + // summary: + // Renders the list. + + // Delete all existing nodes, except the deletion buttons. + dojo.query("> *:not(.buttons)", this.domNode).forEach(dojo.destroy); + + // If there is no data, and an empty template has been provided, + // render it. + if(this.items.length < 1 && this.emptyTemplate){ + dojo.place(dojo._toDom(this.emptyTemplate), this.domNode, "first"); + }else{ + this.domNode.appendChild(this._renderRange(0, this.items.length)); + } + if(dojo.hasClass(this.domNode.parentNode, "mblRoundRect")){ + dojo.addClass(this.domNode.parentNode, "mblRoundRectList") + } + + var divs = dojo.query("> .row", this.domNode); + if(divs.length > 0){ + dojo.addClass(divs[0], "first"); + dojo.addClass(divs[divs.length - 1], "last"); + } + }, + + _renderRange: function(startIdx, endIdx){ + + var rows = []; + var row, i; + var frag = document.createDocumentFragment(); + startIdx = Math.max(0, startIdx); + endIdx = Math.min(endIdx, this.items.length); + + for(i = startIdx; i < endIdx; i++){ + // Create a document fragment containing the templated row + row = this.applyTemplate(this.itemTemplate, this.items[i]); + dojo.addClass(row, 'row'); + row._data = this.items[i]; + row._idx = i; + rows.push(row); + } + if(!this.dividerFunction || !this.dividerTemplate){ + for(i = startIdx; i < endIdx; i++){ + rows[i]._data = this.items[i]; + rows[i]._idx = i; + frag.appendChild(rows[i]); + } + }else{ + var prevDividerValue = null; + var dividerValue; + var divider; + for(i = startIdx; i < endIdx; i++){ + rows[i]._data = this.items[i]; + rows[i]._idx = i; + + dividerValue = this.dividerFunction(this.items[i]); + if(dividerValue && dividerValue != prevDividerValue){ + divider = this.applyTemplate(this.dividerTemplate, { + label: dividerValue, + item: this.items[i] + }); + divider._isDivider = true; + frag.appendChild(divider); + prevDividerValue = dividerValue; + } + frag.appendChild(rows[i]); + } + } + return frag; + }, + + _replaceToken: function(value, key){ + if(key.charAt(0) == '!'){ value = dojo.getObject(key.substr(1), false, _this); } + if(typeof value == "undefined"){ return ""; } // 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? + + }, + + _checkLoadComplete: function(){ + // summary: + // Checks if all templates have loaded + this._templateLoadCount--; + + if(this._templateLoadCount < 1 && this.get("items")){ + this.render(); + } + }, + + _loadTemplate: function(url, thisAttr, callback){ + // summary: + // Loads a template + if(!url){ + callback(); + return; + } + + if(templateCache[url]){ + this.set(thisAttr, templateCache[url]); + callback(); + }else{ + var _this = this; + + dojo.xhrGet({ + url: url, + sync: false, + handleAs: "text", + load: function(text){ + templateCache[url] = dojo.trim(text); + _this.set(thisAttr, templateCache[url]); + callback(); + } + }); + } + }, + + + _setFormattersAttr: function(formatters){ + // summary: + // Sets the data items, and causes a rerender of the list + this.formatters = formatters; + }, + + _setItemsAttr: function(items){ + // summary: + // Sets the data items, and causes a rerender of the list + + this.items = items || []; + + if(this._templateLoadCount < 1 && items){ + this.render(); + } + }, + + destroy: function(){ + if(this.buttons){ + dojo.forEach(this.buttons, function(button){ + button.destroy(); + }); + this.buttons = null; + } + + this.inherited(arguments); + } + + }); + +})(); +}); + +}, +'dojox/mobile/app/ListSelector':function(){ +// wrapped by build app +define(["dijit","dojo","dojox","dojo/require!dojox/mobile/app/_Widget,dojo/fx"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.ListSelector"); +dojo.experimental("dojox.mobile.app.ListSelector"); + +dojo.require("dojox.mobile.app._Widget"); +dojo.require("dojo.fx"); + +dojo.declare("dojox.mobile.app.ListSelector", dojox.mobile.app._Widget, { + + // data: Array + // The array of items to display. Each element in the array + // should have both a label and value attribute, e.g. + // [{label: "Open", value: 1} , {label: "Delete", value: 2}] + data: null, + + // controller: Object + // The current SceneController widget. + controller: null, + + // onChoose: Function + // The callback function for when an item is selected + onChoose: null, + + destroyOnHide: false, + + _setDataAttr: function(data){ + this.data = data; + + if(this.data){ + this.render(); + } + }, + + postCreate: function(){ + dojo.addClass(this.domNode, "listSelector"); + + var _this = this; + + this.connect(this.domNode, "onclick", function(event){ + if(!dojo.hasClass(event.target, "listSelectorRow")){ + return; + } + + if(_this.onChoose){ + _this.onChoose(_this.data[event.target._idx].value); + } + _this.hide(); + }); + + this.connect(this.domNode, "onmousedown", function(event){ + if(!dojo.hasClass(event.target, "listSelectorRow")){ + return; + } + dojo.addClass(event.target, "listSelectorRow-selected"); + }); + + this.connect(this.domNode, "onmouseup", function(event){ + if(!dojo.hasClass(event.target, "listSelectorRow")){ + return; + } + dojo.removeClass(event.target, "listSelectorRow-selected"); + }); + + this.connect(this.domNode, "onmouseout", function(event){ + if(!dojo.hasClass(event.target, "listSelectorRow")){ + return; + } + dojo.removeClass(event.target, "listSelectorRow-selected"); + }); + + var viewportSize = this.controller.getWindowSize(); + + this.mask = dojo.create("div", {"class": "dialogUnderlayWrapper", + innerHTML: "<div class=\"dialogUnderlay\"></div>" + }, this.controller.assistant.domNode); + + this.connect(this.mask, "onclick", function(){ + _this.onChoose && _this.onChoose(); + _this.hide(); + }); + }, + + show: function(fromNode){ + + // Using dojo.fx here. Must figure out how to do this with CSS animations!! + var startPos; + + var windowSize = this.controller.getWindowSize(); + var fromNodePos; + if(fromNode){ + fromNodePos = dojo._abs(fromNode); + startPos = fromNodePos; + }else{ + startPos.x = windowSize.w / 2; + startPos.y = 200; + } + console.log("startPos = ", startPos); + + dojo.style(this.domNode, { + opacity: 0, + display: "", + width: Math.floor(windowSize.w * 0.8) + "px" + }); + + var maxWidth = 0; + dojo.query(">", this.domNode).forEach(function(node){ + dojo.style(node, { + "float": "left" + }); + maxWidth = Math.max(maxWidth, dojo.marginBox(node).w); + dojo.style(node, { + "float": "none" + }); + }); + maxWidth = Math.min(maxWidth, Math.round(windowSize.w * 0.8)) + + dojo.style(this.domNode, "paddingLeft") + + dojo.style(this.domNode, "paddingRight") + + 1; + + dojo.style(this.domNode, "width", maxWidth + "px"); + var targetHeight = dojo.marginBox(this.domNode).h; + + var _this = this; + + + var targetY = fromNodePos ? + Math.max(30, fromNodePos.y - targetHeight - 10) : + this.getScroll().y + 30; + + console.log("fromNodePos = ", fromNodePos, " targetHeight = ", targetHeight, + " targetY = " + targetY, " startPos ", startPos); + + + var anim1 = dojo.animateProperty({ + node: this.domNode, + duration: 400, + properties: { + width: {start: 1, end: maxWidth}, + height: {start: 1, end: targetHeight}, + top: {start: startPos.y, end: targetY}, + left: {start: startPos.x, end: (windowSize.w/2 - maxWidth/2)}, + opacity: {start: 0, end: 1}, + fontSize: {start: 1} + }, + onEnd: function(){ + dojo.style(_this.domNode, "width", "inherit"); + } + }); + var anim2 = dojo.fadeIn({ + node: this.mask, + duration: 400 + }); + dojo.fx.combine([anim1, anim2]).play(); + + }, + + hide: function(){ + // Using dojo.fx here. Must figure out how to do this with CSS animations!! + + var _this = this; + + var anim1 = dojo.animateProperty({ + node: this.domNode, + duration: 500, + properties: { + width: {end: 1}, + height: {end: 1}, + opacity: {end: 0}, + fontSize: {end: 1} + }, + onEnd: function(){ + if(_this.get("destroyOnHide")){ + _this.destroy(); + } + } + }); + + var anim2 = dojo.fadeOut({ + node: this.mask, + duration: 400 + }); + dojo.fx.combine([anim1, anim2]).play(); + }, + + render: function(){ + // summary: + // Renders + + dojo.empty(this.domNode); + dojo.style(this.domNode, "opacity", 0); + + var row; + + for(var i = 0; i < this.data.length; i++){ + // Create each row and add any custom classes. Also set the _idx property. + row = dojo.create("div", { + "class": "listSelectorRow " + (this.data[i].className || ""), + innerHTML: this.data[i].label + }, this.domNode); + + row._idx = i; + + if(i == 0){ + dojo.addClass(row, "first"); + } + if(i == this.data.length - 1){ + dojo.addClass(row, "last"); + } + + } + }, + + + destroy: function(){ + this.inherited(arguments); + dojo.destroy(this.mask); + } + +}); + +}); + +}, +'dojox/mobile/EdgeToEdgeCategory':function(){ +define("dojox/mobile/EdgeToEdgeCategory", [ + "dojo/_base/declare", + "./RoundRectCategory" +], function(declare, RoundRectCategory){ + +/*===== + var RoundRectCategory = dojox.mobile.RoundRectCategory; +=====*/ + + // module: + // dojox/mobile/EdgeToEdgeCategory + // summary: + // A category header for an edge-to-edge list. + + return declare("dojox.mobile.EdgeToEdgeCategory", RoundRectCategory, { + // summary: + // A category header for an edge-to-edge list. + buildRendering: function(){ + this.inherited(arguments); + this.domNode.className = "mblEdgeToEdgeCategory"; + } + }); +}); + +}, +'dojo/string':function(){ +define(["./_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; +}); + +}, +'dojox/mobile/TextBox':function(){ +define("dojox/mobile/TextBox", [ + "dojo/_base/declare", + "dojo/dom-construct", + "dijit/_WidgetBase", + "dijit/form/_FormValueMixin", + "dijit/form/_TextBoxMixin" +], function(declare, domConstruct, WidgetBase, FormValueMixin, TextBoxMixin){ + + /*===== + WidgetBase = dijit._WidgetBase; + FormValueMixin = dijit.form._FormValueMixin; + TextBoxMixin = dijit.form._TextBoxMixin; + =====*/ + return declare("dojox.mobile.TextBox",[WidgetBase, FormValueMixin, TextBoxMixin],{ + // summary: + // A non-templated base class for textbox form inputs + + baseClass: "mblTextBox", + + // Override automatic assigning type --> node, it causes exception on IE8. + // Instead, type must be specified as this.type when the node is created, as part of the original DOM + _setTypeAttr: null, + + // Map widget attributes to DOMNode attributes. + _setPlaceHolderAttr: "textbox", + + buildRendering: function(){ + if(!this.srcNodeRef){ + this.srcNodeRef = domConstruct.create("input", {"type":this.type}); + } + this.inherited(arguments); + this.textbox = this.focusNode = this.domNode; + }, + + postCreate: function(){ + this.inherited(arguments); + this.connect(this.textbox, "onfocus", "_onFocus"); + this.connect(this.textbox, "onblur", "_onBlur"); + } + }); +}); + +}, +'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; }); + + var ar = []; + for(var id in hash){ + ar.push(hash[id]); + } + return ar; // dijit._Widget[] + }, + + getUniqueId: function(/*String*/widgetType){ + // summary: + // Generates a unique id for a given widgetType + + var id; + do{ + id = widgetType + "_" + + (widgetType in _widgetTypeCtr ? + ++_widgetTypeCtr[widgetType] : _widgetTypeCtr[widgetType] = 0); + }while(hash[id]); + return dijit._scopeName == "dijit" ? id : dijit._scopeName + "_" + id; // String + }, + + findWidgets: function(/*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; + }, + + _destroyAll: function(){ + // summary: + // Code to destroy all widgets and do other cleanup on page unload + + // Clean up focus manager lingering references to widgets and nodes + dijit._curFocus = null; + dijit._prevFocus = null; + dijit._activeStack = []; + + // Destroy all the widgets, top down + array.forEach(registry.findWidgets(win.body()), function(widget){ + // Avoid double destroy of widgets like Menu that are attached to <body> + // even though they are logically children of other widgets. + if(!widget._destroyed){ + if(widget.destroyRecursive){ + widget.destroyRecursive(); + }else if(widget.destroy){ + widget.destroy(); + } + } + }); + }, + + getEnclosingWidget: function(/*DOMNode*/ node){ + // summary: + // Returns the widget whose DOM tree contains the specified DOMNode, or null if + // the node is not contained within the DOM tree of any widget + while(node){ + var id = node.getAttribute && node.getAttribute("widgetId"); + if(id){ + return hash[id]; + } + node = node.parentNode; + } + return null; + }, + + // In case someone needs to access hash. + // Actually, this is accessed from WidgetSet back-compatibility code + _hash: hash + }; + + 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(); + }); + } + + /*===== + dijit.registry = { + // summary: + // A list of widgets on a page. + }; + =====*/ + dijit.registry = registry; + + return registry; +}); + +}, +'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: + // 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 + }; + + dijit.getUniqueId = function(widgetType){ + // summary: + // Generates a unique id for a given widgetType + // widgetType: String + return registry.getUniqueId(widgetType); // String + }; + + 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); + }; + + dijit._destroyAll = function(){ + // summary: + // Code to destroy all widgets and do other cleanup on page unload + + return registry._destroyAll(); + }; + + dijit.byNode = function(node){ + // summary: + // Returns the widget corresponding to the given DOMNode + // node: DOMNode + return registry.byNode(node); // dijit._Widget + }; + + 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]; + }); + + /*===== + 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; + + return dijit; +}); + +}, +'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. + + dijit.getViewport = function(){ + // summary: + // Deprecated method to return the dimensions and scroll position of the viewable area of a browser window. + // New code should use windowUtils.getBox() + + return windowUtils.getBox(); + }; + + /*===== + dijit.placeOnScreen = function(node, pos, corners, padding){ + // summary: + // 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; + + /*===== + 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]}); + } + } + + return place.around(node, aroundNode, positions, true, layoutNode); + }; + + /*===== + dijit.placeOnScreenAroundNode = function(node, aroundNode, aroundCorners, layoutNode){ + // summary: + // Position node adjacent or kitty-corner to aroundNode + // such that it's fully visible in viewport. + // Deprecated, new code should use dijit.place.around() instead. + }; + =====*/ + dijit.placeOnScreenAroundNode = dijit.placeOnScreenAroundElement; + + /*===== + dijit.placeOnScreenAroundRectangle = function(node, aroundRect, aroundCorners, layoutNode){ + // summary: + // Like dijit.placeOnScreenAroundNode(), except that the "around" + // parameter is an arbitrary rectangle on the screen (x, y, width, height) + // instead of a dom node. + // Deprecated, new code should use dijit.place.around() instead. + }; + =====*/ + dijit.placeOnScreenAroundRectangle = dijit.placeOnScreenAroundElement; + + dijit.getPopupAroundAlignment = function(/*Array*/ position, /*Boolean*/ leftToRight){ + // summary: + // Deprecated method, unneeded when using dijit/place directly. + // Transforms the passed array of preferred positions into a format suitable for + // passing as the aroundCorners argument to dijit.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; + }; + + return dijit; +}); + +}, +'dojox/mobile/View':function(){ +define("dojox/mobile/View", [ + "dojo/_base/kernel", // to test dojo.hash + "dojo/_base/array", + "dojo/_base/config", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/sniff", + "dojo/_base/window", + "dojo/_base/Deferred", + "dojo/dom", + "dojo/dom-class", + "dojo/dom-geometry", + "dojo/dom-style", +// "dojo/hash", // optionally prereq'ed + "dijit/registry", // registry.byNode + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase", + "./ViewController", // to load ViewController for you (no direct references) + "./transition" +], function(dojo, array, config, connect, declare, lang, has, win, Deferred, dom, domClass, domGeometry, domStyle, registry, Contained, Container, WidgetBase, ViewController, transitDeferred){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; + var ViewController = dojox.mobile.ViewController; +=====*/ + + // module: + // dojox/mobile/View + // summary: + // A widget that represents a view that occupies the full screen + + var dm = lang.getObject("dojox.mobile", true); + + return declare("dojox.mobile.View", [WidgetBase, Container, Contained], { + // summary: + // A widget that represents a view that occupies the full screen + // description: + // View acts as a container for any HTML and/or widgets. An entire + // HTML page can have multiple View widgets and the user can + // navigate through the views back and forth without page + // transitions. + + // selected: Boolean + // If true, the view is displayed at startup time. + selected: false, + + // keepScrollPos: Boolean + // If true, the scroll position is kept between views. + keepScrollPos: true, + + constructor: function(params, node){ + if(node){ + dom.byId(node).style.visibility = "hidden"; + } + this._aw = has("android") >= 2.2 && has("android") < 3; // flag for android animation workaround + }, + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement("DIV"); + this.domNode.className = "mblView"; + this.connect(this.domNode, "webkitAnimationEnd", "onAnimationEnd"); + this.connect(this.domNode, "webkitAnimationStart", "onAnimationStart"); + if(!config['mblCSS3Transition']){ + this.connect(this.domNode, "webkitTransitionEnd", "onAnimationEnd"); + } + var id = location.href.match(/#(\w+)([^\w=]|$)/) ? RegExp.$1 : null; + + this._visible = this.selected && !id || this.id == id; + + if(this.selected){ + dm._defaultView = this; + } + }, + + startup: function(){ + if(this._started){ return; } + var siblings = []; + var children = this.domNode.parentNode.childNodes; + var visible = false; + // check if a visible view exists + for(var i = 0; i < children.length; i++){ + var c = children[i]; + if(c.nodeType === 1 && domClass.contains(c, "mblView")){ + siblings.push(c); + visible = visible || registry.byNode(c)._visible; + } + } + var _visible = this._visible; + // if no visible view exists, make the first view visible + if(siblings.length === 1 || (!visible && siblings[0] === this.domNode)){ + _visible = true; + } + var _this = this; + setTimeout(function(){ // necessary to render the view correctly + if(!_visible){ + _this.domNode.style.display = "none"; + }else{ + dm.currentView = _this; //TODO:1.8 reconsider this. currentView may not have a currently showing view when views are nested. + _this.onStartView(); + connect.publish("/dojox/mobile/startView", [_this]); + } + if(_this.domNode.style.visibility != "visible"){ // this check is to avoid screen flickers + _this.domNode.style.visibility = "visible"; + } + var parent = _this.getParent && _this.getParent(); + if(!parent || !parent.resize){ // top level widget + _this.resize(); + } + }, has("ie") ? 100 : 0); // give IE a little time to complete drawing + this.inherited(arguments); + }, + + resize: function(){ + // summary: + // Calls resize() of each child widget. + array.forEach(this.getChildren(), function(child){ + if(child.resize){ child.resize(); } + }); + }, + + onStartView: function(){ + // summary: + // Stub function to connect to from your application. + // description: + // Called only when this view is shown at startup time. + }, + + onBeforeTransitionIn: function(moveTo, dir, transition, context, method){ + // summary: + // Stub function to connect to from your application. + // description: + // Called before the arriving transition occurs. + }, + + onAfterTransitionIn: function(moveTo, dir, transition, context, method){ + // summary: + // Stub function to connect to from your application. + // description: + // Called after the arriving transition occurs. + }, + + onBeforeTransitionOut: function(moveTo, dir, transition, context, method){ + // summary: + // Stub function to connect to from your application. + // description: + // Called before the leaving transition occurs. + }, + + onAfterTransitionOut: function(moveTo, dir, transition, context, method){ + // summary: + // Stub function to connect to from your application. + // description: + // Called after the leaving transition occurs. + }, + + _saveState: function(moveTo, dir, transition, context, method){ + this._context = context; + this._method = method; + if(transition == "none"){ + transition = null; + } + this._moveTo = moveTo; + this._dir = dir; + this._transition = transition; + this._arguments = lang._toArray(arguments); + this._args = []; + if(context || method){ + for(var i = 5; i < arguments.length; i++){ + this._args.push(arguments[i]); + } + } + }, + + _fixViewState: function(/*DomNode*/toNode){ + // summary: + // Sanity check for view transition states. + // description: + // Sometimes uninitialization of Views fails after making view transition, + // and that results in failure of subsequent view transitions. + // This function does the uninitialization for all the sibling views. + var nodes = this.domNode.parentNode.childNodes; + for(var i = 0; i < nodes.length; i++){ + var n = nodes[i]; + if(n.nodeType === 1 && domClass.contains(n, "mblView")){ + n.className = "mblView"; //TODO: Should remove classes one by one. This would clear user defined classes or even mblScrollableView. + } + } + toNode.className = "mblView"; // just in case toNode is a sibling of an ancestor. + }, + + convertToId: function(moveTo){ + if(typeof(moveTo) == "string"){ + // removes a leading hash mark (#) and params if exists + // ex. "#bar&myParam=0003" -> "bar" + moveTo.match(/^#?([^&?]+)/); + return RegExp.$1; + } + return moveTo; + }, + + performTransition: function(/*String*/moveTo, /*Number*/dir, /*String*/transition, + /*Object|null*/context, /*String|Function*/method /*optional args*/){ + // summary: + // Function to perform the various types of view transitions, such as fade, slide, and flip. + // moveTo: String + // The id of the transition destination view which resides in + // the current page. + // If the value has a hash sign ('#') before the id + // (e.g. #view1) and the dojo.hash module is loaded by the user + // application, the view transition updates the hash in the + // browser URL so that the user can bookmark the destination + // view. In this case, the user can also use the browser's + // back/forward button to navigate through the views in the + // browser history. + // If null, transitions to a blank view. + // If '#', returns immediately without transition. + // dir: Number + // The transition direction. If 1, transition forward. If -1, transition backward. + // For example, the slide transition slides the view from right to left when dir == 1, + // and from left to right when dir == -1. + // transition: String + // A type of animated transition effect. You can choose from + // the standard transition types, "slide", "fade", "flip", or + // from the extended transition types, "cover", "coverv", + // "dissolve", "reveal", "revealv", "scaleIn", + // "scaleOut", "slidev", "swirl", "zoomIn", "zoomOut". If + // "none" is specified, transition occurs immediately without + // animation. + // context: Object + // The object that the callback function will receive as "this". + // method: String|Function + // A callback function that is called when the transition has been finished. + // A function reference, or name of a function in context. + // tags: + // public + // + // example: + // Transition backward to a view whose id is "foo" with the slide animation. + // | performTransition("foo", -1, "slide"); + // + // example: + // Transition forward to a blank view, and then open another page. + // | performTransition(null, 1, "slide", null, function(){location.href = href;}); + if(moveTo === "#"){ return; } + if(dojo.hash){ + if(typeof(moveTo) == "string" && moveTo.charAt(0) == '#' && !dm._params){ + dm._params = []; + for(var i = 0; i < arguments.length; i++){ + dm._params.push(arguments[i]); + } + dojo.hash(moveTo); + return; + } + } + this._saveState.apply(this, arguments); + var toNode; + if(moveTo){ + toNode = this.convertToId(moveTo); + }else{ + if(!this._dummyNode){ + this._dummyNode = win.doc.createElement("DIV"); + win.body().appendChild(this._dummyNode); + } + toNode = this._dummyNode; + } + var fromNode = this.domNode; + var fromTop = fromNode.offsetTop; + toNode = this.toNode = dom.byId(toNode); + if(!toNode){ console.log("dojox.mobile.View#performTransition: destination view not found: "+moveTo); return; } + toNode.style.visibility = this._aw ? "visible" : "hidden"; + toNode.style.display = ""; + this._fixViewState(toNode); + var toWidget = registry.byNode(toNode); + if(toWidget){ + // Now that the target view became visible, it's time to run resize() + if(config["mblAlwaysResizeOnTransition"] || !toWidget._resized){ + dm.resizeAll(null, toWidget); + toWidget._resized = true; + } + + if(transition && transition != "none"){ + // Temporarily add padding to align with the fromNode while transition + toWidget.containerNode.style.paddingTop = fromTop + "px"; + } + + toWidget.movedFrom = fromNode.id; + } + + this.onBeforeTransitionOut.apply(this, arguments); + connect.publish("/dojox/mobile/beforeTransitionOut", [this].concat(lang._toArray(arguments))); + if(toWidget){ + // perform view transition keeping the scroll position + if(this.keepScrollPos && !this.getParent()){ + var scrollTop = win.body().scrollTop || win.doc.documentElement.scrollTop || win.global.pageYOffset || 0; + fromNode._scrollTop = scrollTop; + var toTop = (dir == 1) ? 0 : (toNode._scrollTop || 0); + toNode.style.top = "0px"; + if(scrollTop > 1 || toTop !== 0){ + fromNode.style.top = toTop - scrollTop + "px"; + if(config["mblHideAddressBar"] !== false){ + setTimeout(function(){ // iPhone needs setTimeout + win.global.scrollTo(0, (toTop || 1)); + }, 0); + } + } + }else{ + toNode.style.top = "0px"; + } + toWidget.onBeforeTransitionIn.apply(toWidget, arguments); + connect.publish("/dojox/mobile/beforeTransitionIn", [toWidget].concat(lang._toArray(arguments))); + } + if(!this._aw){ + toNode.style.display = "none"; + toNode.style.visibility = "visible"; + } + + if(dm._iw && dm.scrollable){ // Workaround for iPhone flicker issue (only when scrollable.js is loaded) + var ss = dm.getScreenSize(); + // Show cover behind the view. + // cover's z-index is set to -10000, lower than z-index value specified in transition css. + win.body().appendChild(dm._iwBgCover); + domStyle.set(dm._iwBgCover, { + position: "absolute", + top: "0px", + left: "0px", + height: (ss.h + 1) + "px", // "+1" means the height of scrollTo(0,1) + width: ss.w + "px", + backgroundColor: domStyle.get(win.body(), "background-color"), + zIndex: -10000, + display: "" + }); + // Show toNode behind the cover. + domStyle.set(toNode, { + position: "absolute", + zIndex: -10001, + visibility: "visible", + display: "" + }); + // setTimeout seems to be necessary to avoid flicker. + // Also the duration of setTimeout should be long enough to avoid flicker. + // 0 is not effective. 50 sometimes causes flicker. + setTimeout(lang.hitch(this, function(){ + this._doTransition(fromNode, toNode, transition, dir); + }), 80); + }else{ + this._doTransition(fromNode, toNode, transition, dir); + } + }, + _toCls: function(s){ + // convert from transition name to corresponding class name + // ex. "slide" -> "mblSlide" + return "mbl"+s.charAt(0).toUpperCase() + s.substring(1); + }, + + _doTransition: function(fromNode, toNode, transition, dir){ + var rev = (dir == -1) ? " mblReverse" : ""; + if(dm._iw && dm.scrollable){ // Workaround for iPhone flicker issue (only when scrollable.js is loaded) + // Show toNode after flicker ends + domStyle.set(toNode, { + position: "", + zIndex: "" + }); + // Remove cover + win.body().removeChild(dm._iwBgCover); + }else if(!this._aw){ + toNode.style.display = ""; + } + if(!transition || transition == "none"){ + this.domNode.style.display = "none"; + this.invokeCallback(); + }else if(config['mblCSS3Transition']){ + //get dojox/css3/transit first + Deferred.when(transitDeferred, lang.hitch(this, function(transit){ + //follow the style of .mblView.mblIn in View.css + //need to set the toNode to absolute position + var toPosition = domStyle.get(toNode, "position"); + domStyle.set(toNode, "position", "absolute"); + Deferred.when(transit(fromNode, toNode, {transition: transition, reverse: (dir===-1)?true:false}),lang.hitch(this,function(){ + domStyle.set(toNode, "position", toPosition); + this.invokeCallback(); + })); + })); + }else{ + var s = this._toCls(transition); + domClass.add(fromNode, s + " mblOut" + rev); + domClass.add(toNode, s + " mblIn" + rev); + setTimeout(function(){ + domClass.add(fromNode, "mblTransition"); + domClass.add(toNode, "mblTransition"); + }, 100); + // set transform origin + var fromOrigin = "50% 50%"; + var toOrigin = "50% 50%"; + var scrollTop, posX, posY; + if(transition.indexOf("swirl") != -1 || transition.indexOf("zoom") != -1){ + if(this.keepScrollPos && !this.getParent()){ + scrollTop = win.body().scrollTop || win.doc.documentElement.scrollTop || win.global.pageYOffset || 0; + }else{ + scrollTop = -domGeometry.position(fromNode, true).y; + } + posY = win.global.innerHeight / 2 + scrollTop; + fromOrigin = "50% " + posY + "px"; + toOrigin = "50% " + posY + "px"; + }else if(transition.indexOf("scale") != -1){ + var viewPos = domGeometry.position(fromNode, true); + posX = ((this.clickedPosX !== undefined) ? this.clickedPosX : win.global.innerWidth / 2) - viewPos.x; + if(this.keepScrollPos && !this.getParent()){ + scrollTop = win.body().scrollTop || win.doc.documentElement.scrollTop || win.global.pageYOffset || 0; + }else{ + scrollTop = -viewPos.y; + } + posY = ((this.clickedPosY !== undefined) ? this.clickedPosY : win.global.innerHeight / 2) + scrollTop; + fromOrigin = posX + "px " + posY + "px"; + toOrigin = posX + "px " + posY + "px"; + } + domStyle.set(fromNode, {webkitTransformOrigin:fromOrigin}); + domStyle.set(toNode, {webkitTransformOrigin:toOrigin}); + } + dm.currentView = registry.byNode(toNode); + }, + + onAnimationStart: function(e){ + }, + + + onAnimationEnd: function(e){ + var name = e.animationName || e.target.className; + if(name.indexOf("Out") === -1 && + name.indexOf("In") === -1 && + name.indexOf("Shrink") === -1){ return; } + var isOut = false; + if(domClass.contains(this.domNode, "mblOut")){ + isOut = true; + this.domNode.style.display = "none"; + domClass.remove(this.domNode, [this._toCls(this._transition), "mblIn", "mblOut", "mblReverse"]); + }else{ + // Reset the temporary padding + this.containerNode.style.paddingTop = ""; + } + domStyle.set(this.domNode, {webkitTransformOrigin:""}); + if(name.indexOf("Shrink") !== -1){ + var li = e.target; + li.style.display = "none"; + domClass.remove(li, "mblCloseContent"); + } + if(isOut){ + this.invokeCallback(); + } + // this.domNode may be destroyed as a result of invoking the callback, + // so check for that before accessing it. + this.domNode && (this.domNode.className = "mblView"); + + // clear the clicked position + this.clickedPosX = this.clickedPosY = undefined; + }, + + invokeCallback: function(){ + this.onAfterTransitionOut.apply(this, this._arguments); + connect.publish("/dojox/mobile/afterTransitionOut", [this].concat(this._arguments)); + var toWidget = registry.byNode(this.toNode); + if(toWidget){ + toWidget.onAfterTransitionIn.apply(toWidget, this._arguments); + connect.publish("/dojox/mobile/afterTransitionIn", [toWidget].concat(this._arguments)); + toWidget.movedFrom = undefined; + } + + var c = this._context, m = this._method; + if(!c && !m){ return; } + if(!m){ + m = c; + c = null; + } + c = c || win.global; + if(typeof(m) == "string"){ + c[m].apply(c, this._args); + }else{ + m.apply(c, this._args); + } + }, + + getShowingView: function(){ + // summary: + // Find the currently showing view from my sibling views. + // description: + // Note that dojox.mobile.currentView is the last shown view. + // If the page consists of a splitter, there are multiple showing views. + var nodes = this.domNode.parentNode.childNodes; + for(var i = 0; i < nodes.length; i++){ + var n = nodes[i]; + if(n.nodeType === 1 && domClass.contains(n, "mblView") && domStyle.get(n, "display") !== "none"){ + return registry.byNode(n); + } + } + return null; + }, + + show: function(){ + // summary: + // Shows this view without a transition animation. + var view = this.getShowingView(); + if(view){ + view.domNode.style.display = "none"; // from-style + } + this.domNode.style.display = ""; // to-style + dm.currentView = this; + } + }); +}); + +}, +'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. + + 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 */ }); + + constructor: function(){ + this._hash = {}; + this.length = 0; + }, + + 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++; + }, + + remove: function(/*String*/ id){ + // summary: + // Remove a widget from this WidgetSet. Does not destroy the widget; simply + // removes the reference. + if(this._hash[id]){ + delete this._hash[id]; + this.length--; + } + }, + + forEach: function(/*Function*/ func, /* Object? */thisObj){ + // summary: + // Call specified function for each widget in this set. + // + // func: + // A callback function to run for each item. Is passed the widget, the index + // in the iteration, and the full hash, similar to `array.forEach`. + // + // thisObj: + // An optional scope parameter + // + // example: + // Using the default `dijit.registry` instance: + // | dijit.registry.forEach(function(widget){ + // | console.log(widget.declaredClass); + // | }); + // + // returns: + // Returns self, in order to allow for further chaining. + + thisObj = thisObj || win.global; + var i = 0, id; + for(id in this._hash){ + func.call(thisObj, this._hash[id], i++, this._hash); + } + return this; // dijit.WidgetSet + }, + + filter: function(/*Function*/ filter, /* Object? */thisObj){ + // summary: + // Filter down this WidgetSet to a smaller new WidgetSet + // Works the same as `array.filter` and `NodeList.filter` + // + // filter: + // Callback function to test truthiness. Is passed the widget + // reference and the pseudo-index in the object. + // + // thisObj: Object? + // Option scope to use for the filter function. + // + // example: + // Arbitrary: select the odd widgets in this list + // | 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 + }, + + 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 + + return this._hash[id]; // dijit._Widget + }, + + 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(); }); + + var res = new WidgetSet(), id, widget; + for(id in this._hash){ + widget = this._hash[id]; + if(widget.declaredClass == cls){ + res.add(widget); + } + } + return res; // dijit.WidgetSet + }, + + toArray: function(){ + // summary: + // Convert this WidgetSet into a true Array + // + // example: + // Work with the widget .domNodes in a real Array + // | array.map(dijit.registry.toArray(), function(w){ return w.domNode; }); + + var ar = []; + for(var id in this._hash){ + ar.push(this._hash[id]); + } + return ar; // dijit._Widget[] + }, + + map: function(/* Function */func, /* Object? */thisObj){ + // summary: + // 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 + }, + + every: function(func, thisObj){ + // summary: + // A synthetic clone of `array.every` acting explicitly on this WidgetSet + // + // func: Function + // A callback function run for every widget in this list. Exits loop + // when the first false return is encountered. + // + // thisObj: Object? + // Optional scope parameter to use for the callback + + thisObj = thisObj || 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 + }, + + some: function(func, thisObj){ + // summary: + // A synthetic clone of `array.some` acting explicitly on this WidgetSet + // + // func: Function + // A callback function run for every widget in this list. Exits loop + // when the first true return is encountered. + // + // thisObj: Object? + // Optional scope parameter to use for the callback + + thisObj = thisObj || win.global; + var x = 0, i; + for(i in this._hash){ + if(func.call(thisObj, this._hash[i], x++, this._hash)){ + return true; // Boolean + } + } + return false; // Boolean + } + + }); + + // Add in 1.x compatibility methods to dijit.registry. + // These functions won't show up in the API doc but since they are deprecated anyway, + // that's probably for the best. + array.forEach(["forEach", "filter", "byClass", "map", "every", "some"], function(func){ + registry[func] = WidgetSet.prototype[func]; + }); + + + return WidgetSet; +}); + +}, +'dojo/fx/easing':function(){ +define(["../_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; +}); + +}, +'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/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. + +var typematic = (dijit.typematic = { + // summary: + // These functions are used to repetitively call a user specified callback + // method when a specific key or mouse click over a specific DOM node is + // held down for a specific amount of time. + // Only 1 such event is allowed to occur on the browser page at 1 time. + + _fireEventAndReload: function(){ + this._timer = null; + this._callback(++this._count, this._node, this._evt); + + // Schedule next event, timer is at most minDelay (default 10ms) to avoid + // browser overload (particularly avoiding starving DOH robot so it never gets to send a mouseup) + this._currentTimeout = Math.max( + this._currentTimeout < 0 ? this._initialDelay : + (this._subsequentDelay > 1 ? this._subsequentDelay : Math.round(this._currentTimeout * this._subsequentDelay)), + this._minDelay); + this._timer = setTimeout(lang.hitch(this, "_fireEventAndReload"), this._currentTimeout); + }, + + trigger: function(/*Event*/ evt, /*Object*/ _this, /*DOMNode*/ node, /*Function*/ callback, /*Object*/ obj, /*Number*/ subsequentDelay, /*Number*/ initialDelay, /*Number?*/ minDelay){ + // summary: + // Start a timed, repeating callback sequence. + // If already started, the function call is ignored. + // This method is not normally called by the user but can be + // when the normal listener code is insufficient. + // evt: + // key or mouse event object to pass to the user callback + // _this: + // pointer to the user's widget space. + // node: + // the DOM node object to pass the the callback function + // callback: + // function to call until the sequence is stopped called with 3 parameters: + // count: + // integer representing number of repeated calls (0..n) with -1 indicating the iteration has stopped + // node: + // the DOM node object passed in + // evt: + // key or mouse event object + // obj: + // user space object used to uniquely identify each typematic sequence + // subsequentDelay (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); + } + }, + + stop: function(){ + // summary: + // Stop an ongoing timed, repeating callback sequence. + if(this._timer){ + clearTimeout(this._timer); + this._timer = null; + } + if(this._obj){ + this._callback(-1, this._node, this._evt); + this._obj = null; + } + }, + + addKeyListener: function(/*DOMNode*/ node, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay, /*Number?*/ minDelay){ + // summary: + // Start listening for a specific typematic key. + // See also the trigger method for other parameters. + // keyObject: + // an object defining the key to listen for: + // charOrCode: + // the printable character (string) or keyCode (number) to listen for. + // keyCode: + // (deprecated - use charOrCode) the keyCode (number) to listen for (implies charCode = 0). + // charCode: + // (deprecated - use charOrCode) the charCode (number) to listen for. + // ctrlKey: + // desired ctrl key state to initiate the callback sequence: + // - pressed (true) + // - released (false) + // - either (unspecified) + // altKey: + // same as ctrlKey but for the alt key + // shiftKey: + // same as ctrlKey but for the shift key + // returns: + // a connection handle + if(keyObject.keyCode){ + keyObject.charOrCode = keyObject.keyCode; + kernel.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.", "", "2.0"); + }else if(keyObject.charCode){ + keyObject.charOrCode = String.fromCharCode(keyObject.charCode); + kernel.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.", "", "2.0"); + } + var handles = [ + on(node, connect._keypress, lang.hitch(this, function(evt){ + if(evt.charOrCode == keyObject.charOrCode && + (keyObject.ctrlKey === undefined || keyObject.ctrlKey == evt.ctrlKey) && + (keyObject.altKey === undefined || keyObject.altKey == evt.altKey) && + (keyObject.metaKey === undefined || keyObject.metaKey == (evt.metaKey || false)) && // IE doesn't even set metaKey + (keyObject.shiftKey === undefined || keyObject.shiftKey == evt.shiftKey)){ + event.stop(evt); + typematic.trigger(evt, _this, node, callback, keyObject, subsequentDelay, initialDelay, minDelay); + }else if(typematic._obj == keyObject){ + typematic.stop(); + } + })), + on(node, "keyup", lang.hitch(this, function(){ + if(typematic._obj == keyObject){ + typematic.stop(); + } + })) + ]; + return { remove: function(){ array.forEach(handles, function(h){ h.remove(); }); } }; + }, + + addMouseListener: function(/*DOMNode*/ node, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay, /*Number?*/ minDelay){ + // summary: + // Start listening for a typematic mouse click. + // See the trigger method for other parameters. + // returns: + // a connection handle + var handles = [ + on(node, "mousedown", lang.hitch(this, function(evt){ + 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(); }); } }; + }, + + addListener: function(/*Node*/ mouseNode, /*Node*/ keyNode, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay, /*Number?*/ minDelay){ + // summary: + // Start listening for a specific typematic key and mouseclick. + // This is a thin wrapper to addKeyListener and addMouseListener. + // See the addMouseListener and addKeyListener methods for other parameters. + // mouseNode: + // the DOM node object to listen on for mouse events. + // keyNode: + // the DOM node object to listen on for key events. + // returns: + // a connection handle + var handles = [ + this.addKeyListener(keyNode, keyObject, _this, callback, subsequentDelay, initialDelay, minDelay), + this.addMouseListener(mouseNode, _this, callback, subsequentDelay, initialDelay, minDelay) + ]; + return { remove: function(){ array.forEach(handles, function(h){ h.remove(); }); } }; + } +}); + +return typematic; + +}); + +}, +'dojox/mobile/app/ImageView':function(){ +// wrapped by build app +define(["dijit","dojo","dojox","dojo/require!dojox/mobile/app/_Widget,dojo/fx/easing"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.ImageView"); +dojo.experimental("dojox.mobile.app.ImageView"); +dojo.require("dojox.mobile.app._Widget"); + +dojo.require("dojo.fx.easing"); + +dojo.declare("dojox.mobile.app.ImageView", dojox.mobile.app._Widget, { + + // zoom: Number + // The current level of zoom. This should not be set manually. + zoom: 1, + + // zoomCenterX: Number + // The X coordinate in the image where the zoom is focused + zoomCenterX: 0, + + // zoomCenterY: Number + // The Y coordinate in the image where the zoom is focused + zoomCenterY: 0, + + // maxZoom: Number + // The highest degree to which an image can be zoomed. For example, + // a maxZoom of 5 means that the image will be 5 times larger than normal + maxZoom: 5, + + // autoZoomLevel: Number + // The degree to which the image is zoomed when auto zoom is invoked. + // The higher the number, the more the image is zoomed in. + autoZoomLevel: 3, + + // disableAutoZoom: Boolean + // Disables auto zoom + disableAutoZoom: false, + + // disableSwipe: Boolean + // Disables the users ability to swipe from one image to the next. + disableSwipe: false, + + // autoZoomEvent: String + // Overrides the default event listened to which invokes auto zoom + autoZoomEvent: null, + + // _leftImg: Node + // The full sized image to the left + _leftImg: null, + + // _centerImg: Node + // The full sized image in the center + _centerImg: null, + + // _rightImg: Node + // The full sized image to the right + _rightImg: null, + + // _leftImg: Node + // The small sized image to the left + _leftSmallImg: null, + + // _centerImg: Node + // The small sized image in the center + _centerSmallImg: null, + + // _rightImg: Node + // The small sized image to the right + _rightSmallImg: null, + + constructor: function(){ + + this.panX = 0; + this.panY = 0; + + this.handleLoad = dojo.hitch(this, this.handleLoad); + this._updateAnimatedZoom = dojo.hitch(this, this._updateAnimatedZoom); + this._updateAnimatedPan = dojo.hitch(this, this._updateAnimatedPan); + this._onAnimPanEnd = dojo.hitch(this, this._onAnimPanEnd); + }, + + buildRendering: function(){ + this.inherited(arguments); + + this.canvas = dojo.create("canvas", {}, this.domNode); + + dojo.addClass(this.domNode, "mblImageView"); + }, + + postCreate: function(){ + this.inherited(arguments); + + this.size = dojo.marginBox(this.domNode); + + dojo.style(this.canvas, { + width: this.size.w + "px", + height: this.size.h + "px" + }); + this.canvas.height = this.size.h; + this.canvas.width = this.size.w; + + var _this = this; + + // Listen to the mousedown/touchstart event. Record the position + // so we can use it to pan the image. + this.connect(this.domNode, "onmousedown", function(event){ + if(_this.isAnimating()){ + return; + } + if(_this.panX){ + _this.handleDragEnd(); + } + + _this.downX = event.targetTouches ? event.targetTouches[0].clientX : event.clientX; + _this.downY = event.targetTouches ? event.targetTouches[0].clientY : event.clientY; + }); + + // record the movement of the mouse. + this.connect(this.domNode, "onmousemove", function(event){ + if(_this.isAnimating()){ + return; + } + if((!_this.downX && _this.downX !== 0) || (!_this.downY && _this.downY !== 0)){ + // If the touch didn't begin on this widget, ignore the movement + return; + } + + if((!_this.disableSwipe && _this.zoom == 1) + || (!_this.disableAutoZoom && _this.zoom != 1)){ + var x = event.targetTouches ? + event.targetTouches[0].clientX : event.pageX; + var y = event.targetTouches ? + event.targetTouches[0].clientY : event.pageY; + + _this.panX = x - _this.downX; + _this.panY = y - _this.downY; + + if(_this.zoom == 1){ + // If not zoomed in, then try to move to the next or prev image + // but only if the mouse has moved more than 10 pixels + // in the X direction + if(Math.abs(_this.panX) > 10){ + _this.render(); + } + }else{ + // If zoomed in, pan the image if the mouse has moved more + // than 10 pixels in either direction. + if(Math.abs(_this.panX) > 10 || Math.abs(_this.panY) > 10){ + _this.render(); + } + } + } + }); + + this.connect(this.domNode, "onmouseout", function(event){ + if(!_this.isAnimating() && _this.panX){ + _this.handleDragEnd(); + } + }); + + this.connect(this.domNode, "onmouseover", function(event){ + _this.downX = _this.downY = null; + }); + + // Set up AutoZoom, which zooms in a fixed amount when the user taps + // a part of the canvas + this.connect(this.domNode, "onclick", function(event){ + if(_this.isAnimating()){ + return; + } + if(_this.downX == null || _this.downY == null){ + return; + } + + var x = (event.targetTouches ? + event.targetTouches[0].clientX : event.pageX); + var y = (event.targetTouches ? + event.targetTouches[0].clientY : event.pageY); + + // If the mouse/finger has moved more than 14 pixels from where it + // started, do not treat it as a click. It is a drag. + if(Math.abs(_this.panX) > 14 || Math.abs(_this.panY) > 14){ + _this.downX = _this.downY = null; + _this.handleDragEnd(); + return; + } + _this.downX = _this.downY = null; + + if(!_this.disableAutoZoom){ + + if(!_this._centerImg || !_this._centerImg._loaded){ + // Do nothing until the image is loaded + return; + } + if(_this.zoom != 1){ + _this.set("animatedZoom", 1); + return; + } + + var pos = dojo._abs(_this.domNode); + + // Translate the clicked point to a point on the source image + var xRatio = _this.size.w / _this._centerImg.width; + var yRatio = _this.size.h / _this._centerImg.height; + + // Do an animated zoom to the point which was clicked. + _this.zoomTo( + ((x - pos.x) / xRatio) - _this.panX, + ((y - pos.y) / yRatio) - _this.panY, + _this.autoZoomLevel); + } + }); + + // Listen for Flick events + dojo.connect(this.domNode, "flick", this, "handleFlick"); + }, + + isAnimating: function(){ + // summary: + // Returns true if an animation is in progress, false otherwise. + return this._anim && this._anim.status() == "playing"; + }, + + handleDragEnd: function(){ + // summary: + // Handles the end of a dragging event. If not zoomed in, it + // determines if the next or previous image should be transitioned + // to. + this.downX = this.downY = null; + console.log("handleDragEnd"); + + if(this.zoom == 1){ + if(!this.panX){ + return; + } + + var leftLoaded = (this._leftImg && this._leftImg._loaded) + || (this._leftSmallImg && this._leftSmallImg._loaded); + var rightLoaded = (this._rightImg && this._rightImg._loaded) + || (this._rightSmallImg && this._rightSmallImg._loaded); + + // Check if the drag has moved the image more than half its length. + // If so, move to either the previous or next image. + var doMove = + !(Math.abs(this.panX) < this._centerImg._baseWidth / 2) && + ( + (this.panX > 0 && leftLoaded ? 1 : 0) || + (this.panX < 0 && rightLoaded ? 1 : 0) + ); + + + if(!doMove){ + // If not moving to another image, animate the sliding of the + // image back into place. + this._animPanTo(0, dojo.fx.easing.expoOut, 700); + }else{ + // Move to another image. + this.moveTo(this.panX); + } + }else{ + if(!this.panX && !this.panY){ + return; + } + // Recenter the zoomed image based on where it was panned to + // previously + this.zoomCenterX -= (this.panX / this.zoom); + this.zoomCenterY -= (this.panY / this.zoom); + + this.panX = this.panY = 0; + } + + }, + + handleFlick: function(event){ + // summary: + // Handle a flick event. + if(this.zoom == 1 && event.duration < 500){ + // Only handle quick flicks here, less than 0.5 seconds + + // If not zoomed in, then check if we should move to the next photo + // or not + if(event.direction == "ltr"){ + this.moveTo(1); + }else if(event.direction == "rtl"){ + this.moveTo(-1); + } + // If an up or down flick occurs, it means nothing so ignore it + this.downX = this.downY = null; + } + }, + + moveTo: function(direction){ + direction = direction > 0 ? 1 : -1; + var toImg; + + if(direction < 1){ + if(this._rightImg && this._rightImg._loaded){ + toImg = this._rightImg; + }else if(this._rightSmallImg && this._rightSmallImg._loaded){ + toImg = this._rightSmallImg; + } + }else{ + if(this._leftImg && this._leftImg._loaded){ + toImg = this._leftImg; + }else if(this._leftSmallImg && this._leftSmallImg._loaded){ + toImg = this._leftSmallImg; + } + } + + this._moveDir = direction; + var _this = this; + + if(toImg && toImg._loaded){ + // If the image is loaded, make a linear animation to show it + this._animPanTo(this.size.w * direction, null, 500, function(){ + _this.panX = 0; + _this.panY = 0; + + if(direction < 0){ + // Moving to show the right image + _this._switchImage("left", "right"); + }else{ + // Moving to show the left image + _this._switchImage("right", "left"); + } + + _this.render(); + _this.onChange(direction * -1); + }); + + }else{ + // If the next image is not loaded, make an animation to + // move the center image to half the width of the widget and back + // again + + console.log("moveTo image not loaded!", toImg); + + this._animPanTo(0, dojo.fx.easing.expoOut, 700); + } + }, + + _switchImage: function(toImg, fromImg){ + var toSmallImgName = "_" + toImg + "SmallImg"; + var toImgName = "_" + toImg + "Img"; + + var fromSmallImgName = "_" + fromImg + "SmallImg"; + var fromImgName = "_" + fromImg + "Img"; + + this[toImgName] = this._centerImg; + this[toSmallImgName] = this._centerSmallImg; + + this[toImgName]._type = toImg; + + if(this[toSmallImgName]){ + this[toSmallImgName]._type = toImg; + } + + this._centerImg = this[fromImgName]; + this._centerSmallImg = this[fromSmallImgName]; + this._centerImg._type = "center"; + + if(this._centerSmallImg){ + this._centerSmallImg._type = "center"; + } + this[fromImgName] = this[fromSmallImgName] = null; + }, + + _animPanTo: function(to, easing, duration, callback){ + this._animCallback = callback; + this._anim = new dojo.Animation({ + curve: [this.panX, to], + onAnimate: this._updateAnimatedPan, + duration: duration || 500, + easing: easing, + onEnd: this._onAnimPanEnd + }); + + this._anim.play(); + return this._anim; + }, + + onChange: function(direction){ + // summary: + // Stub function that can be listened to in order to provide + // new images when the displayed image changes + }, + + _updateAnimatedPan: function(amount){ + this.panX = amount; + this.render(); + }, + + _onAnimPanEnd: function(){ + this.panX = this.panY = 0; + + if(this._animCallback){ + this._animCallback(); + } + }, + + zoomTo: function(centerX, centerY, zoom){ + this.set("zoomCenterX", centerX); + this.set("zoomCenterY", centerY); + + this.set("animatedZoom", zoom); + }, + + render: function(){ + var cxt = this.canvas.getContext('2d'); + + cxt.clearRect(0, 0, this.canvas.width, this.canvas.height); + + // Render the center image + this._renderImg( + this._centerSmallImg, + this._centerImg, + this.zoom == 1 ? (this.panX < 0 ? 1 : this.panX > 0 ? -1 : 0) : 0); + + if(this.zoom == 1 && this.panX != 0){ + if(this.panX > 0){ + // Render the left image, showing the right side of it + this._renderImg(this._leftSmallImg, this._leftImg, 1); + }else{ + // Render the right image, showing the left side of it + this._renderImg(this._rightSmallImg, this._rightImg, -1); + } + } + }, + + _renderImg: function(smallImg, largeImg, panDir){ + // summary: + // Renders a single image + + + // If zoomed, we just display the center img + var img = (largeImg && largeImg._loaded) ? largeImg : smallImg; + + if(!img || !img._loaded){ + // If neither the large or small image is loaded, display nothing + return; + } + var cxt = this.canvas.getContext('2d'); + + var baseWidth = img._baseWidth; + var baseHeight = img._baseHeight; + + // Calculate the size the image would be if there were no bounds + var desiredWidth = baseWidth * this.zoom; + var desiredHeight = baseHeight * this.zoom; + + // Calculate the actual size of the viewable image + var destWidth = Math.min(this.size.w, desiredWidth); + var destHeight = Math.min(this.size.h, desiredHeight); + + + // Calculate the size of the window on the original image to use + var sourceWidth = this.dispWidth = img.width * (destWidth / desiredWidth); + var sourceHeight = this.dispHeight = img.height * (destHeight / desiredHeight); + + var zoomCenterX = this.zoomCenterX - (this.panX / this.zoom); + var zoomCenterY = this.zoomCenterY - (this.panY / this.zoom); + + // Calculate where the center of the view should be + var centerX = Math.floor(Math.max(sourceWidth / 2, + Math.min(img.width - sourceWidth / 2, zoomCenterX))); + var centerY = Math.floor(Math.max(sourceHeight / 2, + Math.min(img.height - sourceHeight / 2, zoomCenterY))); + + + var sourceX = Math.max(0, + Math.round((img.width - sourceWidth)/2 + (centerX - img._centerX)) ); + var sourceY = Math.max(0, + Math.round((img.height - sourceHeight) / 2 + (centerY - img._centerY)) + ); + + var destX = Math.round(Math.max(0, this.canvas.width - destWidth)/2); + var destY = Math.round(Math.max(0, this.canvas.height - destHeight)/2); + + var oldDestWidth = destWidth; + var oldSourceWidth = sourceWidth; + + if(this.zoom == 1 && panDir && this.panX){ + + if(this.panX < 0){ + if(panDir > 0){ + // If the touch is moving left, and the right side of the + // image should be shown, then reduce the destination width + // by the absolute value of panX + destWidth -= Math.abs(this.panX); + destX = 0; + }else if(panDir < 0){ + // If the touch is moving left, and the left side of the + // image should be shown, then set the displayed width + // to the absolute value of panX, less some pixels for + // a padding between images + destWidth = Math.max(1, Math.abs(this.panX) - 5); + destX = this.size.w - destWidth; + } + }else{ + if(panDir > 0){ + // If the touch is moving right, and the right side of the + // image should be shown, then set the destination width + // to the absolute value of the pan, less some pixels for + // padding + destWidth = Math.max(1, Math.abs(this.panX) - 5); + destX = 0; + }else if(panDir < 0){ + // If the touch is moving right, and the left side of the + // image should be shown, then reduce the destination width + // by the widget width minus the absolute value of panX + destWidth -= Math.abs(this.panX); + destX = this.size.w - destWidth; + } + } + + sourceWidth = Math.max(1, + Math.floor(sourceWidth * (destWidth / oldDestWidth))); + + if(panDir > 0){ + // If the right side of the image should be displayed, move + // the sourceX to be the width of the image minus the difference + // between the original sourceWidth and the new sourceWidth + sourceX = (sourceX + oldSourceWidth) - (sourceWidth); + } + sourceX = Math.floor(sourceX); + } + + try{ + + // See https://developer.mozilla.org/en/Canvas_tutorial/Using_images + cxt.drawImage( + img, + Math.max(0, sourceX), + sourceY, + Math.min(oldSourceWidth, sourceWidth), + sourceHeight, + destX, // Xpos + destY, // Ypos + Math.min(oldDestWidth, destWidth), + destHeight + ); + }catch(e){ + console.log("Caught Error",e, + + "type=", img._type, + "oldDestWidth = ", oldDestWidth, + "destWidth", destWidth, + "destX", destX + , "oldSourceWidth=",oldSourceWidth, + "sourceWidth=", sourceWidth, + "sourceX = " + sourceX + ); + } + }, + + _setZoomAttr: function(amount){ + this.zoom = Math.min(this.maxZoom, Math.max(1, amount)); + + if(this.zoom == 1 + && this._centerImg + && this._centerImg._loaded){ + + if(!this.isAnimating()){ + this.zoomCenterX = this._centerImg.width / 2; + this.zoomCenterY = this._centerImg.height / 2; + } + this.panX = this.panY = 0; + } + + this.render(); + }, + + _setZoomCenterXAttr: function(value){ + if(value != this.zoomCenterX){ + if(this._centerImg && this._centerImg._loaded){ + value = Math.min(this._centerImg.width, value); + } + this.zoomCenterX = Math.max(0, Math.round(value)); + } + }, + + _setZoomCenterYAttr: function(value){ + if(value != this.zoomCenterY){ + if(this._centerImg && this._centerImg._loaded){ + value = Math.min(this._centerImg.height, value); + } + this.zoomCenterY = Math.max(0, Math.round(value)); + } + }, + + _setZoomCenterAttr: function(value){ + if(value.x != this.zoomCenterX || value.y != this.zoomCenterY){ + this.set("zoomCenterX", value.x); + this.set("zoomCenterY", value.y); + this.render(); + } + }, + + _setAnimatedZoomAttr: function(amount){ + if(this._anim && this._anim.status() == "playing"){ + return; + } + + this._anim = new dojo.Animation({ + curve: [this.zoom, amount], + onAnimate: this._updateAnimatedZoom, + onEnd: this._onAnimEnd + }); + + this._anim.play(); + }, + + _updateAnimatedZoom: function(amount){ + this._setZoomAttr(amount); + }, + + _setCenterUrlAttr: function(urlOrObj){ + this._setImage("center", urlOrObj); + }, + _setLeftUrlAttr: function(urlOrObj){ + this._setImage("left", urlOrObj); + }, + _setRightUrlAttr: function(urlOrObj){ + this._setImage("right", urlOrObj); + }, + + _setImage: function(name, urlOrObj){ + var smallUrl = null; + + var largeUrl = null; + + if(dojo.isString(urlOrObj)){ + // If the argument is a string, then just load the large url + largeUrl = urlOrObj; + }else{ + largeUrl = urlOrObj.large; + smallUrl = urlOrObj.small; + } + + if(this["_" + name + "Img"] && this["_" + name + "Img"]._src == largeUrl){ + // Identical URL, ignore it + return; + } + + // Just do the large image for now + var largeImg = this["_" + name + "Img"] = new Image(); + largeImg._type = name; + largeImg._loaded = false; + largeImg._src = largeUrl; + largeImg._conn = dojo.connect(largeImg, "onload", this.handleLoad); + + if(smallUrl){ + // If a url to a small version of the image has been provided, + // load that image first. + var smallImg = this["_" + name + "SmallImg"] = new Image(); + smallImg._type = name; + smallImg._loaded = false; + smallImg._conn = dojo.connect(smallImg, "onload", this.handleLoad); + smallImg._isSmall = true; + smallImg._src = smallUrl; + smallImg.src = smallUrl; + } + + // It's important that the large url's src is set after the small image + // to ensure it's loaded second. + largeImg.src = largeUrl; + }, + + handleLoad: function(evt){ + // summary: + // Handles the loading of an image, both the large and small + // versions. A render is triggered as a result of each image load. + + var img = evt.target; + img._loaded = true; + + dojo.disconnect(img._conn); + + var type = img._type; + + switch(type){ + case "center": + this.zoomCenterX = img.width / 2; + this.zoomCenterY = img.height / 2; + break; + } + + var height = img.height; + var width = img.width; + + if(width / this.size.w < height / this.size.h){ + // Fit the height to the height of the canvas + img._baseHeight = this.canvas.height; + img._baseWidth = width / (height / this.size.h); + }else{ + // Fix the width to the width of the canvas + img._baseWidth = this.canvas.width; + img._baseHeight = height / (width / this.size.w); + } + img._centerX = width / 2; + img._centerY = height / 2; + + this.render(); + + this.onLoad(img._type, img._src, img._isSmall); + }, + + onLoad: function(type, url, isSmall){ + // summary: + // Dummy function that is called whenever an image loads. + // type: String + // The position of the image that has loaded, either + // "center", "left" or "right" + // url: String + // The src of the image + // isSmall: Boolean + // True if it is a small version of the image that has loaded, + // false otherwise. + } +}); + +}); + +}, +'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. + + lang.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 = win.doc.selection, cf = focus.curNode; + + if(win.global.getSelection){ + //W3C Range API for selections. + sel = win.global.getSelection(); + if(sel){ + if(sel.isCollapsed){ + tg = cf? cf.tagName : ""; + if(tg){ + //Create a fake rangelike item to restore selections. + tg = tg.toLowerCase(); + if(tg == "textarea" || + (tg == "input" && (!cf.type || cf.type.toLowerCase() == "text"))){ + sel = { + start: cf.selectionStart, + end: cf.selectionEnd, + node: cf, + pRange: true + }; + return {isCollapsed: (sel.end <= sel.start), mark: sel}; //Object. + } + } + bm = {isCollapsed:true}; + if(sel.rangeCount){ + bm.mark = sel.getRangeAt(0).cloneRange(); + } + }else{ + rg = sel.getRangeAt(0); + bm = {isCollapsed: false, mark: rg.cloneRange()}; + } + } + }else if(sel){ + // If the current focus was a input of some sort and no selection, don't bother saving + // a native bookmark. This is because it causes issues with dialog/page selection restore. + // So, we need to create psuedo bookmarks to work with. + tg = cf ? cf.tagName : ""; + tg = tg.toLowerCase(); + if(cf && tg && (tg == "button" || tg == "textarea" || tg == "input")){ + if(sel.type && sel.type.toLowerCase() == "none"){ + return { + isCollapsed: true, + mark: null + } + }else{ + rg = sel.createRange(); + return { + isCollapsed: rg.text && rg.text.length?false:true, + mark: { + range: rg, + pRange: true + } + }; + } + } + bm = {}; + + //'IE' way for selections. + try{ + // createRange() throws exception when dojo in iframe + //and nothing selected, see #9632 + rg = sel.createRange(); + bm.isCollapsed = !(sel.type == 'Text' ? rg.htmlText.length : rg.length); + }catch(e){ + bm.isCollapsed = true; + return bm; + } + if(sel.type.toUpperCase() == 'CONTROL'){ + if(rg.length){ + bm.mark=[]; + var i=0,len=rg.length; + while(i<len){ + bm.mark.push(rg.item(i++)); + } + }else{ + bm.isCollapsed = true; + bm.mark = null; + } + }else{ + bm.mark = rg.getBookmark(); + } + }else{ + console.warn("No idea how to store the current selection for this browser!"); + } + return bm; // Object + }, + + moveToBookmark: function(/*Object*/ bookmark){ + // summary: + // Moves current selection to a bookmark + // bookmark: + // This should be a returned object from dijit.getBookmark() + + var _doc = win.doc, + mark = bookmark.mark; + if(mark){ + if(win.global.getSelection){ + //W3C Rangi API (FF, WebKit, Opera, etc) + var sel = win.global.getSelection(); + if(sel && sel.removeAllRanges){ + if(mark.pRange){ + var n = mark.node; + n.selectionStart = mark.start; + n.selectionEnd = mark.end; + }else{ + sel.removeAllRanges(); + sel.addRange(mark); + } + }else{ + console.warn("No idea how to restore selection for this browser!"); + } + }else if(_doc.selection && mark){ + //'IE' way. + var rg; + if(mark.pRange){ + rg = mark.range; + }else if(lang.isArray(mark)){ + rg = _doc.body.createControlRange(); + //rg.addElement does not have call/apply method, so can not call it directly + //rg is not available in "range.addElement(item)", so can't use that either + array.forEach(mark, function(n){ + rg.addElement(n); + }); + }else{ + rg = _doc.body.createTextRange(); + rg.moveToBookmark(mark); + } + rg.select(); + } + } + }, + + getFocus: function(/*Widget?*/ menu, /*Window?*/ openedForWindow){ + // summary: + // Called as getFocus(), this returns an Object showing the current focus + // and selected text. + // + // Called as getFocus(widget), where widget is a (widget representing) a button + // that was just pressed, it returns where focus was before that button + // was pressed. (Pressing the button may have either shifted focus to the button, + // or removed focus altogether.) In this case the selected text is not returned, + // since it can't be accurately determined. + // + // menu: dijit._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 + }, + + // _activeStack: dijit._Widget[] + // List of currently active widgets (focused widget and it's ancestors) + _activeStack: [], + + registerIframe: function(/*DomNode*/ iframe){ + // summary: + // Registers listeners on the specified iframe so that any click + // or focus event on that iframe (or anything in it) is reported + // as a focus/click event on the <iframe> itself. + // description: + // Currently only used by editor. + // returns: + // Handle to pass to unregisterIframe() + return focus.registerIframe(iframe); + }, + + unregisterIframe: function(/*Object*/ handle){ + // summary: + // Unregisters listeners on the specified iframe created by registerIframe. + // After calling be sure to delete or null out the handle itself. + // handle: + // Handle returned by registerIframe() + + handle && handle.remove(); + }, + + registerWin: function(/*Window?*/targetWindow, /*DomNode?*/ effectiveNode){ + // summary: + // Registers listeners on the specified window (either the main + // window or an iframe's window) to detect when the user has clicked somewhere + // or focused somewhere. + // description: + // Users should call registerIframe() instead of this method. + // targetWindow: + // If specified this is the window associated with the iframe, + // i.e. iframe.contentWindow. + // effectiveNode: + // If specified, report any focus events inside targetWindow as + // an event on effectiveNode, rather than on evt.target. + // returns: + // Handle to pass to unregisterWin() + + return focus.registerWin(targetWindow, effectiveNode); + }, + + unregisterWin: function(/*Handle*/ handle){ + // summary: + // Unregisters listeners on the specified window (either the main + // window or an iframe's window) according to handle returned from registerWin(). + // After calling be sure to delete or null out the handle itself. + + handle && handle.remove(); + } + }); + + // Override focus singleton's focus function so that dijit.focus() + // has backwards compatible behavior of restoring selection (although + // probably no one is using that). + focus.focus = function(/*Object || DomNode */ handle){ + // summary: + // Sets the focused node and the selection according to argument. + // To set focus to an iframe's content, pass in the iframe itself. + // handle: + // object returned by get(), or a DomNode + + if(!handle){ return; } + + var node = "node" in handle ? handle.node : handle, // because handle is either DomNode or a composite object + bookmark = handle.bookmark, + openedForWindow = handle.openedForWindow, + collapsed = bookmark ? bookmark.isCollapsed : false; + + // Set the focus + // Note that for iframe's we need to use the <iframe> to follow the parentNode chain, + // but we need to set focus to iframe.contentWindow + if(node){ + var focusNode = (node.tagName.toLowerCase() == "iframe") ? node.contentWindow : node; + if(focusNode && focusNode.focus){ + try{ + // Gecko throws sometimes if setting focus is impossible, + // node not displayed or something like that + focusNode.focus(); + }catch(e){/*quiet*/} + } + focus._onFocusNode(node); + } + + // set the selection + // do not need to restore if current selection is not empty + // (use keyboard to select a menu item) or if previous selection was collapsed + // as it may cause focus shift (Esp in IE). + if(bookmark && win.withGlobal(openedForWindow || win.global, dijit.isCollapsed) && !collapsed){ + if(openedForWindow){ + openedForWindow.focus(); + } + try{ + win.withGlobal(openedForWindow || win.global, dijit.moveToBookmark, null, [bookmark]); + }catch(e2){ + /*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */ + } + } + }; + + // For back compatibility, monitor changes to focused node and active widget stack, + // publishing events and copying changes from focus manager variables into dijit (top level) variables + focus.watch("curNode", function(name, oldVal, newVal){ + dijit._curFocus = newVal; + dijit._prevFocus = oldVal; + if(newVal){ + topic.publish("focusNode", newVal); // publish + } + }); + focus.watch("activeStack", function(name, oldVal, newVal){ + dijit._activeStack = newVal; + }); + + focus.on("widget-blur", function(widget, by){ + topic.publish("widgetBlur", widget, by); // publish + }); + focus.on("widget-focus", function(widget, by){ + topic.publish("widgetFocus", widget, by); // publish + }); + + return dijit; +}); + +}, +'dojox/mobile/ListItem':function(){ +define("dojox/mobile/ListItem", [ + "dojo/_base/array", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/has", + "./common", + "./_ItemBase", + "./TransitionEvent" +], function(array, connect, declare, lang, domClass, domConstruct, has, common, ItemBase, TransitionEvent){ + +/*===== + var ItemBase = dojox.mobile._ItemBase; +=====*/ + + // module: + // dojox/mobile/ListItem + // summary: + // An item of either RoundRectList or EdgeToEdgeList. + + return declare("dojox.mobile.ListItem", ItemBase, { + // summary: + // An item of either RoundRectList or EdgeToEdgeList. + // description: + // ListItem represents an item of either RoundRectList or + // EdgeToEdgeList. There are three ways to move to a different + // view, moveTo, href, and url. You can choose only one of them. + + // rightText: String + // A right-aligned text to display on the item. + rightText: "", + + // rightIcon: String + // An icon to display at the right hand side of the item. The value + // can be either a path for an image file or a class name of a DOM + // button. + rightIcon: "", + + // rightIcon2: String + // An icon to display at the left of the rightIcon. The value can + // be either a path for an image file or a class name of a DOM + // button. + rightIcon2: "", + + + // anchorLabel: Boolean + // If true, the label text becomes a clickable anchor text. When + // the user clicks on the text, the onAnchorLabelClicked handler is + // called. You can override or connect to the handler and implement + // any action. The handler has no default action. + anchorLabel: false, + + // noArrow: Boolean + // If true, the right hand side arrow is not displayed. + noArrow: false, + + // selected: Boolean + // If true, the item is highlighted to indicate it is selected. + selected: false, + + // checked: Boolean + // If true, a check mark is displayed at the right of the item. + checked: false, + + // arrowClass: String + // An icon to display as an arrow. The value can be either a path + // for an image file or a class name of a DOM button. + arrowClass: "mblDomButtonArrow", + + // checkClass: String + // An icon to display as a check mark. The value can be either a + // path for an image file or a class name of a DOM button. + checkClass: "mblDomButtonCheck", + + // variableHeight: Boolean + // If true, the height of the item varies according to its + // content. In dojo 1.6 or older, the "mblVariableHeight" class was + // used for this purpose. In dojo 1.7, adding the mblVariableHeight + // class still works for backward compatibility. + variableHeight: false, + + + // rightIconTitle: String + // An alt text for the right icon. + rightIconTitle: "", + + // rightIcon2Title: String + // An alt text for the right icon2. + rightIcon2Title: "", + + + // btnClass: String + // Deprecated. For backward compatibility. + btnClass: "", + + // btnClass2: String + // Deprecated. For backward compatibility. + btnClass2: "", + + // tag: String + // A name of html tag to create as domNode. + tag: "li", + + postMixInProperties: function(){ + // for backward compatibility + if(this.btnClass){ + this.rightIcon = this.btnClass; + } + this._setBtnClassAttr = this._setRightIconAttr; + this._setBtnClass2Attr = this._setRightIcon2Attr; + }, + + buildRendering: function(){ + this.domNode = this.srcNodeRef || domConstruct.create(this.tag); + this.inherited(arguments); + this.domNode.className = "mblListItem" + (this.selected ? " mblItemSelected" : ""); + + // label + var box = this.box = domConstruct.create("DIV"); + box.className = "mblListItemTextBox"; + if(this.anchorLabel){ + box.style.cursor = "pointer"; + } + var r = this.srcNodeRef; + if(r && !this.label){ + this.label = ""; + for(var i = 0, len = r.childNodes.length; i < len; i++){ + var n = r.firstChild; + if(n.nodeType === 3 && lang.trim(n.nodeValue) !== ""){ + n.nodeValue = this._cv ? this._cv(n.nodeValue) : n.nodeValue; + this.labelNode = domConstruct.create("SPAN", {className:"mblListItemLabel"}); + this.labelNode.appendChild(n); + n = this.labelNode; + } + box.appendChild(n); + } + } + if(!this.labelNode){ + this.labelNode = domConstruct.create("SPAN", {className:"mblListItemLabel"}, box); + } + if(this.anchorLabel){ + box.style.display = "inline"; // to narrow the text region + } + + var a = this.anchorNode = domConstruct.create("A"); + a.className = "mblListItemAnchor"; + this.domNode.appendChild(a); + a.appendChild(box); + }, + + startup: function(){ + if(this._started){ return; } + this.inheritParams(); + var parent = this.getParent(); + if(this.moveTo || this.href || this.url || this.clickable || (parent && parent.select)){ + this._onClickHandle = this.connect(this.anchorNode, "onclick", "onClick"); + } + this.setArrow(); + + if(domClass.contains(this.domNode, "mblVariableHeight")){ + this.variableHeight = true; + } + if(this.variableHeight){ + domClass.add(this.domNode, "mblVariableHeight"); + setTimeout(lang.hitch(this, "layoutVariableHeight")); + } + + this.set("icon", this.icon); // _setIconAttr may be called twice but this is necessary for offline instantiation + if(!this.checked && this.checkClass.indexOf(',') !== -1){ + this.set("checked", this.checked); + } + this.inherited(arguments); + }, + + resize: function(){ + if(this.variableHeight){ + this.layoutVariableHeight(); + } + }, + + onClick: function(e){ + var a = e.currentTarget; + var li = a.parentNode; + if(domClass.contains(li, "mblItemSelected")){ return; } // already selected + if(this.anchorLabel){ + for(var p = e.target; p.tagName !== this.tag.toUpperCase(); p = p.parentNode){ + if(p.className == "mblListItemTextBox"){ + domClass.add(p, "mblListItemTextBoxSelected"); + setTimeout(function(){ + domClass.remove(p, "mblListItemTextBoxSelected"); + }, has("android") ? 300 : 1000); + this.onAnchorLabelClicked(e); + return; + } + } + } + var parent = this.getParent(); + if(parent.select){ + if(parent.select === "single"){ + if(!this.checked){ + this.set("checked", true); + } + }else if(parent.select === "multiple"){ + this.set("checked", !this.checked); + } + } + this.select(); + + if (this.href && this.hrefTarget) { + common.openWindow(this.href, this.hrefTarget); + return; + } + var transOpts; + if(this.moveTo || this.href || this.url || this.scene){ + transOpts = {moveTo: this.moveTo, href: this.href, url: this.url, scene: this.scene, transition: this.transition, transitionDir: this.transitionDir}; + }else if(this.transitionOptions){ + transOpts = this.transitionOptions; + } + + if(transOpts){ + this.setTransitionPos(e); + return new TransitionEvent(this.domNode,transOpts,e).dispatch(); + } + }, + + select: function(){ + // summary: + // Makes this widget in the selected state. + var parent = this.getParent(); + if(parent.stateful){ + parent.deselectAll(); + }else{ + var _this = this; + setTimeout(function(){ + _this.deselect(); + }, has("android") ? 300 : 1000); + } + domClass.add(this.domNode, "mblItemSelected"); + }, + + deselect: function(){ + // summary: + // Makes this widget in the deselected state. + domClass.remove(this.domNode, "mblItemSelected"); + }, + + onAnchorLabelClicked: function(e){ + // summary: + // Stub function to connect to from your application. + }, + + layoutVariableHeight: function(){ + var h = this.anchorNode.offsetHeight; + if(h === this.anchorNodeHeight){ return; } + this.anchorNodeHeight = h; + array.forEach([ + this.rightTextNode, + this.rightIcon2Node, + this.rightIconNode, + this.iconNode + ], function(n){ + if(n){ + var t = Math.round((h - n.offsetHeight) / 2); + n.style.marginTop = t + "px"; + } + }); + }, + + setArrow: function(){ + // summary: + // Sets the arrow icon if necessary. + if(this.checked){ return; } + var c = ""; + var parent = this.getParent(); + if(this.moveTo || this.href || this.url || this.clickable){ + if(!this.noArrow && !(parent && parent.stateful)){ + c = this.arrowClass; + } + } + if(c){ + this._setRightIconAttr(c); + } + }, + + _setIconAttr: function(icon){ + if(!this.getParent()){ return; } // icon may be invalid because inheritParams is not called yet + this.icon = icon; + var a = this.anchorNode; + if(!this.iconNode){ + if(icon){ + var ref = this.rightIconNode || this.rightIcon2Node || this.rightTextNode || this.box; + this.iconNode = domConstruct.create("DIV", {className:"mblListItemIcon"}, ref, "before"); + } + }else{ + domConstruct.empty(this.iconNode); + } + if(icon && icon !== "none"){ + common.createIcon(icon, this.iconPos, null, this.alt, this.iconNode); + if(this.iconPos){ + domClass.add(this.iconNode.firstChild, "mblListItemSpriteIcon"); + } + domClass.remove(a, "mblListItemAnchorNoIcon"); + }else{ + domClass.add(a, "mblListItemAnchorNoIcon"); + } + }, + + _setCheckedAttr: function(/*Boolean*/checked){ + var parent = this.getParent(); + if(parent && parent.select === "single" && checked){ + array.forEach(parent.getChildren(), function(child){ + child.set("checked", false); + }); + } + this._setRightIconAttr(this.checkClass); + + var icons = this.rightIconNode.childNodes; + if(icons.length === 1){ + this.rightIconNode.style.display = checked ? "" : "none"; + }else{ + icons[0].style.display = checked ? "" : "none"; + icons[1].style.display = !checked ? "" : "none"; + } + + domClass.toggle(this.domNode, "mblListItemChecked", checked); + if(parent && this.checked !== checked){ + parent.onCheckStateChanged(this, checked); + } + this.checked = checked; + }, + + _setRightTextAttr: function(/*String*/text){ + if(!this.rightTextNode){ + this.rightTextNode = domConstruct.create("DIV", {className:"mblListItemRightText"}, this.box, "before"); + } + this.rightText = text; + this.rightTextNode.innerHTML = this._cv ? this._cv(text) : text; + }, + + _setRightIconAttr: function(/*String*/icon){ + if(!this.rightIconNode){ + var ref = this.rightIcon2Node || this.rightTextNode || this.box; + this.rightIconNode = domConstruct.create("DIV", {className:"mblListItemRightIcon"}, ref, "before"); + }else{ + domConstruct.empty(this.rightIconNode); + } + this.rightIcon = icon; + var arr = (icon || "").split(/,/); + if(arr.length === 1){ + common.createIcon(icon, null, null, this.rightIconTitle, this.rightIconNode); + }else{ + common.createIcon(arr[0], null, null, this.rightIconTitle, this.rightIconNode); + common.createIcon(arr[1], null, null, this.rightIconTitle, this.rightIconNode); + } + }, + + _setRightIcon2Attr: function(/*String*/icon){ + if(!this.rightIcon2Node){ + var ref = this.rightTextNode || this.box; + this.rightIcon2Node = domConstruct.create("DIV", {className:"mblListItemRightIcon2"}, ref, "before"); + }else{ + domConstruct.empty(this.rightIcon2Node); + } + this.rightIcon2 = icon; + common.createIcon(icon, null, null, this.rightIcon2Title, this.rightIcon2Node); + }, + + _setLabelAttr: function(/*String*/text){ + this.label = text; + this.labelNode.innerHTML = this._cv ? this._cv(text) : text; + } + }); +}); + +}, +'dojox/mobile/app/StageController':function(){ +// wrapped by build app +define(["dijit","dojo","dojox","dojo/require!dojox/mobile/app/SceneController"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.StageController"); +dojo.experimental("dojox.mobile.app.StageController"); + +dojo.require("dojox.mobile.app.SceneController"); + +dojo.declare("dojox.mobile.app.StageController", null,{ + + // scenes: Array + // The list of scenes currently in existance in the app. + scenes: null, + + effect: "fade", + + constructor: function(node){ + this.domNode = node; + this.scenes = []; + + if(dojo.config.mobileAnim){ + this.effect = dojo.config.mobileAnim; + } + }, + + getActiveSceneController: function(){ + return this.scenes[this.scenes.length - 1]; + }, + + pushScene: function(sceneName, params){ + if(this._opInProgress){ + return; + } + this._opInProgress = true; + + // Push new scenes as the first element on the page. + var node = dojo.create("div", { + "class": "scene-wrapper", + style: { + visibility: "hidden" + } + }, this.domNode); + + var controller = new dojox.mobile.app.SceneController({}, node); + + if(this.scenes.length > 0){ + this.scenes[this.scenes.length -1].assistant.deactivate(); + } + + this.scenes.push(controller); + + var _this = this; + + dojo.forEach(this.scenes, this.setZIndex); + + controller.stageController = this; + + controller.init(sceneName, params).addCallback(function(){ + + if(_this.scenes.length == 1){ + controller.domNode.style.visibility = "visible"; + _this.scenes[_this.scenes.length - 1].assistant.activate(params); + _this._opInProgress = false; + }else{ + _this.scenes[_this.scenes.length - 2] + .performTransition( + _this.scenes[_this.scenes.length - 1].domNode, + 1, + _this.effect, + null, + function(){ + // When the scene is ready, activate it. + _this.scenes[_this.scenes.length - 1].assistant.activate(params); + _this._opInProgress = false; + }); + } + }); + }, + + setZIndex: function(controller, idx){ + dojo.style(controller.domNode, "zIndex", idx + 1); + }, + + popScene: function(data){ + // performTransition: function(/*String*/moveTo, /*Number*/dir, /*String*/transition, + // /*Object|null*/context, /*String|Function*/method /*optional args*/){ + if(this._opInProgress){ + return; + } + + var _this = this; + if(this.scenes.length > 1){ + + this._opInProgress = true; + this.scenes[_this.scenes.length - 2].assistant.activate(data); + this.scenes[_this.scenes.length - 1] + .performTransition( + _this.scenes[this.scenes.length - 2].domNode, + -1, + this.effect, + null, + function(){ + // When the scene is no longer visible, destroy it + _this._destroyScene(_this.scenes[_this.scenes.length - 1]); + _this.scenes.splice(_this.scenes.length - 1, 1); + _this._opInProgress = false; + }); + }else{ + console.log("cannot pop the scene if there is just one"); + } + }, + + popScenesTo: function(sceneName, data){ + if(this._opInProgress){ + return; + } + + while(this.scenes.length > 2 && + this.scenes[this.scenes.length - 2].sceneName != sceneName){ + this._destroyScene(this.scenes[this.scenes.length - 2]); + this.scenes.splice(this.scenes.length - 2, 1); + } + + this.popScene(data); + }, + + _destroyScene: function(scene){ + scene.assistant.deactivate(); + scene.assistant.destroy(); + scene.destroyRecursive(); + } + + +}); + + +}); + +}, +'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; + + // 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; + }); + + // 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; + }; + =====*/ + + return (dijit.place = { + // summary: + // Code to place a DOMNode relative to another DOMNode. + // Load using require(["dijit/place"], function(place){ ... }). + + at: function(node, pos, corners, padding){ + // summary: + // Positions one of the node's corners at specified position + // such that node is fully visible in viewport. + // description: + // NOTE: node is assumed to be absolutely or relatively positioned. + // node: DOMNode + // The node to position + // pos: dijit.place.__Position + // Object like {x: 10, y: 20} + // corners: String[] + // Array of Strings representing order to try corners in, like ["TR", "BL"]. + // Possible values are: + // * "BL" - bottom left + // * "BR" - bottom right + // * "TL" - top left + // * "TR" - top right + // padding: dijit.place.__Position? + // optional param to set padding, to put some buffer around the element you want to position. + // example: + // Try to place node's top right corner at (10,20). + // If that makes node go (partially) off screen, then try placing + // bottom left corner at (10,20). + // | place(node, {x: 10, y: 20}, ["TR", "BL"]) + var choices = array.map(corners, function(corner){ + var c = { corner: corner, pos: {x:pos.x,y:pos.y} }; + if(padding){ + c.pos.x += corner.charAt(1) == 'L' ? padding.x : -padding.x; + c.pos.y += corner.charAt(0) == 'T' ? padding.y : -padding.y; + } + return c; + }); + + return _place(node, choices); + }, + + around: function( + /*DomNode*/ node, + /*DomNode || dijit.place.__Rectangle*/ anchor, + /*String[]*/ positions, + /*Boolean*/ leftToRight, + /*Function?*/ layoutNode){ + + // summary: + // Position node adjacent or kitty-corner to anchor + // such that it's fully visible in viewport. + // + // description: + // Place node such that corner of node touches a corner of + // aroundNode, and that node is fully visible. + // + // anchor: + // Either a DOMNode or a __Rectangle (object with x, y, width, height). + // + // positions: + // Ordered list of positions to try matching up. + // * before: places drop down to the left of the anchor node/widget, or to the right in the case + // of RTL scripts like Hebrew and Arabic; aligns either the top of the drop down + // with the top of the anchor, or the bottom of the drop down with bottom of the anchor. + // * after: places drop down to the right of the anchor node/widget, or to the left in the case + // of RTL scripts like Hebrew and Arabic; aligns either the top of the drop down + // with the top of the anchor, or the bottom of the drop down with bottom of the anchor. + // * before-centered: centers drop down to the left of the anchor node/widget, or to the right + // in the case of RTL scripts like Hebrew and Arabic + // * after-centered: centers drop down to the right of the anchor node/widget, or to the left + // in the case of RTL scripts like Hebrew and Arabic + // * above-centered: drop down is centered above anchor node + // * above: drop down goes above anchor node, left sides aligned + // * above-alt: drop down goes above anchor node, right sides aligned + // * below-centered: drop down is centered above anchor node + // * below: drop down goes below anchor node + // * below-alt: drop down goes below anchor node, right sides aligned + // + // layoutNode: Function(node, aroundNodeCorner, nodeCorner) + // For things like tooltip, they are displayed differently (and have different dimensions) + // based on their orientation relative to the parent. This adjusts the popup based on orientation. + // + // leftToRight: + // True if widget is LTR, false if widget is RTL. Affects the behavior of "above" and "below" + // positions slightly. + // + // example: + // | placeAroundNode(node, aroundNode, {'BL':'TL', 'TR':'BR'}); + // This will try to position node such that node's top-left corner is at the same position + // as the bottom left corner of the aroundNode (ie, put node below + // aroundNode, with left edges aligned). If that fails it will try to put + // the bottom-right corner of node where the top right corner of aroundNode is + // (ie, put node above aroundNode, with right edges aligned) + // + + // if around is a DOMNode (or DOMNode id), convert to coordinates + var aroundNodePos = (typeof anchor == "string" || "offsetWidth" in anchor) + ? domGeometry.position(anchor, true) + : anchor; + + // 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); + } + }); + + var position = _place(node, choices, layoutNode, {w: width, h: height}); + position.aroundNodePos = aroundNodePos; + + return position; + } + }); +}); + +}, +'dojox/mobile/app/_event':function(){ +// wrapped by build app +define(["dijit","dojo","dojox"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app._event"); +dojo.experimental("dojox.mobile.app._event.js"); + +dojo.mixin(dojox.mobile.app, { + eventMap: {}, + + connectFlick: function(target, context, method){ + // summary: + // Listens for a flick event on a DOM node. If the mouse/touch + // moves more than 15 pixels in any given direction it is a flick. + // The synthetic event fired specifies the direction as + // <ul> + // <li><b>'ltr'</b> Left To Right</li> + // <li><b>'rtl'</b> Right To Left</li> + // <li><b>'ttb'</b> Top To Bottom</li> + // <li><b>'btt'</b> Bottom To Top</li> + // </ul> + // target: Node + // The DOM node to connect to + + var startX; + var startY; + var isFlick = false; + + var currentX; + var currentY; + + var connMove; + var connUp; + + var direction; + + var time; + + // Listen to to the mousedown/touchstart event + var connDown = dojo.connect("onmousedown", target, function(event){ + isFlick = false; + startX = event.targetTouches ? event.targetTouches[0].clientX : event.clientX; + startY = event.targetTouches ? event.targetTouches[0].clientY : event.clientY; + + time = (new Date()).getTime(); + + connMove = dojo.connect(target, "onmousemove", onMove); + connUp = dojo.connect(target, "onmouseup", onUp); + }); + + // The function that handles the mousemove/touchmove event + var onMove = function(event){ + dojo.stopEvent(event); + + currentX = event.targetTouches ? event.targetTouches[0].clientX : event.clientX; + currentY = event.targetTouches ? event.targetTouches[0].clientY : event.clientY; + if(Math.abs(Math.abs(currentX) - Math.abs(startX)) > 15){ + isFlick = true; + + direction = (currentX > startX) ? "ltr" : "rtl"; + }else if(Math.abs(Math.abs(currentY) - Math.abs(startY)) > 15){ + isFlick = true; + + direction = (currentY > startY) ? "ttb" : "btt"; + } + }; + + var onUp = function(event){ + dojo.stopEvent(event); + + connMove && dojo.disconnect(connMove); + connUp && dojo.disconnect(connUp); + + if(isFlick){ + var flickEvt = { + target: target, + direction: direction, + duration: (new Date()).getTime() - time + }; + if(context && method){ + context[method](flickEvt); + }else{ + method(flickEvt); + } + } + }; + + } +}); + +dojox.mobile.app.isIPhone = (dojo.isSafari + && (navigator.userAgent.indexOf("iPhone") > -1 || + navigator.userAgent.indexOf("iPod") > -1 + )); +dojox.mobile.app.isWebOS = (navigator.userAgent.indexOf("webOS") > -1); +dojox.mobile.app.isAndroid = (navigator.userAgent.toLowerCase().indexOf("android") > -1); + +if(dojox.mobile.app.isIPhone || dojox.mobile.app.isAndroid){ + // We are touchable. + // Override the dojo._connect function to replace mouse events with touch events + + dojox.mobile.app.eventMap = { + onmousedown: "ontouchstart", + mousedown: "ontouchstart", + onmouseup: "ontouchend", + mouseup: "ontouchend", + onmousemove: "ontouchmove", + mousemove: "ontouchmove" + }; + +} +dojo._oldConnect = dojo._connect; +dojo._connect = function(obj, event, context, method, dontFix){ + event = dojox.mobile.app.eventMap[event] || event; + if(event == "flick" || event == "onflick"){ + if(dojo.global["Mojo"]){ + event = Mojo.Event.flick; + } else{ + return dojox.mobile.app.connectFlick(obj, context, method); + } + } + + return dojo._oldConnect(obj, event, context, method, dontFix); +}; +}); + +}, +'dojox/mobile/_base':function(){ +define("dojox/mobile/_base", [ + "./common", + "./View", + "./Heading", + "./RoundRect", + "./RoundRectCategory", + "./EdgeToEdgeCategory", + "./RoundRectList", + "./EdgeToEdgeList", + "./ListItem", + "./Switch", + "./ToolBarButton", + "./ProgressIndicator" +], function(common, View, Heading, RoundRect, RoundRectCategory, EdgeToEdgeCategory, RoundRectList, EdgeToEdgeList, ListItem, Switch, ToolBarButton, ProgressIndicator){ + // module: + // dojox/mobile/_base + // summary: + // Includes the basic dojox.mobile modules + + return common; +}); + +}, +'dojox/mobile/Button':function(){ +define([ + "dojo/_base/array", + "dojo/_base/declare", + "dojo/dom-class", + "dojo/dom-construct", + "dijit/_WidgetBase", + "dijit/form/_ButtonMixin", + "dijit/form/_FormWidgetMixin" +], + function(array, declare, domClass, domConstruct, WidgetBase, ButtonMixin, FormWidgetMixin){ + + /*===== + WidgetBase = dijit._WidgetBase; + FormWidgetMixin = dijit.form._FormWidgetMixin; + ButtonMixin = dijit.form._ButtonMixin; + =====*/ + return declare("dojox.mobile.Button", [WidgetBase, FormWidgetMixin, ButtonMixin], { + // summary: + // Non-templated BUTTON widget with a thin API wrapper for click events and setting the label + // + // 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 dojoType="dijit.form.Button" onClick="...">Hello world</button> + + baseClass: "mblButton", + + // Override automatic assigning type --> node, it causes exception on IE. + // Instead, type must be specified as this.type when the node is created, as part of the original DOM + _setTypeAttr: null, + + // duration: Number + // duration of selection, milliseconds or -1 for no post-click CSS styling + duration: 1000, + + _onClick: function(e){ + var ret = this.inherited(arguments); + if(ret && this.duration >= 0){ // if its not a button with a state, then emulate press styles + var button = this.focusNode || this.domNode; + var newStateClasses = (this.baseClass+' '+this["class"]).split(" "); + newStateClasses = array.map(newStateClasses, function(c){ return c+"Selected"; }); + domClass.add(button, newStateClasses); + setTimeout(function(){ + domClass.remove(button, newStateClasses); + }, this.duration); + } + return ret; + }, + + isFocusable: function(){ return false; }, + + buildRendering: function(){ + if(!this.srcNodeRef){ + this.srcNodeRef = domConstruct.create("button", {"type": this.type}); + }else if(this._cv){ + var n = this.srcNodeRef.firstChild; + if(n && n.nodeType === 3){ + n.nodeValue = this._cv(n.nodeValue); + } + } + this.inherited(arguments); + this.focusNode = this.domNode; + }, + + postCreate: function(){ + this.inherited(arguments); + this.connect(this.domNode, "onclick", "_onClick"); + }, + + _setLabelAttr: function(/*String*/ content){ + this.inherited(arguments, [this._cv ? this._cv(content) : content]); + } + }); + +}); + +}, +'dojox/mobile/Switch':function(){ +define("dojox/mobile/Switch", [ + "dojo/_base/array", + "dojo/_base/connect", + "dojo/_base/declare", + "dojo/_base/event", + "dojo/_base/window", + "dojo/dom-class", + "dijit/_Contained", + "dijit/_WidgetBase", + "./sniff" +], function(array, connect, declare, event, win, domClass, Contained, WidgetBase, has){ + +/*===== + Contained = dijit._Contained; + WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/Switch + // summary: + // A toggle switch with a sliding knob. + + return declare("dojox.mobile.Switch", [WidgetBase, Contained],{ + // summary: + // A toggle switch with a sliding knob. + // description: + // Switch is a toggle switch with a sliding knob. You can either + // tap or slide the knob to toggle the switch. The onStateChanged + // handler is called when the switch is manipulated. + + // value: String + // The initial state of the switch. "on" or "off". The default + // value is "on". + value: "on", + + // name: String + // A name for a hidden input field, which holds the current value. + name: "", + + // leftLabel: String + // The left-side label of the switch. + leftLabel: "ON", + + // rightLabel: String + // The right-side label of the switch. + rightLabel: "OFF", + + /* internal properties */ + _width: 53, + + buildRendering: function(){ + this.domNode = win.doc.createElement("DIV"); + var c = (this.srcNodeRef && this.srcNodeRef.className) || this.className || this["class"]; + this._swClass = (c || "").replace(/ .*/,""); + this.domNode.className = "mblSwitch"; + var nameAttr = this.name ? " name=\"" + this.name + "\"" : ""; + this.domNode.innerHTML = + '<div class="mblSwitchInner">' + + '<div class="mblSwitchBg mblSwitchBgLeft">' + + '<div class="mblSwitchText mblSwitchTextLeft"></div>' + + '</div>' + + '<div class="mblSwitchBg mblSwitchBgRight">' + + '<div class="mblSwitchText mblSwitchTextRight"></div>' + + '</div>' + + '<div class="mblSwitchKnob"></div>' + + '<input type="hidden"'+nameAttr+'></div>' + + '</div>'; + var n = this.inner = this.domNode.firstChild; + this.left = n.childNodes[0]; + this.right = n.childNodes[1]; + this.knob = n.childNodes[2]; + this.input = n.childNodes[3]; + }, + + postCreate: function(){ + this.connect(this.domNode, "onclick", "onClick"); + this.connect(this.domNode, has("touch") ? "touchstart" : "onmousedown", "onTouchStart"); + this._initialValue = this.value; // for reset() + }, + + _changeState: function(/*String*/state, /*Boolean*/anim){ + var on = (state === "on"); + this.left.style.display = ""; + this.right.style.display = ""; + this.inner.style.left = ""; + if(anim){ + domClass.add(this.domNode, "mblSwitchAnimation"); + } + domClass.remove(this.domNode, on ? "mblSwitchOff" : "mblSwitchOn"); + domClass.add(this.domNode, on ? "mblSwitchOn" : "mblSwitchOff"); + + var _this = this; + setTimeout(function(){ + _this.left.style.display = on ? "" : "none"; + _this.right.style.display = !on ? "" : "none"; + domClass.remove(_this.domNode, "mblSwitchAnimation"); + }, anim ? 300 : 0); + }, + + startup: function(){ + if(this._swClass.indexOf("Round") != -1){ + var r = Math.round(this.domNode.offsetHeight / 2); + this.createRoundMask(this._swClass, r, this.domNode.offsetWidth); + } + }, + + createRoundMask: function(className, r, w){ + if(!has("webkit") || !className){ return; } + if(!this._createdMasks){ this._createdMasks = []; } + if(this._createdMasks[className]){ return; } + this._createdMasks[className] = 1; + + var ctx = win.doc.getCSSCanvasContext("2d", className+"Mask", w, 100); + ctx.fillStyle = "#000000"; + ctx.beginPath(); + ctx.moveTo(r, 0); + ctx.arcTo(0, 0, 0, 2*r, r); + ctx.arcTo(0, 2*r, r, 2*r, r); + ctx.lineTo(w - r, 2*r); + ctx.arcTo(w, 2*r, w, r, r); + ctx.arcTo(w, 0, w - r, 0, r); + ctx.closePath(); + ctx.fill(); + }, + + onClick: function(e){ + if(this._moved){ return; } + this.value = this.input.value = (this.value == "on") ? "off" : "on"; + this._changeState(this.value, true); + this.onStateChanged(this.value); + }, + + onTouchStart: function(e){ + // summary: + // Internal function to handle touchStart events. + this._moved = false; + this.innerStartX = this.inner.offsetLeft; + if(!this._conn){ + this._conn = []; + this._conn.push(connect.connect(this.inner, has("touch") ? "touchmove" : "onmousemove", this, "onTouchMove")); + this._conn.push(connect.connect(this.inner, has("touch") ? "touchend" : "onmouseup", this, "onTouchEnd")); + } + this.touchStartX = e.touches ? e.touches[0].pageX : e.clientX; + this.left.style.display = ""; + this.right.style.display = ""; + event.stop(e); + }, + + onTouchMove: function(e){ + // summary: + // Internal function to handle touchMove events. + e.preventDefault(); + var dx; + if(e.targetTouches){ + if(e.targetTouches.length != 1){ return false; } + dx = e.targetTouches[0].clientX - this.touchStartX; + }else{ + dx = e.clientX - this.touchStartX; + } + var pos = this.innerStartX + dx; + var d = 10; + if(pos <= -(this._width-d)){ pos = -this._width; } + if(pos >= -d){ pos = 0; } + this.inner.style.left = pos + "px"; + if(Math.abs(dx) > d){ + this._moved = true; + } + }, + + onTouchEnd: function(e){ + // summary: + // Internal function to handle touchEnd events. + array.forEach(this._conn, connect.disconnect); + this._conn = null; + if(this.innerStartX == this.inner.offsetLeft){ + if(has("touch")){ + var ev = win.doc.createEvent("MouseEvents"); + ev.initEvent("click", true, true); + this.inner.dispatchEvent(ev); + } + return; + } + var newState = (this.inner.offsetLeft < -(this._width/2)) ? "off" : "on"; + this._changeState(newState, true); + if(newState != this.value){ + this.value = this.input.value = newState; + this.onStateChanged(newState); + } + }, + + onStateChanged: function(/*String*/newState){ + // summary: + // Stub function to connect to from your application. + // description: + // Called when the state has been changed. + }, + + _setValueAttr: function(/*String*/value){ + this._changeState(value, false); + if(this.value != value){ + this.onStateChanged(value); + } + this.value = this.input.value = value; + }, + + _setLeftLabelAttr: function(/*String*/label){ + this.leftLabel = label; + this.left.firstChild.innerHTML = this._cv ? this._cv(label) : label; + }, + + _setRightLabelAttr: function(/*String*/label){ + this.rightLabel = label; + this.right.firstChild.innerHTML = this._cv ? this._cv(label) : label; + }, + + reset: function(){ + // summary: + // Reset the widget's value to what it was at initialization time + this.set("value", this._initialValue); + } + }); +}); + +}, +'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". + +/*===== + dijit.focus = { + // summary: + // Tracks the currently focused node, and which widgets are currently "active". + // Access via require(["dijit/focus"], function(focus){ ... }). + // + // A widget is considered active if it or a descendant widget has focus, + // or if a non-focusable node of this widget or a descendant was recently clicked. + // + // Call focus.watch("curNode", callback) to track the current focused DOMNode, + // or focus.watch("activeStack", callback) to track the currently focused stack of widgets. + // + // Call focus.on("widget-blur", func) or focus.on("widget-focus", ...) to monitor when + // when widgets become active/inactive + // + // Finally, focus(node) will focus a node, suppressing errors if the node doesn't exist. + + // curNode: DomNode + // Currently focused item on screen + curNode: null, + + // activeStack: dijit._Widget[] + // List of currently active widgets (focused widget and it's ancestors) + activeStack: [], + + 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. + } + }; +=====*/ + + var FocusManager = declare([Stateful, Evented], { + // curNode: DomNode + // Currently focused item on screen + curNode: null, + + // activeStack: dijit._Widget[] + // List of currently active widgets (focused widget and it's ancestors) + activeStack: [], + + constructor: function(){ + // Don't leave curNode/prevNode pointing to bogus elements + var check = lang.hitch(this, function(node){ + if(dom.isDescendant(this.curNode, node)){ + this.set("curNode", null); + } + if(dom.isDescendant(this.prevNode, node)){ + this.set("prevNode", null); + } + }); + aspect.before(domConstruct, "empty", check); + aspect.before(domConstruct, "destroy", check); + }, + + registerIframe: function(/*DomNode*/ iframe){ + // summary: + // Registers listeners on the specified iframe so that any click + // or focus event on that iframe (or anything in it) is reported + // as a focus/click event on the <iframe> itself. + // description: + // Currently only used by editor. + // returns: + // Handle with remove() method to deregister. + return this.registerWin(iframe.contentWindow, iframe); + }, + + registerWin: function(/*Window?*/targetWindow, /*DomNode?*/ effectiveNode){ + // summary: + // Registers listeners on the specified window (either the main + // window or an iframe's window) to detect when the user has clicked somewhere + // or focused somewhere. + // description: + // Users should call registerIframe() instead of this method. + // targetWindow: + // If specified this is the window associated with the iframe, + // i.e. iframe.contentWindow. + // effectiveNode: + // If specified, report any focus events inside targetWindow as + // an event on effectiveNode, rather than on evt.target. + // returns: + // Handle with remove() method to deregister. + + // TODO: make this function private in 2.0; Editor/users should call registerIframe(), + + var _this = this; + var mousedownListener = function(evt){ + _this._justMouseDowned = true; + setTimeout(function(){ _this._justMouseDowned = false; }, 0); + + // workaround weird IE bug where the click is on an orphaned node + // (first time clicking a Select/DropDownButton inside a TooltipDialog) + if(has("ie") && evt && evt.srcElement && evt.srcElement.parentNode == null){ + return; + } + + _this._onTouchNode(effectiveNode || evt.target || evt.srcElement, "mouse"); + }; + + // Listen for blur and focus events on targetWindow's document. + // 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; + } + + // 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); + }, + + _onTouchNode: function(/*DomNode*/ node, /*String*/ by){ + // summary: + // Callback when node is focused or mouse-downed + // node: + // The node that was touched. + // by: + // "mouse" if the focus/touch was caused by a mouse down event + + // ignore the recent blurNode event + if(this._clearActiveWidgetsTimer){ + clearTimeout(this._clearActiveWidgetsTimer); + delete this._clearActiveWidgetsTimer; + } + + // compute stack of active widgets (ex: ComboButton --> Menu --> MenuItem) + var newStack=[]; + try{ + while(node){ + var popupParent = domAttr.get(node, "dijitPopupParent"); + if(popupParent){ + node=registry.byId(popupParent).domNode; + }else if(node.tagName && node.tagName.toLowerCase() == "body"){ + // is this the root of the document or just the root of an iframe? + if(node === win.body()){ + // node is the root of the main document + break; + } + // otherwise, find the iframe this node refers to (can't access it via parentNode, + // need to do this trick instead). window.frameElement is supported in IE/FF/Webkit + node=winUtils.get(node.ownerDocument).frameElement; + }else{ + // if this node is the root node of a widget, then add widget id to stack, + // except ignore clicks on disabled widgets (actually focusing a disabled widget still works, + // to support MenuItem) + var id = node.getAttribute && node.getAttribute("widgetId"), + widget = id && registry.byId(id); + if(widget && !(by == "mouse" && widget.get("disabled"))){ + newStack.unshift(id); + } + node=node.parentNode; + } + } + }catch(e){ /* squelch */ } + + this._setStack(newStack, by); + }, + + _onFocusNode: function(/*DomNode*/ node){ + // summary: + // Callback when node is focused + + if(!node){ + return; + } + + if(node.nodeType == 9){ + // Ignore focus events on the document itself. This is here so that + // (for example) clicking the up/down arrows of a spinner + // (which don't get focus) won't cause that widget to blur. (FF issue) + return; + } + + 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*/} + } + } + }); + + var singleton = new FocusManager(); + + // 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; + }) + } + }); + + // 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]; + } + } + singleton.watch(function(attr, oldVal, newVal){ + dijit.focus[attr] = newVal; + }); + + return singleton; +}); + +}, +'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/main':function(){ +define("dijit/main", [ + "dojo/_base/kernel" +], function(dojo){ + // module: + // dijit + // summary: + // The dijit package main module + + return dojo.dijit; +}); + +}, +'dojox/mobile/RoundRect':function(){ +define("dojox/mobile/RoundRect", [ + "dojo/_base/array", + "dojo/_base/declare", + "dojo/_base/window", + "dijit/_Contained", + "dijit/_Container", + "dijit/_WidgetBase" +], function(array, declare, win, Contained, Container, WidgetBase){ + +/*===== + var Contained = dijit._Contained; + var Container = dijit._Container; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/RoundRect + // summary: + // A simple round rectangle container. + + return declare("dojox.mobile.RoundRect", [WidgetBase, Container, Contained], { + // summary: + // A simple round rectangle container. + // description: + // RoundRect is a simple round rectangle container for any HTML + // and/or widgets. You can achieve the same appearance by just + // applying the -webkit-border-radius style to a div tag. However, + // if you use RoundRect, you can get a round rectangle even on + // non-CSS3 browsers such as (older) IE. + + // shadow: Boolean + // If true, adds a shadow effect to the container element. + shadow: false, + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement("DIV"); + this.domNode.className = this.shadow ? "mblRoundRect mblShadow" : "mblRoundRect"; + }, + + resize: function(){ + // summary: + // Calls resize() of each child widget. + array.forEach(this.getChildren(), function(child){ + if(child.resize){ child.resize(); } + }); + } + }); +}); + +}, +'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 + +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); + + // label: HTML String + // Content to display in button. + label: "", + + // type: [const] String + // Type of button (submit, reset, button, checkbox, radio) + type: "button", + + _onClick: function(/*Event*/ e){ + // summary: + // Internal function to handle click actions + if(this.disabled){ + event.stop(e); + return false; + } + var preventDefault = this.onClick(e) === false; // user click actions + if(!preventDefault && this.type == "submit" && !(this.valueNode||this.focusNode).form){ // see if a non-form widget needs to be signalled + for(var node=this.domNode; node.parentNode; node=node.parentNode){ + var widget=registry.byNode(node); + if(widget && typeof widget._onSubmit == "function"){ + widget._onSubmit(e); + preventDefault = true; + break; + } + } + } + if(preventDefault){ + e.preventDefault(); + } + return !preventDefault; + }, + + postCreate: function(){ + this.inherited(arguments); + dom.setSelectable(this.focusNode, false); + }, + + onClick: function(/*Event*/ /*===== e =====*/){ + // summary: + // Callback for when button is clicked. + // If type="submit", return true to perform submit, or false to cancel it. + // type: + // callback + return true; // Boolean + }, + + _setLabelAttr: function(/*String*/ content){ + // summary: + // Hook for set('label', ...) to work. + // description: + // Set the label (text) of the button; takes an HTML string. + this._set("label", content); + (this.containerNode||this.focusNode).innerHTML = content; + } +}); + +}); + +}, +'dijit/_base/typematic':function(){ +define("dijit/_base/typematic", ["../typematic"], function(){ + // for back-compat, just loads top level module +}); + +}, +'dojox/mobile/RoundRectCategory':function(){ +define("dojox/mobile/RoundRectCategory", [ + "dojo/_base/declare", + "dojo/_base/window", + "dijit/_Contained", + "dijit/_WidgetBase" +], function(declare, win, Contained, WidgetBase){ + +/*===== + var Contained = dijit._Contained; + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/RoundRectCategory + // summary: + // A category header for a rounded rectangle list. + + return declare("dojox.mobile.RoundRectCategory", [WidgetBase, Contained],{ + // summary: + // A category header for a rounded rectangle list. + + // label: String + // A label text for the widget. + label: "", + + buildRendering: function(){ + this.domNode = this.containerNode = this.srcNodeRef || win.doc.createElement("H2"); + this.domNode.className = "mblRoundRectCategory"; + if(!this.label){ + this.label = this.domNode.innerHTML; + } + }, + + _setLabelAttr: function(/*String*/label){ + this.label = label; + this.domNode.innerHTML = this._cv ? this._cv(label) : label; + } + }); + +}); + +}, +'dojox/mobile/app/TextBox':function(){ +// wrapped by build app +define(["dijit","dojo","dojox","dojo/require!dojox/mobile/TextBox"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.TextBox"); +dojo.deprecated("dojox.mobile.app.TextBox is deprecated", "dojox.mobile.app.TextBox moved to dojox.mobile.TextBox", 1.8); + +dojo.require("dojox.mobile.TextBox"); + +dojox.mobile.app.TextBox = dojox.mobile.TextBox; +}); + +}, +'dojox/mobile/app/SceneAssistant':function(){ +// wrapped by build app +define(["dijit","dojo","dojox"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.SceneAssistant"); +dojo.experimental("dojox.mobile.app.SceneAssistant"); + +dojo.declare("dojox.mobile.app.SceneAssistant", null, { + // summary: + // The base class for all scene assistants. + + constructor: function(){ + + }, + + setup: function(){ + // summary: + // Called to set up the widget. The UI is not visible at this time + + }, + + activate: function(params){ + // summary: + // Called each time the scene becomes visible. This can be as a result + // of a new scene being created, or a subsequent scene being destroyed + // and control transferring back to this scene assistant. + // params: + // Optional paramters, only passed when a subsequent scene pops itself + // off the stack and passes back data. + }, + + deactivate: function(){ + // summary: + // Called each time the scene becomes invisible. This can be as a result + // of it being popped off the stack and destroyed, + // or another scene being created and pushed on top of it on the stack + }, + + destroy: function(){ + + var children = + dojo.query("> [widgetId]", this.containerNode).map(dijit.byNode); + dojo.forEach(children, function(child){ child.destroyRecursive(); }); + + this.disconnect(); + }, + + connect: function(obj, method, callback){ + if(!this._connects){ + this._connects = []; + } + this._connects.push(dojo.connect(obj, method, callback)); + }, + + disconnect: function(){ + dojo.forEach(this._connects, dojo.disconnect); + this._connects = []; + } +}); + + +}); + +}, +'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; +}); + +}, +'dojox/mobile/transition':function(){ +define([ + "dojo/_base/Deferred", + "dojo/_base/config" +], function(Deferred, config){ + /* summary: this is the wrapper module which load + * dojox/css3/transit conditionally. If mblCSS3Transition + * is set to 'dojox/css3/transit', it will be loaded as + * the module to conduct the view transition. + */ + if(config['mblCSS3Transition']){ + //require dojox/css3/transit and resolve it as the result of transitDeferred. + var transitDeferred = new Deferred(); + require([config['mblCSS3Transition']], function(transit){ + transitDeferred.resolve(transit); + }); + return transitDeferred; + } + return null; +}); + +}, +'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. + + 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); + }, + + getWaiRole: function(/*Element*/ elem){ + // summary: + // Gets the role for an element (which should be a wai role). + // returns: + // The role of elem or an empty string if elem + // does not have a role. + return lang.trim((domAttr.get(elem, "role") || "").replace("wairole:","")); + }, + + setWaiRole: function(/*Element*/ elem, /*String*/ role){ + // summary: + // Sets the role on an element. + // description: + // Replace existing role attribute with new role. + + domAttr.set(elem, "role", role); + }, + + removeWaiRole: function(/*Element*/ elem, /*String*/ role){ + // summary: + // Removes the specified role from an element. + // Removes role attribute if no specific role provided (for backwards compat.) + + var roleValue = domAttr.get(elem, "role"); + if(!roleValue){ return; } + if(role){ + var t = lang.trim((" " + roleValue + " ").replace(" " + role + " ", " ")); + domAttr.set(elem, "role", t); + }else{ + elem.removeAttribute("role"); + } + }, + + hasWaiState: function(/*Element*/ elem, /*String*/ state){ + // summary: + // Determines if an element has a given state. + // description: + // Checks for an attribute called "aria-"+state. + // returns: + // true if elem has a value for the given state and + // false if it does not. + + return elem.hasAttribute ? elem.hasAttribute("aria-"+state) : !!elem.getAttribute("aria-"+state); + }, + + getWaiState: function(/*Element*/ elem, /*String*/ state){ + // summary: + // Gets the value of a state on an element. + // description: + // Checks for an attribute called "aria-"+state. + // returns: + // The value of the requested state on elem + // or an empty string if elem has no value for state. + + return elem.getAttribute("aria-"+state) || ""; + }, + + setWaiState: function(/*Element*/ elem, /*String*/ state, /*String*/ value){ + // summary: + // Sets a state on an element. + // description: + // Sets an attribute called "aria-"+state. + + elem.setAttribute("aria-"+state, value); + }, + + removeWaiState: function(/*Element*/ elem, /*String*/ state){ + // summary: + // Removes a state from an element. + // description: + // Sets an attribute called "aria-"+state. + + elem.removeAttribute("aria-"+state); + } + }); + + return dijit; +}); + +}, +'dojo/window':function(){ +define(["./_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; +}); + +}, +'dojox/mobile/EdgeToEdgeList':function(){ +define("dojox/mobile/EdgeToEdgeList", [ + "dojo/_base/declare", + "./RoundRectList" +], function(declare, RoundRectList){ + +/*===== + var RoundRectList = dojox.mobile.RoundRectList; +=====*/ + + // module: + // dojox/mobile/EdgeToEdgeCategory + // summary: + // An edge-to-edge layout list. + + return declare("dojox.mobile.EdgeToEdgeList", RoundRectList, { + // summary: + // An edge-to-edge layout list. + // description: + // EdgeToEdgeList is an edge-to-edge layout list, which displays + // all items in equally sized rows. Each item must be + // dojox.mobile.ListItem. + + buildRendering: function(){ + this.inherited(arguments); + this.domNode.className = "mblEdgeToEdgeList"; + } + }); +}); + +}, +'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: + // 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 + }, + + hide: function(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. + // widget: dijit._WidgetBase + // The widget + }, + + open: function(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. + // args: dijit.popup.__OpenArgs + // Parameters + return {}; // Object specifying which position was chosen + }, + + close: function(popup){ + // summary: + // Close specified popup and any popups that it parented. + // If no popup is specified, closes all popups. + // widget: dijit._WidgetBase? + // The widget, optional + } + }; + =====*/ + + 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: [], + + // _beginZIndex: Number + // Z-index of the first popup. (If first popup opens other + // popups they get a higher z-index.) + _beginZIndex: 1000, + + _idGen: 1, + + _createWrapper: function(/*Widget*/ widget){ + // summary: + // Initialization for widgets that will be used as popups. + // Puts widget inside a wrapper DIV (if not already in one), + // and returns pointer to that wrapper DIV. + + var wrapper = widget._popupWrapper, + node = widget.domNode; + + if(!wrapper){ + // Create wrapper <div> for when this widget [in the future] will be used as a popup. + // This is done early because of IE bugs where creating/moving DOM nodes causes focus + // to go wonky, see tests/robot/Toolbar.html to reproduce + wrapper = domConstruct.create("div",{ + "class":"dijitPopup", + style:{ display: "none"}, + role: "presentation" + }, 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; + }, + + moveOffScreen: function(/*Widget*/ widget){ + // summary: + // Moves the popup widget off-screen. + // Do not use this method to hide popups when not in use, because + // that will create an accessibility issue: the offscreen popup is + // still in the tabbing order. + + // Create wrapper if not already there + var wrapper = this._createWrapper(widget); + + domStyle.set(wrapper, { + visibility: "hidden", + top: "-9999px", // prevent transient scrollbar causing misalign (#5776), and initial flash in upper left (#10111) + display: "" + }); + }, + + hide: function(/*Widget*/ widget){ + // summary: + // Hide this popup widget (until it is ready to be shown). + // Initialization for widgets that will be used as popups + // + // Also puts widget inside a wrapper DIV (if not already in one) + // + // If popup widget needs to layout it should + // do so when it is made visible, and popup._onShow() is called. + + // Create wrapper if not already there + var wrapper = this._createWrapper(widget); + + domStyle.set(wrapper, "display", "none"); + }, + + getTopPopup: function(){ + // summary: + // Compute the closest ancestor popup that's *not* a child of another popup. + // Ex: For a TooltipDialog with a button that spawns a tree of menus, find the popup of the button. + var stack = this._stack; + for(var pi=stack.length-1; pi > 0 && stack[pi].parent === stack[pi-1].widget; pi--){ + /* do nothing, just trying to get right value for pi */ + } + return stack[pi]; + }, + + open: function(/*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(); + } + } + }))); + + // watch for cancel/execute events on the popup and notify the caller + // (for a menu, "execute" means clicking an item) + if(widget.onCancel && args.onCancel){ + handlers.push(widget.on("cancel", args.onCancel)); + } + + handlers.push(widget.on(widget.onExecute ? "execute" : "change", lang.hitch(this, function(){ + var topPopup = this.getTopPopup(); + if(topPopup && topPopup.onExecute){ + topPopup.onExecute(); + } + }))); + + stack.push({ + widget: widget, + parent: args.parent, + onExecute: args.onExecute, + onCancel: args.onCancel, + onClose: args.onClose, + handlers: handlers + }); + + if(widget.onOpen){ + // TODO: in 2.0 standardize onShow() (used by StackContainer) and onOpen() (used here) + widget.onOpen(best); + } + + return best; + }, + + close: function(/*Widget?*/ popup){ + // summary: + // Close specified popup and any popups that it parented. + // If no popup is specified, closes all popups. + + var stack = this._stack; + + // Basically work backwards from the top of the stack closing popups + // until we hit the specified popup, but IIRC there was some issue where closing + // a popup would cause others to close too. Thus if we are trying to close B in [A,B,C] + // closing C might close B indirectly and then the while() condition will run where stack==[A]... + // so the while condition is constructed defensively. + while((popup && array.some(stack, function(elem){return elem.widget == popup;})) || + (!popup && stack.length)){ + var top = stack.pop(), + widget = top.widget, + onClose = top.onClose; + + if(widget.onClose){ + // TODO: in 2.0 standardize onHide() (used by StackContainer) and onClose() (used here) + widget.onClose(); + } + + var h; + while(h = top.handlers.pop()){ h.remove(); } + + // Hide the widget and it's wrapper unless it has already been destroyed in above onClose() etc. + if(widget && widget.domNode){ + this.hide(widget); + } + + if(onClose){ + onClose(); + } + } + } + }); + + return (dijit.popup = new PopupManager()); +}); + +}, +'dojox/mobile/uacss':function(){ +define("dojox/mobile/uacss", [ + "dojo/_base/kernel", + "dojo/_base/lang", + "dojo/_base/window", + "dojox/mobile/sniff" +], function(dojo, lang, win, has){ + win.doc.documentElement.className += lang.trim([ + has("bb") ? "dj_bb" : "", + has("android") ? "dj_android" : "", + has("iphone") ? "dj_iphone" : "", + has("ipod") ? "dj_ipod" : "", + has("ipad") ? "dj_ipad" : "" + ].join(" ").replace(/ +/g," ")); + return dojo; +}); + +}, +'dijit/_base/window':function(){ +define("dijit/_base/window", [ + "dojo/window", // windowUtils.get + ".." // export symbol to dijit +], function(windowUtils, dijit){ + // module: + // dijit/_base/window + // summary: + // Back compatibility module, new code should use windowUtils directly instead of using this module. + + dijit.getDocumentWindow = function(doc){ + return windowUtils.get(doc); + }; +}); + +}, +'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){ + +/*===== +var Stateful = dojo.Stateful; +=====*/ + +// module: +// dijit/_WidgetBase +// summary: +// Future base class for all Dijit widgets. + +// 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 + }); +} + +// Nested hash listing attributes for each tag, all strings in lowercase. +// ex: {"div": {"style": true, "tabindex" true}, "form": { ... +var tagAttrs = {}; +function getAttrs(obj){ + var ret = {}; + for(var attr in obj){ + ret[attr.toLowerCase()] = true; + } + return ret; +} + +function nonEmptyAttrToDom(attr){ + // summary: + // Returns a setter function that copies the attribute to this.domNode, + // or removes the attribute from this.domNode, depending on whether the + // value is defined or not. + return function(val){ + domAttr[val ? "set" : "remove"](this.domNode, attr, val); + this._set(attr, val); + }; +} + +return declare("dijit._WidgetBase", Stateful, { + // summary: + // Future base class for all Dijit widgets. + // description: + // Future base class for all Dijit widgets. + // _Widget extends this class adding support for various features needed by desktop. + // + // Provides stubs for widget lifecycle methods for subclasses to extend, like postMixInProperties(), buildRendering(), + // postCreate(), startup(), and destroy(), and also public API methods like set(), get(), and watch(). + // + // Widgets can provide custom setters/getters for widget attributes, which are called automatically by set(name, value). + // For an attribute XXX, define methods _setXXXAttr() and/or _getXXXAttr(). + // + // _setXXXAttr can also be a string/hash/array mapping from a widget attribute XXX to the widget's DOMNodes: + // + // - DOM node attribute + // | _setFocusAttr: {node: "focusNode", type: "attribute"} + // | _setFocusAttr: "focusNode" (shorthand) + // | _setFocusAttr: "" (shorthand, maps to this.domNode) + // Maps this.focus to this.focusNode.focus, or (last example) this.domNode.focus + // + // - DOM node innerHTML + // | _setTitleAttr: { node: "titleNode", type: "innerHTML" } + // Maps this.title to this.titleNode.innerHTML + // + // - DOM node innerText + // | _setTitleAttr: { node: "titleNode", type: "innerText" } + // Maps this.title to this.titleNode.innerText + // + // - DOM node CSS class + // | _setMyClassAttr: { node: "domNode", type: "class" } + // Maps this.myClass to this.domNode.className + // + // If the value of _setXXXAttr is an array, then each element in the array matches one of the + // formats of the above list. + // + // If the custom setter is null, no action is performed other than saving the new value + // in the widget (in this). + // + // If no custom setter is defined for an attribute, then it will be copied + // to this.focusNode (if the widget defines a focusNode), or this.domNode otherwise. + // That's only done though for attributes that match DOMNode attributes (title, + // alt, aria-labelledby, etc.) + + // id: [const] String + // A unique, opaque ID string that can be assigned by users or by the + // system. If the developer passes an ID which is known not to be + // unique, the specified ID is ignored and the system-generated ID is + // used instead. + id: "", + _setIdAttr: "domNode", // to copy to this.domNode even for auto-generated id's + + // lang: [const] String + // Rarely used. Overrides the default Dojo locale used to render this widget, + // as defined by the [HTML LANG](http://www.w3.org/TR/html401/struct/dirlang.html#adef-lang) attribute. + // Value must be among the list of locales specified during by the Dojo bootstrap, + // formatted according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt) (like en-us). + lang: "", + // set on domNode even when there's a focus node. but don't set lang="", since that's invalid. + _setLangAttr: nonEmptyAttrToDom("lang"), + + // dir: [const] String + // Bi-directional support, as defined by the [HTML DIR](http://www.w3.org/TR/html401/struct/dirlang.html#adef-dir) + // attribute. Either left-to-right "ltr" or right-to-left "rtl". If undefined, widgets renders in page's + // default direction. + dir: "", + // set on domNode even when there's a focus node. but don't set dir="", since that's invalid. + _setDirAttr: nonEmptyAttrToDom("dir"), // to set on domNode even when there's a focus node + + // textDir: String + // Bi-directional support, the main variable which is responsible for the direction of the text. + // The text direction can be different than the GUI direction by using this parameter in creation + // of a widget. + // Allowed values: + // 1. "ltr" + // 2. "rtl" + // 3. "auto" - contextual the direction of a text defined by first strong letter. + // By default is as the page direction. + textDir: "", + + // class: String + // HTML class attribute + "class": "", + _setClassAttr: { node: "domNode", type: "class" }, + + // style: String||Object + // HTML style attributes as cssText string or name/value hash + style: "", + + // title: String + // HTML title attribute. + // + // For form widgets this specifies a tooltip to display when hovering over + // the widget (just like the native HTML title attribute). + // + // For TitlePane or for when this widget is a child of a TabContainer, AccordionContainer, + // etc., it's used to specify the tab label, accordion pane title, etc. + title: "", + + // tooltip: String + // When this widget's title attribute is used to for a tab label, accordion pane title, etc., + // this specifies the tooltip to appear when the mouse is hovered over that text. + tooltip: "", + + // baseClass: [protected] String + // Root CSS class of the widget (ex: dijitTextBox), used to construct CSS classes to indicate + // widget state. + baseClass: "", + + // srcNodeRef: [readonly] DomNode + // pointer to original DOM node + srcNodeRef: null, + + // domNode: [readonly] DomNode + // This is our visible representation of the widget! Other DOM + // Nodes may by assigned to other properties, usually through the + // template system's data-dojo-attach-point syntax, but the domNode + // property is the canonical "top level" node in widget UI. + domNode: null, + + // containerNode: [readonly] DomNode + // Designates where children of the source DOM node will be placed. + // "Children" in this case refers to both DOM nodes and widgets. + // For example, for myWidget: + // + // | <div data-dojo-type=myWidget> + // | <b> here's a plain DOM node + // | <span data-dojo-type=subWidget>and a widget</span> + // | <i> and another plain DOM node </i> + // | </div> + // + // containerNode would point to: + // + // | <b> here's a plain DOM node + // | <span data-dojo-type=subWidget>and a widget</span> + // | <i> and another plain DOM node </i> + // + // In templated widgets, "containerNode" is set via a + // data-dojo-attach-point assignment. + // + // containerNode must be defined for any widget that accepts innerHTML + // (like ContentPane or BorderContainer or even Button), and conversely + // is null for widgets that don't, like TextBox. + containerNode: null, + +/*===== + // _started: Boolean + // startup() has completed. + _started: false, +=====*/ + + // attributeMap: [protected] Object + // Deprecated. Instead of attributeMap, widget should have a _setXXXAttr attribute + // for each XXX attribute to be mapped to the DOM. + // + // attributeMap sets up a "binding" between attributes (aka properties) + // of the widget and the widget's DOM. + // Changes to widget attributes listed in attributeMap will be + // reflected into the DOM. + // + // For example, calling set('title', 'hello') + // on a TitlePane will automatically cause the TitlePane's DOM to update + // with the new title. + // + // attributeMap is a hash where the key is an attribute of the widget, + // and the value reflects a binding to a: + // + // - DOM node attribute + // | focus: {node: "focusNode", type: "attribute"} + // Maps this.focus to this.focusNode.focus + // + // - DOM node innerHTML + // | title: { node: "titleNode", type: "innerHTML" } + // Maps this.title to this.titleNode.innerHTML + // + // - DOM node innerText + // | title: { node: "titleNode", type: "innerText" } + // Maps this.title to this.titleNode.innerText + // + // - DOM node CSS class + // | myClass: { node: "domNode", type: "class" } + // Maps this.myClass to this.domNode.className + // + // If the value is an array, then each element in the array matches one of the + // formats of the above list. + // + // There are also some shorthands for backwards compatibility: + // - string --> { node: string, type: "attribute" }, for example: + // | "focusNode" ---> { node: "focusNode", type: "attribute" } + // - "" --> { node: "domNode", type: "attribute" } + attributeMap: {}, + + // _blankGif: [protected] String + // Path to a blank 1x1 image. + // Used by <img> nodes in templates that really get their image via CSS background-image. + _blankGif: config.blankGif || require.toUrl("dojo/resources/blank.gif"), + + //////////// INITIALIZATION METHODS /////////////////////////////////////// + + postscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){ + // summary: + // Kicks off widget instantiation. See create() for details. + // tags: + // private + this.create(params, srcNodeRef); + }, + + 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 + + // store pointer to original DOM tree + this.srcNodeRef = dom.byId(srcNodeRef); + + // For garbage collection. An array of listener handles returned by this.connect() / this.subscribe() + this._connects = []; + + // For widgets internal to this widget, invisible to calling code + this._supportingWidgets = []; + + // this is here for back-compat, remove in 2.0 (but check NodeList-instantiate.html test) + if(this.srcNodeRef && (typeof this.srcNodeRef.id == "string")){ this.id = this.srcNodeRef.id; } + + // mix in our passed parameters + if(params){ + this.params = params; + lang.mixin(this, params); + } + this.postMixInProperties(); + + // generate an id for the widget if one wasn't specified + // (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); + + 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); + } + } + + 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; + } + + 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 + }, + + buildRendering: function(){ + // summary: + // Construct the UI for this widget, setting this.domNode. + // Most widgets will mixin `dijit._TemplatedMixin`, which implements this method. + // tags: + // protected + + if(!this.domNode){ + // Create root node if it wasn't created by _Templated + this.domNode = this.srcNodeRef || domConstruct.create('div'); + } + + // baseClass is a single class name or occasionally a space-separated list of names. + // Add those classes to the DOMNode. If RTL mode then also add with Rtl suffix. + // TODO: make baseClass custom setter + if(this.baseClass){ + var classes = this.baseClass.split(" "); + if(!this.isLeftToRight()){ + classes = classes.concat( array.map(classes, function(name){ return name+"Rtl"; })); + } + domClass.add(this.domNode, classes); + } + }, + + postCreate: function(){ + // summary: + // Processing after the DOM fragment is created + // description: + // Called after the DOM fragment has been created, but not necessarily + // added to the document. Do not include any operations which rely on + // node dimensions or placement. + // tags: + // protected + }, + + startup: function(){ + // summary: + // Processing after the DOM fragment is added to the document + // description: + // Called after a widget and its children have been created and added to the page, + // and all related widgets have finished their create() cycle, up through postCreate(). + // This is useful for composite widgets that need to control or layout sub-widgets. + // Many layout widgets can use this as a wiring phase. + if(this._started){ return; } + this._started = true; + array.forEach(this.getChildren(), function(obj){ + if(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){ + obj.startup(); + obj._started = true; + } + }); + }, + + //////////// DESTROY FUNCTIONS //////////////////////////////// + + destroyRecursive: function(/*Boolean?*/ preserveDom){ + // summary: + // Destroy this widget and its descendants + // description: + // This is the generic "destructor" function that all widget users + // should call to cleanly discard with a widget. Once a widget is + // destroyed, it is removed from the manager object. + // preserveDom: + // If true, this method will leave the original DOM structure + // alone of descendant Widgets. Note: This will NOT work with + // dijit._Templated widgets. + + this._beingDestroyed = true; + this.destroyDescendants(preserveDom); + this.destroy(preserveDom); + }, + + destroy: function(/*Boolean*/ preserveDom){ + // summary: + // Destroy this widget, but not its descendants. + // This method will, however, destroy internal widgets such as those used within a template. + // preserveDom: Boolean + // If true, this method will leave the original DOM structure alone. + // Note: This will not yet work with _Templated widgets + + this._beingDestroyed = true; + this.uninitialize(); + + // remove this.connect() and this.subscribe() listeners + var c; + while(c = this._connects.pop()){ + c.remove(); + } + + // 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(); + } + } + + this.destroyRendering(preserveDom); + registry.remove(this.id); + this._destroyed = true; + }, + + destroyRendering: function(/*Boolean?*/ preserveDom){ + // summary: + // Destroys the DOM nodes associated with this widget + // preserveDom: + // If true, this method will leave the original DOM structure alone + // during tear-down. Note: this will not work with _Templated + // widgets yet. + // tags: + // protected + + if(this.bgIframe){ + this.bgIframe.destroy(preserveDom); + delete this.bgIframe; + } + + if(this.domNode){ + if(preserveDom){ + domAttr.remove(this.domNode, "widgetId"); + }else{ + domConstruct.destroy(this.domNode); + } + delete this.domNode; + } + + if(this.srcNodeRef){ + if(!preserveDom){ + domConstruct.destroy(this.srcNodeRef); + } + delete this.srcNodeRef; + } + }, + + destroyDescendants: function(/*Boolean?*/ preserveDom){ + // summary: + // Recursively destroy the children of this widget and their + // descendants. + // preserveDom: + // If true, the preserveDom attribute is passed to all descendant + // widget's .destroy() method. Not for use with _Templated + // widgets. + + // get all direct descendants and destroy them recursively + array.forEach(this.getChildren(), function(widget){ + if(widget.destroyRecursive){ + widget.destroyRecursive(preserveDom); + } + }); + }, + + uninitialize: function(){ + // summary: + // Stub function. Override to implement custom widget tear-down + // behavior. + // tags: + // protected + return false; + }, + + ////////////////// GET/SET, CUSTOM SETTERS, ETC. /////////////////// + + _setStyleAttr: function(/*String||Object*/ value){ + // summary: + // Sets the style attribute of the widget according to value, + // which is either a hash like {height: "5px", width: "3px"} + // or a plain string + // description: + // Determines which node to set the style on based on style setting + // in attributeMap. + // tags: + // protected + + var mapNode = this.domNode; + + // Note: technically we should revert any style setting made in a previous call + // to his method, but that's difficult to keep track of. + + if(lang.isObject(value)){ + domStyle.set(mapNode, value); + }else{ + if(mapNode.style.cssText){ + mapNode.style.cssText += "; " + value; + }else{ + mapNode.style.cssText = value; + } + } + + this._set("style", value); + }, + + _attrToDom: function(/*String*/ attr, /*String*/ value, /*Object?*/ commands){ + // summary: + // Reflect a widget attribute (title, tabIndex, duration etc.) to + // the widget DOM, as specified by commands parameter. + // If commands isn't specified then it's looked up from attributeMap. + // Note some attributes like "type" + // cannot be processed this way as they are not mutable. + // + // tags: + // private + + commands = arguments.length >= 3 ? commands : this.attributeMap[attr]; + + array.forEach(lang.isArray(commands) ? commands : [commands], function(command){ + + // Get target node and what we are doing to that node + var mapNode = this[command.node || command || "domNode"]; // DOM node + var type = command.type || "attribute"; // class, innerHTML, innerText, or attribute + + switch(type){ + case "attribute": + if(lang.isFunction(value)){ // functions execute in the context of the widget + value = lang.hitch(this, value); + } + + // Get the name of the DOM node attribute; usually it's the same + // as the name of the attribute in the widget (attr), but can be overridden. + // Also maps handler names to lowercase, like onSubmit --> onsubmit + var attrName = command.attribute ? command.attribute : + (/^on[A-Z][a-zA-Z]*$/.test(attr) ? attr.toLowerCase() : attr); + + 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)` + + 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; + }, + + _attrPairNames: {}, // shared between all widgets + _getAttrNames: function(name){ + // summary: + // Helper function for get() and set(). + // Caches attribute name values so we don't do the string ops every time. + // tags: + // private + + var apn = this._attrPairNames; + if(apn[name]){ return apn[name]; } + var uc = name.replace(/^[a-z]|-[a-zA-Z]/g, function(c){ return c.charAt(c.length-1).toUpperCase(); }); + return (apn[name] = { + n: name+"Node", + s: "_set"+uc+"Attr", // converts dashes to camel case, ex: accept-charset --> _setAcceptCharsetAttr + g: "_get"+uc+"Attr", + l: uc.toLowerCase() // lowercase name w/out dashes, ex: acceptcharset + }); + }, + + _set: function(/*String*/ name, /*anything*/ value){ + // summary: + // Helper function to set new value for specified attribute, and call handlers + // registered with watch() if the value has changed. + var oldValue = this[name]; + this[name] = value; + if(this._watchCallbacks && this._created && value !== oldValue){ + this._watchCallbacks(name, oldValue, value); + } + }, + + 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))`. + + return aspect.after(this, this._onMap(type), func, true); + }, + + _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 + }, + + toString: function(){ + // summary: + // Returns a string that represents the widget + // description: + // When a widget is cast to a string, this method will be used to generate the + // output. Currently, it does not implement any sort of reversible + // serialization. + return '[Widget ' + this.declaredClass + ', ' + (this.id || 'NO ID') + ']'; // String + }, + + getChildren: function(){ + // summary: + // Returns all the widgets contained by this, i.e., all widgets underneath this.containerNode. + // Does not return nested widgets, nor widgets that are part of this widget's template. + return this.containerNode ? registry.findWidgets(this.containerNode) : []; // dijit._Widget[] + }, + + getParent: function(){ + // summary: + // Returns the parent widget of this widget + return registry.getEnclosingWidget(this.domNode.parentNode); + }, + + connect: function( + /*Object|null*/ obj, + /*String|Function*/ event, + /*String|Function*/ method){ + // summary: + // 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 + + var handle = connect.connect(obj, event, this, method); + this._connects.push(handle); + return handle; // _Widget.Handle + }, + + disconnect: function(handle){ + // summary: + // 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. + // + // 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 possessing + // an addChild method. + // + // 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 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(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(reference.declaredClass && reference.addChild){ + reference.addChild(this, position); + }else{ + domConstruct.place(this.domNode, reference, position); + } + return this; + }, + + getTextDir: function(/*String*/ text,/*String*/ originalDir){ + // summary: + // Return direction of the text. + // The function overridden in the _BidiSupport module, + // its main purpose is to calculate the direction of the + // text, if was defined by the programmer through textDir. + // tags: + // protected. + return originalDir; + }, + + applyTextDir: function(/*===== element, text =====*/){ + // summary: + // The function overridden in the _BidiSupport module, + // originally used for setting element.dir according to this.textDir. + // In this case does nothing. + // element: DOMNode + // text: String + // tags: + // protected. + } +}); + +}); + +}, +'dojox/mobile/app/AlertDialog':function(){ +// wrapped by build app +define(["dijit","dojo","dojox","dojo/require!dijit/_WidgetBase"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.AlertDialog"); +dojo.experimental("dojox.mobile.app.AlertDialog"); +dojo.require("dijit._WidgetBase"); + +dojo.declare("dojox.mobile.app.AlertDialog", dijit._WidgetBase, { + + // title: String + // The title of the AlertDialog + title: "", + + // text: String + // The text message displayed in the AlertDialog + text: "", + + // controller: Object + // The SceneController for the currently active scene + controller: null, + + // buttons: Array + buttons: null, + + defaultButtonLabel: "OK", + + // onChoose: Function + // The callback function that is invoked when a button is tapped. + // If the dialog is cancelled, no parameter is passed to this function. + onChoose: null, + + constructor: function(){ + this.onClick = dojo.hitch(this, this.onClick); + this._handleSelect = dojo.hitch(this, this._handleSelect); + }, + + buildRendering: function(){ + this.domNode = dojo.create("div",{ + "class": "alertDialog" + }); + + // Create the outer dialog body + var dlgBody = dojo.create("div", {"class": "alertDialogBody"}, this.domNode); + + // Create the title + dojo.create("div", {"class": "alertTitle", innerHTML: this.title || ""}, dlgBody); + + // Create the text + dojo.create("div", {"class": "alertText", innerHTML: this.text || ""}, dlgBody); + + // Create the node that encapsulates all the buttons + var btnContainer = dojo.create("div", {"class": "alertBtns"}, dlgBody); + + // If no buttons have been defined, default to a single button saying OK + if(!this.buttons || this.buttons.length == 0){ + this.buttons = [{ + label: this.defaultButtonLabel, + value: "ok", + "class": "affirmative" + }]; + } + + var _this = this; + + // Create each of the buttons + dojo.forEach(this.buttons, function(btnInfo){ + var btn = new dojox.mobile.Button({ + btnClass: btnInfo["class"] || "", + label: btnInfo.label + }); + btn._dialogValue = btnInfo.value; + dojo.place(btn.domNode, btnContainer); + _this.connect(btn, "onClick", _this._handleSelect); + }); + + var viewportSize = this.controller.getWindowSize(); + + // Create the mask that blocks out the rest of the screen + this.mask = dojo.create("div", {"class": "dialogUnderlayWrapper", + innerHTML: "<div class=\"dialogUnderlay\"></div>", + style: { + width: viewportSize.w + "px", + height: viewportSize.h + "px" + } + }, this.controller.assistant.domNode); + + this.connect(this.mask, "onclick", function(){ + _this.onChoose && _this.onChoose(); + _this.hide(); + }); + }, + + postCreate: function(){ + this.subscribe("/dojox/mobile/app/goback", this._handleSelect); + }, + + _handleSelect: function(event){ + // summary: + // Handle the selection of a value + var node; + console.log("handleSelect"); + if(event && event.target){ + node = event.target; + + // Find the widget that was tapped. + while(!dijit.byNode(node)){ + node - node.parentNode; + } + } + + // If an onChoose function was provided, tell it what button + // value was chosen + if(this.onChoose){ + this.onChoose(node ? dijit.byNode(node)._dialogValue: undefined); + } + // Hide the dialog + this.hide(); + }, + + show: function(){ + // summary: + // Show the dialog + this._doTransition(1); + }, + + hide: function(){ + // summary: + // Hide the dialog + this._doTransition(-1); + }, + + _doTransition: function(dir){ + // summary: + // Either shows or hides the dialog. + // dir: + // An integer. If positive, the dialog is shown. If negative, + // the dialog is hidden. + + // TODO: replace this with CSS transitions + + var anim; + var h = dojo.marginBox(this.domNode.firstChild).h; + + + var bodyHeight = this.controller.getWindowSize().h; + console.log("dialog height = " + h, " body height = " + bodyHeight); + + var high = bodyHeight - h; + var low = bodyHeight; + + var anim1 = dojo.fx.slideTo({ + node: this.domNode, + duration: 400, + top: {start: dir < 0 ? high : low, end: dir < 0 ? low: high} + }); + + var anim2 = dojo[dir < 0 ? "fadeOut" : "fadeIn"]({ + node: this.mask, + duration: 400 + }); + + var anim = dojo.fx.combine([anim1, anim2]); + + var _this = this; + + dojo.connect(anim, "onEnd", this, function(){ + if(dir < 0){ + _this.domNode.style.display = "none"; + dojo.destroy(_this.domNode); + dojo.destroy(_this.mask); + } + }); + anim.play(); + }, + + destroy: function(){ + this.inherited(arguments); + dojo.destroy(this.mask); + }, + + + onClick: function(){ + + } +}); +}); + +}}}); + +require(["dojo/i18n"], function(i18n){ +i18n._preloadLocalizations("dojox/mobile/nls/app", []); +}); +define("dojox/mobile/app", [ + "./app/_base" +], function(appBase){ + return appBase; +}); diff --git a/js/dojo/dojox/mobile/app/AlertDialog.js b/js/dojo/dojox/mobile/app/AlertDialog.js new file mode 100644 index 0000000..2b4b738 --- /dev/null +++ b/js/dojo/dojox/mobile/app/AlertDialog.js @@ -0,0 +1,186 @@ +//>>built +// wrapped by build app +define("dojox/mobile/app/AlertDialog", ["dijit","dojo","dojox","dojo/require!dijit/_WidgetBase"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.AlertDialog"); +dojo.experimental("dojox.mobile.app.AlertDialog"); +dojo.require("dijit._WidgetBase"); + +dojo.declare("dojox.mobile.app.AlertDialog", dijit._WidgetBase, { + + // title: String + // The title of the AlertDialog + title: "", + + // text: String + // The text message displayed in the AlertDialog + text: "", + + // controller: Object + // The SceneController for the currently active scene + controller: null, + + // buttons: Array + buttons: null, + + defaultButtonLabel: "OK", + + // onChoose: Function + // The callback function that is invoked when a button is tapped. + // If the dialog is cancelled, no parameter is passed to this function. + onChoose: null, + + constructor: function(){ + this.onClick = dojo.hitch(this, this.onClick); + this._handleSelect = dojo.hitch(this, this._handleSelect); + }, + + buildRendering: function(){ + this.domNode = dojo.create("div",{ + "class": "alertDialog" + }); + + // Create the outer dialog body + var dlgBody = dojo.create("div", {"class": "alertDialogBody"}, this.domNode); + + // Create the title + dojo.create("div", {"class": "alertTitle", innerHTML: this.title || ""}, dlgBody); + + // Create the text + dojo.create("div", {"class": "alertText", innerHTML: this.text || ""}, dlgBody); + + // Create the node that encapsulates all the buttons + var btnContainer = dojo.create("div", {"class": "alertBtns"}, dlgBody); + + // If no buttons have been defined, default to a single button saying OK + if(!this.buttons || this.buttons.length == 0){ + this.buttons = [{ + label: this.defaultButtonLabel, + value: "ok", + "class": "affirmative" + }]; + } + + var _this = this; + + // Create each of the buttons + dojo.forEach(this.buttons, function(btnInfo){ + var btn = new dojox.mobile.Button({ + btnClass: btnInfo["class"] || "", + label: btnInfo.label + }); + btn._dialogValue = btnInfo.value; + dojo.place(btn.domNode, btnContainer); + _this.connect(btn, "onClick", _this._handleSelect); + }); + + var viewportSize = this.controller.getWindowSize(); + + // Create the mask that blocks out the rest of the screen + this.mask = dojo.create("div", {"class": "dialogUnderlayWrapper", + innerHTML: "<div class=\"dialogUnderlay\"></div>", + style: { + width: viewportSize.w + "px", + height: viewportSize.h + "px" + } + }, this.controller.assistant.domNode); + + this.connect(this.mask, "onclick", function(){ + _this.onChoose && _this.onChoose(); + _this.hide(); + }); + }, + + postCreate: function(){ + this.subscribe("/dojox/mobile/app/goback", this._handleSelect); + }, + + _handleSelect: function(event){ + // summary: + // Handle the selection of a value + var node; + console.log("handleSelect"); + if(event && event.target){ + node = event.target; + + // Find the widget that was tapped. + while(!dijit.byNode(node)){ + node - node.parentNode; + } + } + + // If an onChoose function was provided, tell it what button + // value was chosen + if(this.onChoose){ + this.onChoose(node ? dijit.byNode(node)._dialogValue: undefined); + } + // Hide the dialog + this.hide(); + }, + + show: function(){ + // summary: + // Show the dialog + this._doTransition(1); + }, + + hide: function(){ + // summary: + // Hide the dialog + this._doTransition(-1); + }, + + _doTransition: function(dir){ + // summary: + // Either shows or hides the dialog. + // dir: + // An integer. If positive, the dialog is shown. If negative, + // the dialog is hidden. + + // TODO: replace this with CSS transitions + + var anim; + var h = dojo.marginBox(this.domNode.firstChild).h; + + + var bodyHeight = this.controller.getWindowSize().h; + console.log("dialog height = " + h, " body height = " + bodyHeight); + + var high = bodyHeight - h; + var low = bodyHeight; + + var anim1 = dojo.fx.slideTo({ + node: this.domNode, + duration: 400, + top: {start: dir < 0 ? high : low, end: dir < 0 ? low: high} + }); + + var anim2 = dojo[dir < 0 ? "fadeOut" : "fadeIn"]({ + node: this.mask, + duration: 400 + }); + + var anim = dojo.fx.combine([anim1, anim2]); + + var _this = this; + + dojo.connect(anim, "onEnd", this, function(){ + if(dir < 0){ + _this.domNode.style.display = "none"; + dojo.destroy(_this.domNode); + dojo.destroy(_this.mask); + } + }); + anim.play(); + }, + + destroy: function(){ + this.inherited(arguments); + dojo.destroy(this.mask); + }, + + + onClick: function(){ + + } +}); +}); diff --git a/js/dojo/dojox/mobile/app/ImageThumbView.js b/js/dojo/dojox/mobile/app/ImageThumbView.js new file mode 100644 index 0000000..045385a --- /dev/null +++ b/js/dojo/dojox/mobile/app/ImageThumbView.js @@ -0,0 +1,393 @@ +//>>built +// wrapped by build app +define("dojox/mobile/app/ImageThumbView", ["dijit","dojo","dojox","dojo/require!dijit/_WidgetBase,dojo/string"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.ImageThumbView"); +dojo.experimental("dojox.mobile.app.ImageThumbView"); + +dojo.require("dijit._WidgetBase"); +dojo.require("dojo.string"); + +dojo.declare("dojox.mobile.app.ImageThumbView", dijit._WidgetBase, { + // summary: + // An image thumbnail gallery + + // items: Array + // The data items from which the image urls are retrieved. + // If an item is a string, it is expected to be a URL. Otherwise + // by default it is expected to have a 'url' member. This can + // be configured using the 'urlParam' attribute on this widget. + items: [], + + // urlParam: String + // The paramter name used to retrieve an image url from a JSON object + urlParam: "url", + + labelParam: null, + + itemTemplate: '<div class="mblThumbInner">' + + '<div class="mblThumbOverlay"></div>' + + '<div class="mblThumbMask">' + + '<div class="mblThumbSrc" style="background-image:url(${url})"></div>' + + '</div>' + + '</div>', + + minPadding: 4, + + maxPerRow: 3, + + maxRows: -1, + + baseClass: "mblImageThumbView", + + thumbSize: "medium", + + animationEnabled: true, + + selectedIndex: -1, + + cache: null, + + cacheMustMatch: false, + + clickEvent: "onclick", + + cacheBust: false, + + disableHide: false, + + constructor: function(params, node){ + }, + + postCreate: function(){ + + this.inherited(arguments); + var _this = this; + + var hoverCls = "mblThumbHover"; + + this.addThumb = dojo.hitch(this, this.addThumb); + this.handleImgLoad = dojo.hitch(this, this.handleImgLoad); + this.hideCached = dojo.hitch(this, this.hideCached); + + this._onLoadImages = {}; + + this.cache = []; + this.visibleImages = []; + + this._cacheCounter = 0; + + this.connect(this.domNode, this.clickEvent, function(event){ + var itemNode = _this._getItemNodeFromEvent(event); + + if(itemNode && !itemNode._cached){ + _this.onSelect(itemNode._item, itemNode._index, _this.items); + dojo.query(".selected", this.domNode).removeClass("selected"); + dojo.addClass(itemNode, "selected"); + } + }); + + dojo.addClass(this.domNode, this.thumbSize); + + this.resize(); + this.render(); + }, + + onSelect: function(item, index, items){ + // summary: + // Dummy function that is triggered when an image is selected. + }, + + _setAnimationEnabledAttr: function(value){ + this.animationEnabled = value; + dojo[value ? "addClass" : "removeClass"](this.domNode, "animated"); + }, + + _setItemsAttr: function(items){ + this.items = items || []; + + var urls = {}; + var i; + for(i = 0; i < this.items.length; i++){ + urls[this.items[i][this.urlParam]] = 1; + } + + var clearedUrls = []; + for(var url in this._onLoadImages){ + if(!urls[url] && this._onLoadImages[url]._conn){ + dojo.disconnect(this._onLoadImages[url]._conn); + this._onLoadImages[url].src = null; + clearedUrls.push(url); + } + } + + for(i = 0; i < clearedUrls.length; i++){ + delete this._onLoadImages[url]; + } + + this.render(); + }, + + _getItemNode: function(node){ + while(node && !dojo.hasClass(node, "mblThumb") && node != this.domNode){ + node = node.parentNode; + } + + return (node == this.domNode) ? null : node; + }, + + _getItemNodeFromEvent: function(event){ + if(event.touches && event.touches.length > 0){ + event = event.touches[0]; + } + return this._getItemNode(event.target); + }, + + resize: function(){ + this._thumbSize = null; + + this._size = dojo.contentBox(this.domNode); + + this.disableHide = true; + this.render(); + this.disableHide = false; + }, + + hideCached: function(){ + // summary: + // Hides all cached nodes, so that they're no invisible and overlaying + // other screen elements. + for(var i = 0; i < this.cache.length; i++){ + if (this.cache[i]) { + dojo.style(this.cache[i], "display", "none"); + } + } + }, + + render: function(){ + var i; + var url; + var item; + + var thumb; + while(this.visibleImages && this.visibleImages.length > 0){ + thumb = this.visibleImages.pop(); + this.cache.push(thumb); + + if (!this.disableHide) { + dojo.addClass(thumb, "hidden"); + } + thumb._cached = true; + } + + if(this.cache && this.cache.length > 0){ + setTimeout(this.hideCached, 1000); + } + + if(!this.items || this.items.length == 0){ + return; + } + + for(i = 0; i < this.items.length; i++){ + item = this.items[i]; + url = (dojo.isString(item) ? item : item[this.urlParam]); + + this.addThumb(item, url, i); + + if(this.maxRows > 0 && (i + 1) / this.maxPerRow >= this.maxRows){ + break; + } + } + + if(!this._thumbSize){ + return; + } + + var column = 0; + var row = -1; + + var totalThumbWidth = this._thumbSize.w + (this.padding * 2); + var totalThumbHeight = this._thumbSize.h + (this.padding * 2); + + var nodes = this.thumbNodes = + dojo.query(".mblThumb", this.domNode); + + var pos = 0; + nodes = this.visibleImages; + for(i = 0; i < nodes.length; i++){ + if(nodes[i]._cached){ + continue; + } + + if(pos % this.maxPerRow == 0){ + row ++; + } + column = pos % this.maxPerRow; + + this.place( + nodes[i], + (column * totalThumbWidth) + this.padding, // x position + (row * totalThumbHeight) + this.padding // y position + ); + + if(!nodes[i]._loading){ + dojo.removeClass(nodes[i], "hidden"); + } + + if(pos == this.selectedIndex){ + dojo[pos == this.selectedIndex ? "addClass" : "removeClass"] + (nodes[i], "selected"); + } + pos++; + } + + var numRows = Math.ceil(pos / this.maxPerRow); + + this._numRows = numRows; + + this.setContainerHeight((numRows * (this._thumbSize.h + this.padding * 2))); + }, + + setContainerHeight: function(amount){ + dojo.style(this.domNode, "height", amount + "px"); + }, + + addThumb: function(item, url, index){ + + var thumbDiv; + var cacheHit = false; + if(this.cache.length > 0){ + // Reuse a previously created node if possible + var found = false; + // Search for an image with the same url first + for(var i = 0; i < this.cache.length; i++){ + if(this.cache[i]._url == url){ + thumbDiv = this.cache.splice(i, 1)[0]; + found = true; + break + } + } + + // if no image with the same url is found, just take the last one + if(!thumbDiv && !this.cacheMustMatch){ + thumbDiv = this.cache.pop(); + dojo.removeClass(thumbDiv, "selected"); + } else { + cacheHit = true; + } + } + + if(!thumbDiv){ + + // Create a new thumb + thumbDiv = dojo.create("div", { + "class": "mblThumb hidden", + innerHTML: dojo.string.substitute(this.itemTemplate, { + url: url + }, null, this) + }, this.domNode); + } + + if(this.labelParam) { + var labelNode = dojo.query(".mblThumbLabel", thumbDiv)[0]; + if(!labelNode) { + labelNode = dojo.create("div", { + "class": "mblThumbLabel" + }, thumbDiv); + } + labelNode.innerHTML = item[this.labelParam] || ""; + } + + dojo.style(thumbDiv, "display", ""); + if (!this.disableHide) { + dojo.addClass(thumbDiv, "hidden"); + } + + if (!cacheHit) { + var loader = dojo.create("img", {}); + loader._thumbDiv = thumbDiv; + loader._conn = dojo.connect(loader, "onload", this.handleImgLoad); + loader._url = url; + thumbDiv._loading = true; + + this._onLoadImages[url] = loader; + if (loader) { + loader.src = url; + } + } + this.visibleImages.push(thumbDiv); + + thumbDiv._index = index; + thumbDiv._item = item; + thumbDiv._url = url; + thumbDiv._cached = false; + + if(!this._thumbSize){ + this._thumbSize = dojo.marginBox(thumbDiv); + + if(this._thumbSize.h == 0){ + this._thumbSize.h = 100; + this._thumbSize.w = 100; + } + + if(this.labelParam){ + this._thumbSize.h += 8; + } + + this.calcPadding(); + } + }, + + handleImgLoad: function(event){ + var img = event.target; + dojo.disconnect(img._conn); + dojo.removeClass(img._thumbDiv, "hidden"); + img._thumbDiv._loading = false; + img._conn = null; + + var url = img._url; + if(this.cacheBust){ + url += (url.indexOf("?") > -1 ? "&" : "?") + + "cacheBust=" + (new Date()).getTime() + "_" + (this._cacheCounter++); + } + + dojo.query(".mblThumbSrc", img._thumbDiv) + .style("backgroundImage", "url(" + url + ")"); + + delete this._onLoadImages[img._url]; + }, + + calcPadding: function(){ + var width = this._size.w; + + var thumbWidth = this._thumbSize.w; + + var imgBounds = thumbWidth + this.minPadding; + + this.maxPerRow = Math.floor(width / imgBounds); + + this.padding = Math.floor((width - (thumbWidth * this.maxPerRow)) / (this.maxPerRow * 2)); + }, + + place: function(node, x, y){ + dojo.style(node, { + "-webkit-transform" :"translate(" + x + "px," + y + "px)" + }); + }, + + destroy: function(){ + // Stop the loading of any more images + + var img; + var counter = 0; + for (var url in this._onLoadImages){ + img = this._onLoadImages[url]; + if (img) { + img.src = null; + counter++; + } + } + + this.inherited(arguments); + } +}); +}); diff --git a/js/dojo/dojox/mobile/app/ImageView.js b/js/dojo/dojox/mobile/app/ImageView.js new file mode 100644 index 0000000..d27bdf7 --- /dev/null +++ b/js/dojo/dojox/mobile/app/ImageView.js @@ -0,0 +1,721 @@ +//>>built +// wrapped by build app +define("dojox/mobile/app/ImageView", ["dijit","dojo","dojox","dojo/require!dojox/mobile/app/_Widget,dojo/fx/easing"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.ImageView"); +dojo.experimental("dojox.mobile.app.ImageView"); +dojo.require("dojox.mobile.app._Widget"); + +dojo.require("dojo.fx.easing"); + +dojo.declare("dojox.mobile.app.ImageView", dojox.mobile.app._Widget, { + + // zoom: Number + // The current level of zoom. This should not be set manually. + zoom: 1, + + // zoomCenterX: Number + // The X coordinate in the image where the zoom is focused + zoomCenterX: 0, + + // zoomCenterY: Number + // The Y coordinate in the image where the zoom is focused + zoomCenterY: 0, + + // maxZoom: Number + // The highest degree to which an image can be zoomed. For example, + // a maxZoom of 5 means that the image will be 5 times larger than normal + maxZoom: 5, + + // autoZoomLevel: Number + // The degree to which the image is zoomed when auto zoom is invoked. + // The higher the number, the more the image is zoomed in. + autoZoomLevel: 3, + + // disableAutoZoom: Boolean + // Disables auto zoom + disableAutoZoom: false, + + // disableSwipe: Boolean + // Disables the users ability to swipe from one image to the next. + disableSwipe: false, + + // autoZoomEvent: String + // Overrides the default event listened to which invokes auto zoom + autoZoomEvent: null, + + // _leftImg: Node + // The full sized image to the left + _leftImg: null, + + // _centerImg: Node + // The full sized image in the center + _centerImg: null, + + // _rightImg: Node + // The full sized image to the right + _rightImg: null, + + // _leftImg: Node + // The small sized image to the left + _leftSmallImg: null, + + // _centerImg: Node + // The small sized image in the center + _centerSmallImg: null, + + // _rightImg: Node + // The small sized image to the right + _rightSmallImg: null, + + constructor: function(){ + + this.panX = 0; + this.panY = 0; + + this.handleLoad = dojo.hitch(this, this.handleLoad); + this._updateAnimatedZoom = dojo.hitch(this, this._updateAnimatedZoom); + this._updateAnimatedPan = dojo.hitch(this, this._updateAnimatedPan); + this._onAnimPanEnd = dojo.hitch(this, this._onAnimPanEnd); + }, + + buildRendering: function(){ + this.inherited(arguments); + + this.canvas = dojo.create("canvas", {}, this.domNode); + + dojo.addClass(this.domNode, "mblImageView"); + }, + + postCreate: function(){ + this.inherited(arguments); + + this.size = dojo.marginBox(this.domNode); + + dojo.style(this.canvas, { + width: this.size.w + "px", + height: this.size.h + "px" + }); + this.canvas.height = this.size.h; + this.canvas.width = this.size.w; + + var _this = this; + + // Listen to the mousedown/touchstart event. Record the position + // so we can use it to pan the image. + this.connect(this.domNode, "onmousedown", function(event){ + if(_this.isAnimating()){ + return; + } + if(_this.panX){ + _this.handleDragEnd(); + } + + _this.downX = event.targetTouches ? event.targetTouches[0].clientX : event.clientX; + _this.downY = event.targetTouches ? event.targetTouches[0].clientY : event.clientY; + }); + + // record the movement of the mouse. + this.connect(this.domNode, "onmousemove", function(event){ + if(_this.isAnimating()){ + return; + } + if((!_this.downX && _this.downX !== 0) || (!_this.downY && _this.downY !== 0)){ + // If the touch didn't begin on this widget, ignore the movement + return; + } + + if((!_this.disableSwipe && _this.zoom == 1) + || (!_this.disableAutoZoom && _this.zoom != 1)){ + var x = event.targetTouches ? + event.targetTouches[0].clientX : event.pageX; + var y = event.targetTouches ? + event.targetTouches[0].clientY : event.pageY; + + _this.panX = x - _this.downX; + _this.panY = y - _this.downY; + + if(_this.zoom == 1){ + // If not zoomed in, then try to move to the next or prev image + // but only if the mouse has moved more than 10 pixels + // in the X direction + if(Math.abs(_this.panX) > 10){ + _this.render(); + } + }else{ + // If zoomed in, pan the image if the mouse has moved more + // than 10 pixels in either direction. + if(Math.abs(_this.panX) > 10 || Math.abs(_this.panY) > 10){ + _this.render(); + } + } + } + }); + + this.connect(this.domNode, "onmouseout", function(event){ + if(!_this.isAnimating() && _this.panX){ + _this.handleDragEnd(); + } + }); + + this.connect(this.domNode, "onmouseover", function(event){ + _this.downX = _this.downY = null; + }); + + // Set up AutoZoom, which zooms in a fixed amount when the user taps + // a part of the canvas + this.connect(this.domNode, "onclick", function(event){ + if(_this.isAnimating()){ + return; + } + if(_this.downX == null || _this.downY == null){ + return; + } + + var x = (event.targetTouches ? + event.targetTouches[0].clientX : event.pageX); + var y = (event.targetTouches ? + event.targetTouches[0].clientY : event.pageY); + + // If the mouse/finger has moved more than 14 pixels from where it + // started, do not treat it as a click. It is a drag. + if(Math.abs(_this.panX) > 14 || Math.abs(_this.panY) > 14){ + _this.downX = _this.downY = null; + _this.handleDragEnd(); + return; + } + _this.downX = _this.downY = null; + + if(!_this.disableAutoZoom){ + + if(!_this._centerImg || !_this._centerImg._loaded){ + // Do nothing until the image is loaded + return; + } + if(_this.zoom != 1){ + _this.set("animatedZoom", 1); + return; + } + + var pos = dojo._abs(_this.domNode); + + // Translate the clicked point to a point on the source image + var xRatio = _this.size.w / _this._centerImg.width; + var yRatio = _this.size.h / _this._centerImg.height; + + // Do an animated zoom to the point which was clicked. + _this.zoomTo( + ((x - pos.x) / xRatio) - _this.panX, + ((y - pos.y) / yRatio) - _this.panY, + _this.autoZoomLevel); + } + }); + + // Listen for Flick events + dojo.connect(this.domNode, "flick", this, "handleFlick"); + }, + + isAnimating: function(){ + // summary: + // Returns true if an animation is in progress, false otherwise. + return this._anim && this._anim.status() == "playing"; + }, + + handleDragEnd: function(){ + // summary: + // Handles the end of a dragging event. If not zoomed in, it + // determines if the next or previous image should be transitioned + // to. + this.downX = this.downY = null; + console.log("handleDragEnd"); + + if(this.zoom == 1){ + if(!this.panX){ + return; + } + + var leftLoaded = (this._leftImg && this._leftImg._loaded) + || (this._leftSmallImg && this._leftSmallImg._loaded); + var rightLoaded = (this._rightImg && this._rightImg._loaded) + || (this._rightSmallImg && this._rightSmallImg._loaded); + + // Check if the drag has moved the image more than half its length. + // If so, move to either the previous or next image. + var doMove = + !(Math.abs(this.panX) < this._centerImg._baseWidth / 2) && + ( + (this.panX > 0 && leftLoaded ? 1 : 0) || + (this.panX < 0 && rightLoaded ? 1 : 0) + ); + + + if(!doMove){ + // If not moving to another image, animate the sliding of the + // image back into place. + this._animPanTo(0, dojo.fx.easing.expoOut, 700); + }else{ + // Move to another image. + this.moveTo(this.panX); + } + }else{ + if(!this.panX && !this.panY){ + return; + } + // Recenter the zoomed image based on where it was panned to + // previously + this.zoomCenterX -= (this.panX / this.zoom); + this.zoomCenterY -= (this.panY / this.zoom); + + this.panX = this.panY = 0; + } + + }, + + handleFlick: function(event){ + // summary: + // Handle a flick event. + if(this.zoom == 1 && event.duration < 500){ + // Only handle quick flicks here, less than 0.5 seconds + + // If not zoomed in, then check if we should move to the next photo + // or not + if(event.direction == "ltr"){ + this.moveTo(1); + }else if(event.direction == "rtl"){ + this.moveTo(-1); + } + // If an up or down flick occurs, it means nothing so ignore it + this.downX = this.downY = null; + } + }, + + moveTo: function(direction){ + direction = direction > 0 ? 1 : -1; + var toImg; + + if(direction < 1){ + if(this._rightImg && this._rightImg._loaded){ + toImg = this._rightImg; + }else if(this._rightSmallImg && this._rightSmallImg._loaded){ + toImg = this._rightSmallImg; + } + }else{ + if(this._leftImg && this._leftImg._loaded){ + toImg = this._leftImg; + }else if(this._leftSmallImg && this._leftSmallImg._loaded){ + toImg = this._leftSmallImg; + } + } + + this._moveDir = direction; + var _this = this; + + if(toImg && toImg._loaded){ + // If the image is loaded, make a linear animation to show it + this._animPanTo(this.size.w * direction, null, 500, function(){ + _this.panX = 0; + _this.panY = 0; + + if(direction < 0){ + // Moving to show the right image + _this._switchImage("left", "right"); + }else{ + // Moving to show the left image + _this._switchImage("right", "left"); + } + + _this.render(); + _this.onChange(direction * -1); + }); + + }else{ + // If the next image is not loaded, make an animation to + // move the center image to half the width of the widget and back + // again + + console.log("moveTo image not loaded!", toImg); + + this._animPanTo(0, dojo.fx.easing.expoOut, 700); + } + }, + + _switchImage: function(toImg, fromImg){ + var toSmallImgName = "_" + toImg + "SmallImg"; + var toImgName = "_" + toImg + "Img"; + + var fromSmallImgName = "_" + fromImg + "SmallImg"; + var fromImgName = "_" + fromImg + "Img"; + + this[toImgName] = this._centerImg; + this[toSmallImgName] = this._centerSmallImg; + + this[toImgName]._type = toImg; + + if(this[toSmallImgName]){ + this[toSmallImgName]._type = toImg; + } + + this._centerImg = this[fromImgName]; + this._centerSmallImg = this[fromSmallImgName]; + this._centerImg._type = "center"; + + if(this._centerSmallImg){ + this._centerSmallImg._type = "center"; + } + this[fromImgName] = this[fromSmallImgName] = null; + }, + + _animPanTo: function(to, easing, duration, callback){ + this._animCallback = callback; + this._anim = new dojo.Animation({ + curve: [this.panX, to], + onAnimate: this._updateAnimatedPan, + duration: duration || 500, + easing: easing, + onEnd: this._onAnimPanEnd + }); + + this._anim.play(); + return this._anim; + }, + + onChange: function(direction){ + // summary: + // Stub function that can be listened to in order to provide + // new images when the displayed image changes + }, + + _updateAnimatedPan: function(amount){ + this.panX = amount; + this.render(); + }, + + _onAnimPanEnd: function(){ + this.panX = this.panY = 0; + + if(this._animCallback){ + this._animCallback(); + } + }, + + zoomTo: function(centerX, centerY, zoom){ + this.set("zoomCenterX", centerX); + this.set("zoomCenterY", centerY); + + this.set("animatedZoom", zoom); + }, + + render: function(){ + var cxt = this.canvas.getContext('2d'); + + cxt.clearRect(0, 0, this.canvas.width, this.canvas.height); + + // Render the center image + this._renderImg( + this._centerSmallImg, + this._centerImg, + this.zoom == 1 ? (this.panX < 0 ? 1 : this.panX > 0 ? -1 : 0) : 0); + + if(this.zoom == 1 && this.panX != 0){ + if(this.panX > 0){ + // Render the left image, showing the right side of it + this._renderImg(this._leftSmallImg, this._leftImg, 1); + }else{ + // Render the right image, showing the left side of it + this._renderImg(this._rightSmallImg, this._rightImg, -1); + } + } + }, + + _renderImg: function(smallImg, largeImg, panDir){ + // summary: + // Renders a single image + + + // If zoomed, we just display the center img + var img = (largeImg && largeImg._loaded) ? largeImg : smallImg; + + if(!img || !img._loaded){ + // If neither the large or small image is loaded, display nothing + return; + } + var cxt = this.canvas.getContext('2d'); + + var baseWidth = img._baseWidth; + var baseHeight = img._baseHeight; + + // Calculate the size the image would be if there were no bounds + var desiredWidth = baseWidth * this.zoom; + var desiredHeight = baseHeight * this.zoom; + + // Calculate the actual size of the viewable image + var destWidth = Math.min(this.size.w, desiredWidth); + var destHeight = Math.min(this.size.h, desiredHeight); + + + // Calculate the size of the window on the original image to use + var sourceWidth = this.dispWidth = img.width * (destWidth / desiredWidth); + var sourceHeight = this.dispHeight = img.height * (destHeight / desiredHeight); + + var zoomCenterX = this.zoomCenterX - (this.panX / this.zoom); + var zoomCenterY = this.zoomCenterY - (this.panY / this.zoom); + + // Calculate where the center of the view should be + var centerX = Math.floor(Math.max(sourceWidth / 2, + Math.min(img.width - sourceWidth / 2, zoomCenterX))); + var centerY = Math.floor(Math.max(sourceHeight / 2, + Math.min(img.height - sourceHeight / 2, zoomCenterY))); + + + var sourceX = Math.max(0, + Math.round((img.width - sourceWidth)/2 + (centerX - img._centerX)) ); + var sourceY = Math.max(0, + Math.round((img.height - sourceHeight) / 2 + (centerY - img._centerY)) + ); + + var destX = Math.round(Math.max(0, this.canvas.width - destWidth)/2); + var destY = Math.round(Math.max(0, this.canvas.height - destHeight)/2); + + var oldDestWidth = destWidth; + var oldSourceWidth = sourceWidth; + + if(this.zoom == 1 && panDir && this.panX){ + + if(this.panX < 0){ + if(panDir > 0){ + // If the touch is moving left, and the right side of the + // image should be shown, then reduce the destination width + // by the absolute value of panX + destWidth -= Math.abs(this.panX); + destX = 0; + }else if(panDir < 0){ + // If the touch is moving left, and the left side of the + // image should be shown, then set the displayed width + // to the absolute value of panX, less some pixels for + // a padding between images + destWidth = Math.max(1, Math.abs(this.panX) - 5); + destX = this.size.w - destWidth; + } + }else{ + if(panDir > 0){ + // If the touch is moving right, and the right side of the + // image should be shown, then set the destination width + // to the absolute value of the pan, less some pixels for + // padding + destWidth = Math.max(1, Math.abs(this.panX) - 5); + destX = 0; + }else if(panDir < 0){ + // If the touch is moving right, and the left side of the + // image should be shown, then reduce the destination width + // by the widget width minus the absolute value of panX + destWidth -= Math.abs(this.panX); + destX = this.size.w - destWidth; + } + } + + sourceWidth = Math.max(1, + Math.floor(sourceWidth * (destWidth / oldDestWidth))); + + if(panDir > 0){ + // If the right side of the image should be displayed, move + // the sourceX to be the width of the image minus the difference + // between the original sourceWidth and the new sourceWidth + sourceX = (sourceX + oldSourceWidth) - (sourceWidth); + } + sourceX = Math.floor(sourceX); + } + + try{ + + // See https://developer.mozilla.org/en/Canvas_tutorial/Using_images + cxt.drawImage( + img, + Math.max(0, sourceX), + sourceY, + Math.min(oldSourceWidth, sourceWidth), + sourceHeight, + destX, // Xpos + destY, // Ypos + Math.min(oldDestWidth, destWidth), + destHeight + ); + }catch(e){ + console.log("Caught Error",e, + + "type=", img._type, + "oldDestWidth = ", oldDestWidth, + "destWidth", destWidth, + "destX", destX + , "oldSourceWidth=",oldSourceWidth, + "sourceWidth=", sourceWidth, + "sourceX = " + sourceX + ); + } + }, + + _setZoomAttr: function(amount){ + this.zoom = Math.min(this.maxZoom, Math.max(1, amount)); + + if(this.zoom == 1 + && this._centerImg + && this._centerImg._loaded){ + + if(!this.isAnimating()){ + this.zoomCenterX = this._centerImg.width / 2; + this.zoomCenterY = this._centerImg.height / 2; + } + this.panX = this.panY = 0; + } + + this.render(); + }, + + _setZoomCenterXAttr: function(value){ + if(value != this.zoomCenterX){ + if(this._centerImg && this._centerImg._loaded){ + value = Math.min(this._centerImg.width, value); + } + this.zoomCenterX = Math.max(0, Math.round(value)); + } + }, + + _setZoomCenterYAttr: function(value){ + if(value != this.zoomCenterY){ + if(this._centerImg && this._centerImg._loaded){ + value = Math.min(this._centerImg.height, value); + } + this.zoomCenterY = Math.max(0, Math.round(value)); + } + }, + + _setZoomCenterAttr: function(value){ + if(value.x != this.zoomCenterX || value.y != this.zoomCenterY){ + this.set("zoomCenterX", value.x); + this.set("zoomCenterY", value.y); + this.render(); + } + }, + + _setAnimatedZoomAttr: function(amount){ + if(this._anim && this._anim.status() == "playing"){ + return; + } + + this._anim = new dojo.Animation({ + curve: [this.zoom, amount], + onAnimate: this._updateAnimatedZoom, + onEnd: this._onAnimEnd + }); + + this._anim.play(); + }, + + _updateAnimatedZoom: function(amount){ + this._setZoomAttr(amount); + }, + + _setCenterUrlAttr: function(urlOrObj){ + this._setImage("center", urlOrObj); + }, + _setLeftUrlAttr: function(urlOrObj){ + this._setImage("left", urlOrObj); + }, + _setRightUrlAttr: function(urlOrObj){ + this._setImage("right", urlOrObj); + }, + + _setImage: function(name, urlOrObj){ + var smallUrl = null; + + var largeUrl = null; + + if(dojo.isString(urlOrObj)){ + // If the argument is a string, then just load the large url + largeUrl = urlOrObj; + }else{ + largeUrl = urlOrObj.large; + smallUrl = urlOrObj.small; + } + + if(this["_" + name + "Img"] && this["_" + name + "Img"]._src == largeUrl){ + // Identical URL, ignore it + return; + } + + // Just do the large image for now + var largeImg = this["_" + name + "Img"] = new Image(); + largeImg._type = name; + largeImg._loaded = false; + largeImg._src = largeUrl; + largeImg._conn = dojo.connect(largeImg, "onload", this.handleLoad); + + if(smallUrl){ + // If a url to a small version of the image has been provided, + // load that image first. + var smallImg = this["_" + name + "SmallImg"] = new Image(); + smallImg._type = name; + smallImg._loaded = false; + smallImg._conn = dojo.connect(smallImg, "onload", this.handleLoad); + smallImg._isSmall = true; + smallImg._src = smallUrl; + smallImg.src = smallUrl; + } + + // It's important that the large url's src is set after the small image + // to ensure it's loaded second. + largeImg.src = largeUrl; + }, + + handleLoad: function(evt){ + // summary: + // Handles the loading of an image, both the large and small + // versions. A render is triggered as a result of each image load. + + var img = evt.target; + img._loaded = true; + + dojo.disconnect(img._conn); + + var type = img._type; + + switch(type){ + case "center": + this.zoomCenterX = img.width / 2; + this.zoomCenterY = img.height / 2; + break; + } + + var height = img.height; + var width = img.width; + + if(width / this.size.w < height / this.size.h){ + // Fit the height to the height of the canvas + img._baseHeight = this.canvas.height; + img._baseWidth = width / (height / this.size.h); + }else{ + // Fix the width to the width of the canvas + img._baseWidth = this.canvas.width; + img._baseHeight = height / (width / this.size.w); + } + img._centerX = width / 2; + img._centerY = height / 2; + + this.render(); + + this.onLoad(img._type, img._src, img._isSmall); + }, + + onLoad: function(type, url, isSmall){ + // summary: + // Dummy function that is called whenever an image loads. + // type: String + // The position of the image that has loaded, either + // "center", "left" or "right" + // url: String + // The src of the image + // isSmall: Boolean + // True if it is a small version of the image that has loaded, + // false otherwise. + } +}); + +}); diff --git a/js/dojo/dojox/mobile/app/List.js b/js/dojo/dojox/mobile/app/List.js new file mode 100644 index 0000000..21c2c64 --- /dev/null +++ b/js/dojo/dojox/mobile/app/List.js @@ -0,0 +1,649 @@ +//>>built +// wrapped by build app +define("dojox/mobile/app/List", ["dijit","dojo","dojox","dojo/require!dojo/string,dijit/_WidgetBase"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.List"); +dojo.experimental("dojox.mobile.app.List"); + +dojo.require("dojo.string"); +dojo.require("dijit._WidgetBase"); + +(function(){ + + var templateCache = {}; + + dojo.declare("dojox.mobile.app.List", dijit._WidgetBase, { + // summary: + // A templated list widget. Given a simple array of data objects + // and a HTML template, it renders a list of elements, with + // support for a swipe delete action. An optional template + // can be provided for when the list is empty. + + // items: Array + // The array of data items that will be rendered. + items: null, + + // itemTemplate: String + // The URL to the HTML file containing the markup for each individual + // data item. + itemTemplate: "", + + // emptyTemplate: String + // The URL to the HTML file containing the HTML to display if there + // are no data items. This is optional. + emptyTemplate: "", + + // dividerTemplate: String + // The URL to the HTML file containing the markup for the dividers + // between groups of list items + dividerTemplate: "", + + // dividerFunction: Function + // Function to create divider elements. This should return a divider + // value for each item in the list + dividerFunction: null, + + // labelDelete: String + // The label to display for the Delete button + labelDelete: "Delete", + + // labelCancel: String + // The label to display for the Cancel button + labelCancel: "Cancel", + + // controller: Object + // + controller: null, + + // autoDelete: Boolean + autoDelete: true, + + // enableDelete: Boolean + enableDelete: true, + + // enableHold: Boolean + enableHold: true, + + // formatters: Object + // A name/value map of functions used to format data for display + formatters: null, + + // _templateLoadCount: Number + // The number of templates remaining to load before the list renders. + _templateLoadCount: 0, + + // _mouseDownPos: Object + // The coordinates of where a mouseDown event was detected + _mouseDownPos: null, + + baseClass: "list", + + constructor: function(){ + this._checkLoadComplete = dojo.hitch(this, this._checkLoadComplete); + this._replaceToken = dojo.hitch(this, this._replaceToken); + this._postDeleteAnim = dojo.hitch(this, this._postDeleteAnim); + }, + + postCreate: function(){ + + var _this = this; + + if(this.emptyTemplate){ + this._templateLoadCount++; + } + if(this.itemTemplate){ + this._templateLoadCount++; + } + if(this.dividerTemplate){ + this._templateLoadCount++; + } + + this.connect(this.domNode, "onmousedown", function(event){ + var touch = event; + if(event.targetTouches && event.targetTouches.length > 0){ + touch = event.targetTouches[0]; + } + + // Find the node that was tapped/clicked + var rowNode = _this._getRowNode(event.target); + + if(rowNode){ + // Add the rows data to the event so it can be picked up + // by any listeners + _this._setDataInfo(rowNode, event); + + // Select and highlight the row + _this._selectRow(rowNode); + + // Record the position that was tapped + _this._mouseDownPos = { + x: touch.pageX, + y: touch.pageY + }; + _this._dragThreshold = null; + } + }); + + this.connect(this.domNode, "onmouseup", function(event){ + // When the mouse/finger comes off the list, + // call the onSelect function and deselect the row. + if(event.targetTouches && event.targetTouches.length > 0){ + event = event.targetTouches[0]; + } + var rowNode = _this._getRowNode(event.target); + + if(rowNode){ + + _this._setDataInfo(rowNode, event); + + if(_this._selectedRow){ + _this.onSelect(rowNode._data, rowNode._idx, rowNode); + } + + this._deselectRow(); + } + }); + + // If swipe-to-delete is enabled, listen for the mouse moving + if(this.enableDelete){ + this.connect(this.domNode, "mousemove", function(event){ + dojo.stopEvent(event); + if(!_this._selectedRow){ + return; + } + var rowNode = _this._getRowNode(event.target); + + // Still check for enableDelete in case it's changed after + // this listener is added. + if(_this.enableDelete && rowNode && !_this._deleting){ + _this.handleDrag(event); + } + }); + } + + // Put the data and index onto each onclick event. + this.connect(this.domNode, "onclick", function(event){ + if(event.touches && event.touches.length > 0){ + event = event.touches[0]; + } + var rowNode = _this._getRowNode(event.target, true); + + if(rowNode){ + _this._setDataInfo(rowNode, event); + } + }); + + // If the mouse or finger moves off the selected row, + // deselect it. + this.connect(this.domNode, "mouseout", function(event){ + if(event.touches && event.touches.length > 0){ + event = event.touches[0]; + } + if(event.target == _this._selectedRow){ + _this._deselectRow(); + } + }); + + // If no item template has been provided, it is an error. + if(!this.itemTemplate){ + throw Error("An item template must be provided to " + this.declaredClass); + } + + // Load the item template + this._loadTemplate(this.itemTemplate, "itemTemplate", this._checkLoadComplete); + + if(this.emptyTemplate){ + // If the optional empty template has been provided, load it. + this._loadTemplate(this.emptyTemplate, "emptyTemplate", this._checkLoadComplete); + } + + if(this.dividerTemplate){ + this._loadTemplate(this.dividerTemplate, "dividerTemplate", this._checkLoadComplete); + } + }, + + handleDrag: function(event){ + // summary: + // Handles rows being swiped for deletion. + var touch = event; + if(event.targetTouches && event.targetTouches.length > 0){ + touch = event.targetTouches[0]; + } + + // Get the distance that the mouse or finger has moved since + // beginning the swipe action. + var diff = touch.pageX - this._mouseDownPos.x; + + var absDiff = Math.abs(diff); + if(absDiff > 10 && !this._dragThreshold){ + // Make the user drag the row 60% of the width to remove it + this._dragThreshold = dojo.marginBox(this._selectedRow).w * 0.6; + if(!this.autoDelete){ + this.createDeleteButtons(this._selectedRow); + } + } + + this._selectedRow.style.left = (absDiff > 10 ? diff : 0) + "px"; + + // If the user has dragged the row more than the threshold, slide + // it off the screen in preparation for deletion. + if(this._dragThreshold && this._dragThreshold < absDiff){ + this.preDelete(diff); + } + }, + + handleDragCancel: function(){ + // summary: + // Handle a drag action being cancelled, for whatever reason. + // Reset handles, remove CSS classes etc. + if(this._deleting){ + return; + } + dojo.removeClass(this._selectedRow, "hold"); + this._selectedRow.style.left = 0; + this._mouseDownPos = null; + this._dragThreshold = null; + + this._deleteBtns && dojo.style(this._deleteBtns, "display", "none"); + }, + + preDelete: function(currentLeftPos){ + // summary: + // Slides the row offscreen before it is deleted + + // TODO: do this with CSS3! + var self = this; + + this._deleting = true; + + dojo.animateProperty({ + node: this._selectedRow, + duration: 400, + properties: { + left: { + end: currentLeftPos + + ((currentLeftPos > 0 ? 1 : -1) * this._dragThreshold * 0.8) + } + }, + onEnd: dojo.hitch(this, function(){ + if(this.autoDelete){ + this.deleteRow(this._selectedRow); + } + }) + }).play(); + }, + + deleteRow: function(row){ + + // First make the row invisible + // Put it back where it came from + dojo.style(row, { + visibility: "hidden", + minHeight: "0px" + }); + dojo.removeClass(row, "hold"); + + this._deleteAnimConn = + this.connect(row, "webkitAnimationEnd", this._postDeleteAnim); + + dojo.addClass(row, "collapsed"); + }, + + _postDeleteAnim: function(event){ + // summary: + // Completes the deletion of a row. + + if(this._deleteAnimConn){ + this.disconnect(this._deleteAnimConn); + this._deleteAnimConn = null; + } + + var row = this._selectedRow; + var sibling = row.nextSibling; + var prevSibling = row.previousSibling; + + // If the previous node is a divider and either this is + // the last element in the list, or the next node is + // also a divider, remove the divider for the deleted section. + if(prevSibling && prevSibling._isDivider){ + if(!sibling || sibling._isDivider){ + prevSibling.parentNode.removeChild(prevSibling); + } + } + + row.parentNode.removeChild(row); + this.onDelete(row._data, row._idx, this.items); + + // Decrement the index of each following row + while(sibling){ + if(sibling._idx){ + sibling._idx--; + } + sibling = sibling.nextSibling; + } + + dojo.destroy(row); + + // Fix up the 'first' and 'last' CSS classes on the rows + dojo.query("> *:not(.buttons)", this.domNode).forEach(this.applyClass); + + this._deleting = false; + this._deselectRow(); + }, + + createDeleteButtons: function(aroundNode){ + // summary: + // Creates the two buttons displayed when confirmation is + // required before deletion of a row. + // aroundNode: + // The DOM node of the row about to be deleted. + var mb = dojo.marginBox(aroundNode); + var pos = dojo._abs(aroundNode, true); + + if(!this._deleteBtns){ + // Create the delete buttons. + this._deleteBtns = dojo.create("div",{ + "class": "buttons" + }, this.domNode); + + this.buttons = []; + + this.buttons.push(new dojox.mobile.Button({ + btnClass: "mblRedButton", + label: this.labelDelete + })); + this.buttons.push(new dojox.mobile.Button({ + btnClass: "mblBlueButton", + label: this.labelCancel + })); + + dojo.place(this.buttons[0].domNode, this._deleteBtns); + dojo.place(this.buttons[1].domNode, this._deleteBtns); + + dojo.addClass(this.buttons[0].domNode, "deleteBtn"); + dojo.addClass(this.buttons[1].domNode, "cancelBtn"); + + this._handleButtonClick = dojo.hitch(this._handleButtonClick); + this.connect(this._deleteBtns, "onclick", this._handleButtonClick); + } + dojo.removeClass(this._deleteBtns, "fade out fast"); + dojo.style(this._deleteBtns, { + display: "", + width: mb.w + "px", + height: mb.h + "px", + top: (aroundNode.offsetTop) + "px", + left: "0px" + }); + }, + + onDelete: function(data, index, array){ + // summary: + // Called when a row is deleted + // data: + // The data related to the row being deleted + // index: + // The index of the data in the total array + // array: + // The array of data used. + + array.splice(index, 1); + + // If the data is empty, rerender in case an emptyTemplate has + // been provided + if(array.length < 1){ + this.render(); + } + }, + + cancelDelete: function(){ + // summary: + // Cancels the deletion of a row. + this._deleting = false; + this.handleDragCancel(); + }, + + _handleButtonClick: function(event){ + // summary: + // Handles the click of one of the deletion buttons, either to + // delete the row or to cancel the deletion. + if(event.touches && event.touches.length > 0){ + event = event.touches[0]; + } + var node = event.target; + if(dojo.hasClass(node, "deleteBtn")){ + this.deleteRow(this._selectedRow); + }else if(dojo.hasClass(node, "cancelBtn")){ + this.cancelDelete(); + }else{ + return; + } + dojo.addClass(this._deleteBtns, "fade out"); + }, + + applyClass: function(node, idx, array){ + // summary: + // Applies the 'first' and 'last' CSS classes to the relevant + // rows. + + dojo.removeClass(node, "first last"); + if(idx == 0){ + dojo.addClass(node, "first"); + } + if(idx == array.length - 1){ + dojo.addClass(node, "last"); + } + }, + + _setDataInfo: function(rowNode, event){ + // summary: + // Attaches the data item and index for each row to any event + // that occurs on that row. + event.item = rowNode._data; + event.index = rowNode._idx; + }, + + onSelect: function(data, index, rowNode){ + // summary: + // Dummy function that is called when a row is tapped + }, + + _selectRow: function(row){ + // summary: + // Selects a row, applies the relevant CSS classes. + if(this._deleting && this._selectedRow && row != this._selectedRow){ + this.cancelDelete(); + } + + if(!dojo.hasClass(row, "row")){ + return; + } + if(this.enableHold || this.enableDelete){ + dojo.addClass(row, "hold"); + } + this._selectedRow = row; + }, + + _deselectRow: function(){ + // summary: + // Deselects a row, and cancels any drag actions that were + // occurring. + if(!this._selectedRow || this._deleting){ + return; + } + this.handleDragCancel(); + dojo.removeClass(this._selectedRow, "hold"); + this._selectedRow = null; + }, + + _getRowNode: function(fromNode, ignoreNoClick){ + // summary: + // Gets the DOM node of the row that is equal to or the parent + // of the node passed to this function. + while(fromNode && !fromNode._data && fromNode != this.domNode){ + if(!ignoreNoClick && dojo.hasClass(fromNode, "noclick")){ + return null; + } + fromNode = fromNode.parentNode; + } + return fromNode == this.domNode ? null : fromNode; + }, + + applyTemplate: function(template, data){ + return dojo._toDom(dojo.string.substitute( + template, data, this._replaceToken, this.formatters || this)); + }, + + render: function(){ + // summary: + // Renders the list. + + // Delete all existing nodes, except the deletion buttons. + dojo.query("> *:not(.buttons)", this.domNode).forEach(dojo.destroy); + + // If there is no data, and an empty template has been provided, + // render it. + if(this.items.length < 1 && this.emptyTemplate){ + dojo.place(dojo._toDom(this.emptyTemplate), this.domNode, "first"); + }else{ + this.domNode.appendChild(this._renderRange(0, this.items.length)); + } + if(dojo.hasClass(this.domNode.parentNode, "mblRoundRect")){ + dojo.addClass(this.domNode.parentNode, "mblRoundRectList") + } + + var divs = dojo.query("> .row", this.domNode); + if(divs.length > 0){ + dojo.addClass(divs[0], "first"); + dojo.addClass(divs[divs.length - 1], "last"); + } + }, + + _renderRange: function(startIdx, endIdx){ + + var rows = []; + var row, i; + var frag = document.createDocumentFragment(); + startIdx = Math.max(0, startIdx); + endIdx = Math.min(endIdx, this.items.length); + + for(i = startIdx; i < endIdx; i++){ + // Create a document fragment containing the templated row + row = this.applyTemplate(this.itemTemplate, this.items[i]); + dojo.addClass(row, 'row'); + row._data = this.items[i]; + row._idx = i; + rows.push(row); + } + if(!this.dividerFunction || !this.dividerTemplate){ + for(i = startIdx; i < endIdx; i++){ + rows[i]._data = this.items[i]; + rows[i]._idx = i; + frag.appendChild(rows[i]); + } + }else{ + var prevDividerValue = null; + var dividerValue; + var divider; + for(i = startIdx; i < endIdx; i++){ + rows[i]._data = this.items[i]; + rows[i]._idx = i; + + dividerValue = this.dividerFunction(this.items[i]); + if(dividerValue && dividerValue != prevDividerValue){ + divider = this.applyTemplate(this.dividerTemplate, { + label: dividerValue, + item: this.items[i] + }); + divider._isDivider = true; + frag.appendChild(divider); + prevDividerValue = dividerValue; + } + frag.appendChild(rows[i]); + } + } + return frag; + }, + + _replaceToken: function(value, key){ + if(key.charAt(0) == '!'){ value = dojo.getObject(key.substr(1), false, _this); } + if(typeof value == "undefined"){ return ""; } // 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? + + }, + + _checkLoadComplete: function(){ + // summary: + // Checks if all templates have loaded + this._templateLoadCount--; + + if(this._templateLoadCount < 1 && this.get("items")){ + this.render(); + } + }, + + _loadTemplate: function(url, thisAttr, callback){ + // summary: + // Loads a template + if(!url){ + callback(); + return; + } + + if(templateCache[url]){ + this.set(thisAttr, templateCache[url]); + callback(); + }else{ + var _this = this; + + dojo.xhrGet({ + url: url, + sync: false, + handleAs: "text", + load: function(text){ + templateCache[url] = dojo.trim(text); + _this.set(thisAttr, templateCache[url]); + callback(); + } + }); + } + }, + + + _setFormattersAttr: function(formatters){ + // summary: + // Sets the data items, and causes a rerender of the list + this.formatters = formatters; + }, + + _setItemsAttr: function(items){ + // summary: + // Sets the data items, and causes a rerender of the list + + this.items = items || []; + + if(this._templateLoadCount < 1 && items){ + this.render(); + } + }, + + destroy: function(){ + if(this.buttons){ + dojo.forEach(this.buttons, function(button){ + button.destroy(); + }); + this.buttons = null; + } + + this.inherited(arguments); + } + + }); + +})(); +}); diff --git a/js/dojo/dojox/mobile/app/ListSelector.js b/js/dojo/dojox/mobile/app/ListSelector.js new file mode 100644 index 0000000..b3f6f94 --- /dev/null +++ b/js/dojo/dojox/mobile/app/ListSelector.js @@ -0,0 +1,223 @@ +//>>built +// wrapped by build app +define("dojox/mobile/app/ListSelector", ["dijit","dojo","dojox","dojo/require!dojox/mobile/app/_Widget,dojo/fx"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.ListSelector"); +dojo.experimental("dojox.mobile.app.ListSelector"); + +dojo.require("dojox.mobile.app._Widget"); +dojo.require("dojo.fx"); + +dojo.declare("dojox.mobile.app.ListSelector", dojox.mobile.app._Widget, { + + // data: Array + // The array of items to display. Each element in the array + // should have both a label and value attribute, e.g. + // [{label: "Open", value: 1} , {label: "Delete", value: 2}] + data: null, + + // controller: Object + // The current SceneController widget. + controller: null, + + // onChoose: Function + // The callback function for when an item is selected + onChoose: null, + + destroyOnHide: false, + + _setDataAttr: function(data){ + this.data = data; + + if(this.data){ + this.render(); + } + }, + + postCreate: function(){ + dojo.addClass(this.domNode, "listSelector"); + + var _this = this; + + this.connect(this.domNode, "onclick", function(event){ + if(!dojo.hasClass(event.target, "listSelectorRow")){ + return; + } + + if(_this.onChoose){ + _this.onChoose(_this.data[event.target._idx].value); + } + _this.hide(); + }); + + this.connect(this.domNode, "onmousedown", function(event){ + if(!dojo.hasClass(event.target, "listSelectorRow")){ + return; + } + dojo.addClass(event.target, "listSelectorRow-selected"); + }); + + this.connect(this.domNode, "onmouseup", function(event){ + if(!dojo.hasClass(event.target, "listSelectorRow")){ + return; + } + dojo.removeClass(event.target, "listSelectorRow-selected"); + }); + + this.connect(this.domNode, "onmouseout", function(event){ + if(!dojo.hasClass(event.target, "listSelectorRow")){ + return; + } + dojo.removeClass(event.target, "listSelectorRow-selected"); + }); + + var viewportSize = this.controller.getWindowSize(); + + this.mask = dojo.create("div", {"class": "dialogUnderlayWrapper", + innerHTML: "<div class=\"dialogUnderlay\"></div>" + }, this.controller.assistant.domNode); + + this.connect(this.mask, "onclick", function(){ + _this.onChoose && _this.onChoose(); + _this.hide(); + }); + }, + + show: function(fromNode){ + + // Using dojo.fx here. Must figure out how to do this with CSS animations!! + var startPos; + + var windowSize = this.controller.getWindowSize(); + var fromNodePos; + if(fromNode){ + fromNodePos = dojo._abs(fromNode); + startPos = fromNodePos; + }else{ + startPos.x = windowSize.w / 2; + startPos.y = 200; + } + console.log("startPos = ", startPos); + + dojo.style(this.domNode, { + opacity: 0, + display: "", + width: Math.floor(windowSize.w * 0.8) + "px" + }); + + var maxWidth = 0; + dojo.query(">", this.domNode).forEach(function(node){ + dojo.style(node, { + "float": "left" + }); + maxWidth = Math.max(maxWidth, dojo.marginBox(node).w); + dojo.style(node, { + "float": "none" + }); + }); + maxWidth = Math.min(maxWidth, Math.round(windowSize.w * 0.8)) + + dojo.style(this.domNode, "paddingLeft") + + dojo.style(this.domNode, "paddingRight") + + 1; + + dojo.style(this.domNode, "width", maxWidth + "px"); + var targetHeight = dojo.marginBox(this.domNode).h; + + var _this = this; + + + var targetY = fromNodePos ? + Math.max(30, fromNodePos.y - targetHeight - 10) : + this.getScroll().y + 30; + + console.log("fromNodePos = ", fromNodePos, " targetHeight = ", targetHeight, + " targetY = " + targetY, " startPos ", startPos); + + + var anim1 = dojo.animateProperty({ + node: this.domNode, + duration: 400, + properties: { + width: {start: 1, end: maxWidth}, + height: {start: 1, end: targetHeight}, + top: {start: startPos.y, end: targetY}, + left: {start: startPos.x, end: (windowSize.w/2 - maxWidth/2)}, + opacity: {start: 0, end: 1}, + fontSize: {start: 1} + }, + onEnd: function(){ + dojo.style(_this.domNode, "width", "inherit"); + } + }); + var anim2 = dojo.fadeIn({ + node: this.mask, + duration: 400 + }); + dojo.fx.combine([anim1, anim2]).play(); + + }, + + hide: function(){ + // Using dojo.fx here. Must figure out how to do this with CSS animations!! + + var _this = this; + + var anim1 = dojo.animateProperty({ + node: this.domNode, + duration: 500, + properties: { + width: {end: 1}, + height: {end: 1}, + opacity: {end: 0}, + fontSize: {end: 1} + }, + onEnd: function(){ + if(_this.get("destroyOnHide")){ + _this.destroy(); + } + } + }); + + var anim2 = dojo.fadeOut({ + node: this.mask, + duration: 400 + }); + dojo.fx.combine([anim1, anim2]).play(); + }, + + render: function(){ + // summary: + // Renders + + dojo.empty(this.domNode); + dojo.style(this.domNode, "opacity", 0); + + var row; + + for(var i = 0; i < this.data.length; i++){ + // Create each row and add any custom classes. Also set the _idx property. + row = dojo.create("div", { + "class": "listSelectorRow " + (this.data[i].className || ""), + innerHTML: this.data[i].label + }, this.domNode); + + row._idx = i; + + if(i == 0){ + dojo.addClass(row, "first"); + } + if(i == this.data.length - 1){ + dojo.addClass(row, "last"); + } + + } + }, + + + destroy: function(){ + this.inherited(arguments); + dojo.destroy(this.mask); + } + +}); + +}); diff --git a/js/dojo/dojox/mobile/app/SceneAssistant.js b/js/dojo/dojox/mobile/app/SceneAssistant.js new file mode 100644 index 0000000..2b192bf --- /dev/null +++ b/js/dojo/dojox/mobile/app/SceneAssistant.js @@ -0,0 +1,61 @@ +//>>built +// wrapped by build app +define("dojox/mobile/app/SceneAssistant", ["dijit","dojo","dojox"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.SceneAssistant"); +dojo.experimental("dojox.mobile.app.SceneAssistant"); + +dojo.declare("dojox.mobile.app.SceneAssistant", null, { + // summary: + // The base class for all scene assistants. + + constructor: function(){ + + }, + + setup: function(){ + // summary: + // Called to set up the widget. The UI is not visible at this time + + }, + + activate: function(params){ + // summary: + // Called each time the scene becomes visible. This can be as a result + // of a new scene being created, or a subsequent scene being destroyed + // and control transferring back to this scene assistant. + // params: + // Optional paramters, only passed when a subsequent scene pops itself + // off the stack and passes back data. + }, + + deactivate: function(){ + // summary: + // Called each time the scene becomes invisible. This can be as a result + // of it being popped off the stack and destroyed, + // or another scene being created and pushed on top of it on the stack + }, + + destroy: function(){ + + var children = + dojo.query("> [widgetId]", this.containerNode).map(dijit.byNode); + dojo.forEach(children, function(child){ child.destroyRecursive(); }); + + this.disconnect(); + }, + + connect: function(obj, method, callback){ + if(!this._connects){ + this._connects = []; + } + this._connects.push(dojo.connect(obj, method, callback)); + }, + + disconnect: function(){ + dojo.forEach(this._connects, dojo.disconnect); + this._connects = []; + } +}); + + +}); diff --git a/js/dojo/dojox/mobile/app/SceneController.js b/js/dojo/dojox/mobile/app/SceneController.js new file mode 100644 index 0000000..30f0788 --- /dev/null +++ b/js/dojo/dojox/mobile/app/SceneController.js @@ -0,0 +1,174 @@ +//>>built +// wrapped by build app +define("dojox/mobile/app/SceneController", ["dijit","dojo","dojox","dojo/require!dojox/mobile/_base"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.SceneController"); +dojo.experimental("dojox.mobile.app.SceneController"); +dojo.require("dojox.mobile._base"); + +(function(){ + + var app = dojox.mobile.app; + + var templates = {}; + + dojo.declare("dojox.mobile.app.SceneController", dojox.mobile.View, { + + stageController: null, + + keepScrollPos: false, + + init: function(sceneName, params){ + // summary: + // Initializes the scene by loading the HTML template and code, if it has + // not already been loaded + + this.sceneName = sceneName; + this.params = params; + var templateUrl = app.resolveTemplate(sceneName); + + this._deferredInit = new dojo.Deferred(); + + if(templates[sceneName]){ + // If the template has been cached, do not load it again. + this._setContents(templates[sceneName]); + }else{ + // Otherwise load the template + dojo.xhrGet({ + url: templateUrl, + handleAs: "text" + }).addCallback(dojo.hitch(this, this._setContents)); + } + + return this._deferredInit; + }, + + _setContents: function(templateHtml){ + // summary: + // Sets the content of the View, and invokes either the loading or + // initialization of the scene assistant. + templates[this.sceneName] = templateHtml; + + this.domNode.innerHTML = "<div>" + templateHtml + "</div>"; + + var sceneAssistantName = ""; + + var nameParts = this.sceneName.split("-"); + + for(var i = 0; i < nameParts.length; i++){ + sceneAssistantName += nameParts[i].substring(0, 1).toUpperCase() + + nameParts[i].substring(1); + } + sceneAssistantName += "Assistant"; + this.sceneAssistantName = sceneAssistantName; + + var _this = this; + + dojox.mobile.app.loadResourcesForScene(this.sceneName, function(){ + + console.log("All resources for ",_this.sceneName," loaded"); + + var assistant; + if(typeof(dojo.global[sceneAssistantName]) != "undefined"){ + _this._initAssistant(); + }else{ + var assistantUrl = app.resolveAssistant(_this.sceneName); + + dojo.xhrGet({ + url: assistantUrl, + handleAs: "text" + }).addCallback(function(text){ + try{ + dojo.eval(text); + }catch(e){ + console.log("Error initializing code for scene " + _this.sceneName + + '. Please check for syntax errors'); + throw e; + } + _this._initAssistant(); + }); + } + }); + + }, + + _initAssistant: function(){ + // summary: + // Initializes the scene assistant. At this point, the View is + // populated with the HTML template, and the scene assistant type + // is declared. + + console.log("Instantiating the scene assistant " + this.sceneAssistantName); + + var cls = dojo.getObject(this.sceneAssistantName); + + if(!cls){ + throw Error("Unable to resolve scene assistant " + + this.sceneAssistantName); + } + + this.assistant = new cls(this.params); + + this.assistant.controller = this; + this.assistant.domNode = this.domNode.firstChild; + + this.assistant.setup(); + + this._deferredInit.callback(); + }, + + query: function(selector, node){ + // summary: + // Queries for DOM nodes within either the node passed in as an argument + // or within this view. + + return dojo.query(selector, node || this.domNode) + }, + + parse: function(node){ + var widgets = this._widgets = + dojox.mobile.parser.parse(node || this.domNode, { + controller: this + }); + + // Tell all widgets what their controller is. + for(var i = 0; i < widgets.length; i++){ + widgets[i].set("controller", this); + } + }, + + getWindowSize: function(){ + // TODO, this needs cross browser testing + + return { + w: dojo.global.innerWidth, + h: dojo.global.innerHeight + } + }, + + showAlertDialog: function(props){ + + var size = dojo.marginBox(this.assistant.domNode); + var dialog = new dojox.mobile.app.AlertDialog( + dojo.mixin(props, {controller: this})); + this.assistant.domNode.appendChild(dialog.domNode); + + console.log("Appended " , dialog.domNode, " to ", this.assistant.domNode); + dialog.show(); + }, + + popupSubMenu: function(info){ + var widget = new dojox.mobile.app.ListSelector({ + controller: this, + destroyOnHide: true, + onChoose: info.onChoose + }); + + this.assistant.domNode.appendChild(widget.domNode); + + widget.set("data", info.choices); + widget.show(info.fromNode); + } + }); + +})(); +}); diff --git a/js/dojo/dojox/mobile/app/StageController.js b/js/dojo/dojox/mobile/app/StageController.js new file mode 100644 index 0000000..1a6288b --- /dev/null +++ b/js/dojo/dojox/mobile/app/StageController.js @@ -0,0 +1,137 @@ +//>>built +// wrapped by build app +define("dojox/mobile/app/StageController", ["dijit","dojo","dojox","dojo/require!dojox/mobile/app/SceneController"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.StageController"); +dojo.experimental("dojox.mobile.app.StageController"); + +dojo.require("dojox.mobile.app.SceneController"); + +dojo.declare("dojox.mobile.app.StageController", null,{ + + // scenes: Array + // The list of scenes currently in existance in the app. + scenes: null, + + effect: "fade", + + constructor: function(node){ + this.domNode = node; + this.scenes = []; + + if(dojo.config.mobileAnim){ + this.effect = dojo.config.mobileAnim; + } + }, + + getActiveSceneController: function(){ + return this.scenes[this.scenes.length - 1]; + }, + + pushScene: function(sceneName, params){ + if(this._opInProgress){ + return; + } + this._opInProgress = true; + + // Push new scenes as the first element on the page. + var node = dojo.create("div", { + "class": "scene-wrapper", + style: { + visibility: "hidden" + } + }, this.domNode); + + var controller = new dojox.mobile.app.SceneController({}, node); + + if(this.scenes.length > 0){ + this.scenes[this.scenes.length -1].assistant.deactivate(); + } + + this.scenes.push(controller); + + var _this = this; + + dojo.forEach(this.scenes, this.setZIndex); + + controller.stageController = this; + + controller.init(sceneName, params).addCallback(function(){ + + if(_this.scenes.length == 1){ + controller.domNode.style.visibility = "visible"; + _this.scenes[_this.scenes.length - 1].assistant.activate(params); + _this._opInProgress = false; + }else{ + _this.scenes[_this.scenes.length - 2] + .performTransition( + _this.scenes[_this.scenes.length - 1].domNode, + 1, + _this.effect, + null, + function(){ + // When the scene is ready, activate it. + _this.scenes[_this.scenes.length - 1].assistant.activate(params); + _this._opInProgress = false; + }); + } + }); + }, + + setZIndex: function(controller, idx){ + dojo.style(controller.domNode, "zIndex", idx + 1); + }, + + popScene: function(data){ + // performTransition: function(/*String*/moveTo, /*Number*/dir, /*String*/transition, + // /*Object|null*/context, /*String|Function*/method /*optional args*/){ + if(this._opInProgress){ + return; + } + + var _this = this; + if(this.scenes.length > 1){ + + this._opInProgress = true; + this.scenes[_this.scenes.length - 2].assistant.activate(data); + this.scenes[_this.scenes.length - 1] + .performTransition( + _this.scenes[this.scenes.length - 2].domNode, + -1, + this.effect, + null, + function(){ + // When the scene is no longer visible, destroy it + _this._destroyScene(_this.scenes[_this.scenes.length - 1]); + _this.scenes.splice(_this.scenes.length - 1, 1); + _this._opInProgress = false; + }); + }else{ + console.log("cannot pop the scene if there is just one"); + } + }, + + popScenesTo: function(sceneName, data){ + if(this._opInProgress){ + return; + } + + while(this.scenes.length > 2 && + this.scenes[this.scenes.length - 2].sceneName != sceneName){ + this._destroyScene(this.scenes[this.scenes.length - 2]); + this.scenes.splice(this.scenes.length - 2, 1); + } + + this.popScene(data); + }, + + _destroyScene: function(scene){ + scene.assistant.deactivate(); + scene.assistant.destroy(); + scene.destroyRecursive(); + } + + +}); + + +}); diff --git a/js/dojo/dojox/mobile/app/TextBox.js b/js/dojo/dojox/mobile/app/TextBox.js new file mode 100644 index 0000000..d1c2bb2 --- /dev/null +++ b/js/dojo/dojox/mobile/app/TextBox.js @@ -0,0 +1,10 @@ +//>>built +// wrapped by build app +define("dojox/mobile/app/TextBox", ["dijit","dojo","dojox","dojo/require!dojox/mobile/TextBox"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.TextBox"); +dojo.deprecated("dojox.mobile.app.TextBox is deprecated", "dojox.mobile.app.TextBox moved to dojox.mobile.TextBox", 1.8); + +dojo.require("dojox.mobile.TextBox"); + +dojox.mobile.app.TextBox = dojox.mobile.TextBox; +}); diff --git a/js/dojo/dojox/mobile/app/_FormWidget.js b/js/dojo/dojox/mobile/app/_FormWidget.js new file mode 100644 index 0000000..1a6c8cd --- /dev/null +++ b/js/dojo/dojox/mobile/app/_FormWidget.js @@ -0,0 +1,293 @@ +//>>built +// wrapped by build app +define("dojox/mobile/app/_FormWidget", ["dijit","dojo","dojox","dojo/require!dojo/window,dijit/_WidgetBase,dijit/focus"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app._FormWidget"); +dojo.experimental("dojox.mobile.app._FormWidget"); + +dojo.require("dojo.window"); + +dojo.require("dijit._WidgetBase"); +dojo.require("dijit.focus"); // dijit.focus() + +dojo.declare("dojox.mobile.app._FormWidget", dijit._WidgetBase, { + // 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 `dojox.mobile.app.Form` widget. + // + // description: + // Represents a single HTML element. + // All these widgets should have these attributes just like native HTML input elements. + // You can set them during widget construction or afterwards, via `dijit._WidgetBase.attr`. + // + // They also share some common methods. + + // name: String + // Name used when submitting form; same as "name" attribute or plain HTML elements + name: "", + + // alt: String + // Corresponds to the native HTML <input> element's attribute. + alt: "", + + // value: String + // Corresponds to the native HTML <input> element's attribute. + value: "", + + // type: String + // Corresponds to the native HTML <input> element's attribute. + type: "text", + + // disabled: Boolean + // Should this widget respond to user input? + // In markup, this is specified as "disabled='disabled'", or just "disabled". + disabled: false, + + // intermediateChanges: Boolean + // Fires onChange for each value change or only on demand + intermediateChanges: false, + + // scrollOnFocus: Boolean + // On focus, should this widget scroll into view? + scrollOnFocus: false, + + // These mixins assume that the focus node is an INPUT, as many but not all _FormWidgets are. + attributeMap: dojo.delegate(dijit._WidgetBase.prototype.attributeMap, { + value: "focusNode", + id: "focusNode", + alt: "focusNode", + title: "focusNode" + }), + + 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); + }, + + postCreate: function(){ + this.inherited(arguments); + this.connect(this.domNode, "onmousedown", "_onMouseDown"); + }, + + _setDisabledAttr: function(/*Boolean*/ value){ + this.disabled = value; + dojo.attr(this.focusNode, 'disabled', value); + if(this.valueNode){ + dojo.attr(this.valueNode, 'disabled', value); + } + }, + + _onFocus: function(e){ + if(this.scrollOnFocus){ + dojo.window.scrollIntoView(this.domNode); + } + this.inherited(arguments); + }, + + isFocusable: function(){ + // summary: + // Tells if this widget is focusable or not. Used internally by dijit. + // tags: + // protected + return !this.disabled && !this.readOnly + && this.focusNode && (dojo.style(this.domNode, "display") != "none"); + }, + + focus: function(){ + // summary: + // Put focus on this widget + this.focusNode.focus(); + }, + + compare: function(/*anything*/val1, /*anything*/val2){ + // summary: + // Compare 2 values (as returned by attr('value') for this widget). + // tags: + // protected + if(typeof val1 == "number" && typeof val2 == "number"){ + return (isNaN(val1) && isNaN(val2)) ? 0 : val1 - val2; + }else if(val1 > val2){ + return 1; + }else if(val1 < val2){ + return -1; + }else{ + return 0; + } + }, + + onChange: function(newValue){ + // summary: + // Callback when this widget's value is changed. + // tags: + // callback + }, + + // _onChangeActive: [private] Boolean + // Indicates that changes to the value should call onChange() callback. + // This is false during widget initialization, to avoid calling onChange() + // when the initial value is set. + _onChangeActive: false, + + _handleOnChange: function(/*anything*/ newValue, /* Boolean? */ priorityChange){ + // summary: + // Called when the value of the widget is set. Calls onChange() if appropriate + // newValue: + // the new value + // priorityChange: + // For a slider, for example, dragging the slider is priorityChange==false, + // but on mouse up, it's priorityChange==true. If intermediateChanges==true, + // onChange is only called form priorityChange=true events. + // tags: + // private + this._lastValue = newValue; + 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; + } + if((this.intermediateChanges || priorityChange || priorityChange === undefined) && + ((typeof newValue != typeof this._lastValueReported) || + this.compare(newValue, this._lastValueReported) != 0)){ + this._lastValueReported = newValue; + 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: function(){ + // Overrides _Widget.create() + this.inherited(arguments); + this._onChangeActive = true; + }, + + destroy: function(){ + if(this._onChangeHandle){ // destroy called before last onChange has fired + clearTimeout(this._onChangeHandle); + this.onChange(this._lastValueReported); + } + this.inherited(arguments); + }, + + _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(this.isFocusable()){ + // 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); + }); + } + }, + + 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? + 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(_window["getSelection"] && element.setSelectionRange){ + element.setSelectionRange(start, stop); + } + } +}); + +dojo.declare("dojox.mobile.app._FormValueWidget", dojox.mobile.app._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. + + // 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) + + // 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, + + attributeMap: dojo.delegate(dojox.mobile.app._FormWidget.prototype.attributeMap, { + value: "", + readOnly: "focusNode" + }), + + _setReadOnlyAttr: function(/*Boolean*/ value){ + this.readOnly = value; + dojo.attr(this.focusNode, 'readOnly', value); + }, + + postCreate: function(){ + this.inherited(arguments); + + // 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._resetValue = this.value; + } + }, + + _setValueAttr: function(/*anything*/ newValue, /*Boolean, optional*/ priorityChange){ + // summary: + // Hook so attr('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.value = newValue; + this._handleOnChange(newValue, priorityChange); + }, + + _getValueAttr: function(){ + // summary: + // Hook so attr('value') works. + return this._lastValue; + }, + + undo: function(){ + // summary: + // Restore the value to the last value passed to onChange + this._setValueAttr(this._lastValueReported, false); + }, + + reset: function(){ + // summary: + // Reset the widget's value to what it was at initialization time + this._hasBeenBlurred = false; + this._setValueAttr(this._resetValue, true); + } +}); + +}); diff --git a/js/dojo/dojox/mobile/app/_Widget.js b/js/dojo/dojox/mobile/app/_Widget.js new file mode 100644 index 0000000..7073df5 --- /dev/null +++ b/js/dojo/dojox/mobile/app/_Widget.js @@ -0,0 +1,34 @@ +//>>built +// wrapped by build app +define("dojox/mobile/app/_Widget", ["dijit","dojo","dojox","dojo/require!dijit/_WidgetBase"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app._Widget"); +dojo.experimental("dojox.mobile.app._Widget"); + +dojo.require("dijit._WidgetBase"); + +dojo.declare("dojox.mobile.app._Widget", dijit._WidgetBase, { + // summary: + // The base mobile app widget. + + getScroll: function(){ + // summary: + // Returns the scroll position. + return { + x: dojo.global.scrollX, + y: dojo.global.scrollY + }; + }, + + connect: function(target, event, fn){ + if(event.toLowerCase() == "dblclick" + || event.toLowerCase() == "ondblclick"){ + + if(dojo.global["Mojo"]){ + // Handle webOS tap event + return this.connect(target, Mojo.Event.tap, fn); + } + } + return this.inherited(arguments); + } +}); +}); diff --git a/js/dojo/dojox/mobile/app/_base.js b/js/dojo/dojox/mobile/app/_base.js new file mode 100644 index 0000000..c5d92a3 --- /dev/null +++ b/js/dojo/dojox/mobile/app/_base.js @@ -0,0 +1,242 @@ +//>>built +// wrapped by build app +define("dojox/mobile/app/_base", ["dijit","dojo","dojox","dojo/require!dijit/_base,dijit/_WidgetBase,dojox/mobile,dojox/mobile/parser,dojox/mobile/Button,dojox/mobile/app/_event,dojox/mobile/app/_Widget,dojox/mobile/app/StageController,dojox/mobile/app/SceneController,dojox/mobile/app/SceneAssistant,dojox/mobile/app/AlertDialog,dojox/mobile/app/List,dojox/mobile/app/ListSelector,dojox/mobile/app/TextBox,dojox/mobile/app/ImageView,dojox/mobile/app/ImageThumbView"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app._base"); +dojo.experimental("dojox.mobile.app._base"); + +dojo.require("dijit._base"); +dojo.require("dijit._WidgetBase"); +dojo.require("dojox.mobile"); +dojo.require("dojox.mobile.parser"); +dojo.require("dojox.mobile.Button"); + +dojo.require("dojox.mobile.app._event"); +dojo.require("dojox.mobile.app._Widget"); +dojo.require("dojox.mobile.app.StageController"); +dojo.require("dojox.mobile.app.SceneController"); +dojo.require("dojox.mobile.app.SceneAssistant"); +dojo.require("dojox.mobile.app.AlertDialog"); +dojo.require("dojox.mobile.app.List"); +dojo.require("dojox.mobile.app.ListSelector"); +dojo.require("dojox.mobile.app.TextBox"); +dojo.require("dojox.mobile.app.ImageView"); +dojo.require("dojox.mobile.app.ImageThumbView"); + +(function(){ + + var stageController; + var appInfo; + + var jsDependencies = [ + "dojox.mobile", + "dojox.mobile.parser" + ]; + + var loadedResources = {}; + var loadingDependencies; + + var rootNode; + + var sceneResources = []; + + // Load the required resources asynchronously, since not all mobile OSes + // support dojo.require and sync XHR + function loadResources(resources, callback){ + // summary: + // Loads one or more JavaScript files asynchronously. When complete, + // the first scene is pushed onto the stack. + // resources: + // An array of module names, e.g. 'dojox.mobile.AlertDialog' + + var resource; + var url; + + do { + resource = resources.pop(); + if (resource.source) { + url = resource.source; + }else if (resource.module) { + url= dojo.moduleUrl(resource.module)+".js"; + }else { + console.log("Error: invalid JavaScript resource " + dojo.toJson(resource)); + return; + } + }while (resources.length > 0 && loadedResources[url]); + + if(resources.length < 1 && loadedResources[url]){ + // All resources have already been loaded + callback(); + return; + } + + dojo.xhrGet({ + url: url, + sync: false + }).addCallbacks(function(text){ + dojo["eval"](text); + loadedResources[url] = true; + if(resources.length > 0){ + loadResources(resources, callback); + }else{ + callback(); + } + }, + function(){ + console.log("Failed to load resource " + url); + }); + } + + var pushFirstScene = function(){ + // summary: + // Pushes the first scene onto the stack. + + stageController = new dojox.mobile.app.StageController(rootNode); + var defaultInfo = { + id: "com.test.app", + version: "1.0.0", + initialScene: "main" + }; + + // If the application info has been defined, as it should be, + // use it. + if(dojo.global["appInfo"]){ + dojo.mixin(defaultInfo, dojo.global["appInfo"]); + } + appInfo = dojox.mobile.app.info = defaultInfo; + + // Set the document title from the app info title if it exists + if(appInfo.title){ + var titleNode = dojo.query("head title")[0] || + dojo.create("title", {},dojo.query("head")[0]); + document.title = appInfo.title; + } + + stageController.pushScene(appInfo.initialScene); + }; + + var initBackButton = function(){ + var hasNativeBack = false; + if(dojo.global.BackButton){ + // Android phonegap support + BackButton.override(); + dojo.connect(document, 'backKeyDown', function(e) { + dojo.publish("/dojox/mobile/app/goback"); + }); + hasNativeBack = true; + }else if(dojo.global.Mojo){ + // TODO: add webOS support + } + if(hasNativeBack){ + dojo.addClass(dojo.body(), "mblNativeBack"); + } + }; + + dojo.mixin(dojox.mobile.app, { + init: function(node){ + // summary: + // Initializes the mobile app. Creates the + + rootNode = node || dojo.body(); + dojox.mobile.app.STAGE_CONTROLLER_ACTIVE = true; + + dojo.subscribe("/dojox/mobile/app/goback", function(){ + stageController.popScene(); + }); + + dojo.subscribe("/dojox/mobile/app/alert", function(params){ + dojox.mobile.app.getActiveSceneController().showAlertDialog(params); + }); + + dojo.subscribe("/dojox/mobile/app/pushScene", function(sceneName, params){ + stageController.pushScene(sceneName, params || {}); + }); + + // Get the list of files to load per scene/view + dojo.xhrGet({ + url: "view-resources.json", + load: function(data){ + var resources = []; + + if(data){ + // Should be an array + sceneResources = data = dojo.fromJson(data); + + // Get the list of files to load that have no scene + // specified, and therefore should be loaded on + // startup + for(var i = 0; i < data.length; i++){ + if(!data[i].scene){ + resources.push(data[i]); + } + } + } + if(resources.length > 0){ + loadResources(resources, pushFirstScene); + }else{ + pushFirstScene(); + } + }, + error: pushFirstScene + }); + + initBackButton(); + }, + + getActiveSceneController: function(){ + // summary: + // Gets the controller for the active scene. + + return stageController.getActiveSceneController(); + }, + + getStageController: function(){ + // summary: + // Gets the stage controller. + return stageController; + }, + + loadResources: function(resources, callback){ + loadResources(resources, callback); + }, + + loadResourcesForScene: function(sceneName, callback){ + var resources = []; + + // Get the list of files to load that have no scene + // specified, and therefore should be loaded on + // startup + for(var i = 0; i < sceneResources.length; i++){ + if(sceneResources[i].scene == sceneName){ + resources.push(sceneResources[i]); + } + } + + if(resources.length > 0){ + loadResources(resources, callback); + }else{ + callback(); + } + }, + + resolveTemplate: function(sceneName){ + // summary: + // Given the name of a scene, returns the path to it's template + // file. For example, for a scene named 'main', the file + // returned is 'app/views/main/main-scene.html' + // This function can be overridden if it is desired to have + // a different name to file mapping. + return "app/views/" + sceneName + "/" + sceneName + "-scene.html"; + }, + + resolveAssistant: function(sceneName){ + // summary: + // Given the name of a scene, returns the path to it's assistant + // file. For example, for a scene named 'main', the file + // returned is 'app/assistants/main-assistant.js' + // This function can be overridden if it is desired to have + // a different name to file mapping. + return "app/assistants/" + sceneName + "-assistant.js"; + } + }); +})(); +}); diff --git a/js/dojo/dojox/mobile/app/_event.js b/js/dojo/dojox/mobile/app/_event.js new file mode 100644 index 0000000..f388db2 --- /dev/null +++ b/js/dojo/dojox/mobile/app/_event.js @@ -0,0 +1,124 @@ +//>>built +// wrapped by build app +define("dojox/mobile/app/_event", ["dijit","dojo","dojox"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app._event"); +dojo.experimental("dojox.mobile.app._event.js"); + +dojo.mixin(dojox.mobile.app, { + eventMap: {}, + + connectFlick: function(target, context, method){ + // summary: + // Listens for a flick event on a DOM node. If the mouse/touch + // moves more than 15 pixels in any given direction it is a flick. + // The synthetic event fired specifies the direction as + // <ul> + // <li><b>'ltr'</b> Left To Right</li> + // <li><b>'rtl'</b> Right To Left</li> + // <li><b>'ttb'</b> Top To Bottom</li> + // <li><b>'btt'</b> Bottom To Top</li> + // </ul> + // target: Node + // The DOM node to connect to + + var startX; + var startY; + var isFlick = false; + + var currentX; + var currentY; + + var connMove; + var connUp; + + var direction; + + var time; + + // Listen to to the mousedown/touchstart event + var connDown = dojo.connect("onmousedown", target, function(event){ + isFlick = false; + startX = event.targetTouches ? event.targetTouches[0].clientX : event.clientX; + startY = event.targetTouches ? event.targetTouches[0].clientY : event.clientY; + + time = (new Date()).getTime(); + + connMove = dojo.connect(target, "onmousemove", onMove); + connUp = dojo.connect(target, "onmouseup", onUp); + }); + + // The function that handles the mousemove/touchmove event + var onMove = function(event){ + dojo.stopEvent(event); + + currentX = event.targetTouches ? event.targetTouches[0].clientX : event.clientX; + currentY = event.targetTouches ? event.targetTouches[0].clientY : event.clientY; + if(Math.abs(Math.abs(currentX) - Math.abs(startX)) > 15){ + isFlick = true; + + direction = (currentX > startX) ? "ltr" : "rtl"; + }else if(Math.abs(Math.abs(currentY) - Math.abs(startY)) > 15){ + isFlick = true; + + direction = (currentY > startY) ? "ttb" : "btt"; + } + }; + + var onUp = function(event){ + dojo.stopEvent(event); + + connMove && dojo.disconnect(connMove); + connUp && dojo.disconnect(connUp); + + if(isFlick){ + var flickEvt = { + target: target, + direction: direction, + duration: (new Date()).getTime() - time + }; + if(context && method){ + context[method](flickEvt); + }else{ + method(flickEvt); + } + } + }; + + } +}); + +dojox.mobile.app.isIPhone = (dojo.isSafari + && (navigator.userAgent.indexOf("iPhone") > -1 || + navigator.userAgent.indexOf("iPod") > -1 + )); +dojox.mobile.app.isWebOS = (navigator.userAgent.indexOf("webOS") > -1); +dojox.mobile.app.isAndroid = (navigator.userAgent.toLowerCase().indexOf("android") > -1); + +if(dojox.mobile.app.isIPhone || dojox.mobile.app.isAndroid){ + // We are touchable. + // Override the dojo._connect function to replace mouse events with touch events + + dojox.mobile.app.eventMap = { + onmousedown: "ontouchstart", + mousedown: "ontouchstart", + onmouseup: "ontouchend", + mouseup: "ontouchend", + onmousemove: "ontouchmove", + mousemove: "ontouchmove" + }; + +} +dojo._oldConnect = dojo._connect; +dojo._connect = function(obj, event, context, method, dontFix){ + event = dojox.mobile.app.eventMap[event] || event; + if(event == "flick" || event == "onflick"){ + if(dojo.global["Mojo"]){ + event = Mojo.Event.flick; + } else{ + return dojox.mobile.app.connectFlick(obj, context, method); + } + } + + return dojo._oldConnect(obj, event, context, method, dontFix); +}; +}); diff --git a/js/dojo/dojox/mobile/app/compat.js b/js/dojo/dojox/mobile/app/compat.js new file mode 100644 index 0000000..2b4f1e7 --- /dev/null +++ b/js/dojo/dojox/mobile/app/compat.js @@ -0,0 +1,15 @@ +/* + 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 +*/ + +/* + This is an optimized version of Dojo, built for deployment and not for + development. To get sources and documentation, please visit: + + http://dojotoolkit.org +*/ + +//>>built +require({cache:{"dojox/main":function(){define(["dojo/_base/kernel"],function(_1){return _1.dojox;});},"dojox/mobile/compat":function(){define(["dojo/_base/lang","dojo/_base/sniff"],function(_2,_3){var dm=_2.getObject("dojox.mobile",true);if(!_3("webkit")){var s="dojox/mobile/_compat";require([s]);}return dm;});},"dijit/main":function(){define("dijit/main",["dojo/_base/kernel"],function(_4){return _4.dijit;});}}});require(["dojo/i18n"],function(_5){_5._preloadLocalizations("dojox/mobile/app/nls/compat",[]);});define("dojox/mobile/app/compat",["dijit","dojo","dojox","dojo/require!dojox/mobile/compat"],function(_6,_7,_8){_7.provide("dojox.mobile.app.compat");_7.require("dojox.mobile.compat");_7.extend(_8.mobile.app.AlertDialog,{_doTransition:function(_9){var h=_7.marginBox(this.domNode.firstChild).h;var _a=this.controller.getWindowSize().h;var _b=_a-h;var _c=_a;var _d=_7.fx.slideTo({node:this.domNode,duration:400,top:{start:_9<0?_b:_c,end:_9<0?_c:_b}});var _e=_7[_9<0?"fadeOut":"fadeIn"]({node:this.mask,duration:400});var _f=_7.fx.combine([_d,_e]);var _10=this;_7.connect(_f,"onEnd",this,function(){if(_9<0){_10.domNode.style.display="none";_7.destroy(_10.domNode);_7.destroy(_10.mask);}});_f.play();}});_7.extend(_8.mobile.app.List,{deleteRow:function(){var row=this._selectedRow;_7.style(row,{visibility:"hidden",minHeight:"0px"});_7.removeClass(row,"hold");var _11=_7.contentBox(row).h;_7.animateProperty({node:row,duration:800,properties:{height:{start:_11,end:1},paddingTop:{end:0},paddingBottom:{end:0}},onEnd:this._postDeleteAnim}).play();}});if(_8.mobile.app.ImageView&&!_7.create("canvas").getContext){_7.extend(_8.mobile.app.ImageView,{buildRendering:function(){this.domNode.innerHTML="ImageView widget is not supported on this browser."+"Please try again with a modern browser, e.g. "+"Safari, Chrome or Firefox";this.canvas={};},postCreate:function(){}});}if(_8.mobile.app.ImageThumbView){_7.extend(_8.mobile.app.ImageThumbView,{place:function(_12,x,y){_7.style(_12,{top:y+"px",left:x+"px",visibility:"visible"});}});}});
\ No newline at end of file diff --git a/js/dojo/dojox/mobile/app/compat.js.uncompressed.js b/js/dojo/dojox/mobile/app/compat.js.uncompressed.js new file mode 100644 index 0000000..a0ef1bd --- /dev/null +++ b/js/dojo/dojox/mobile/app/compat.js.uncompressed.js @@ -0,0 +1,169 @@ +/* + 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 +*/ + +/* + This is an optimized version of Dojo, built for deployment and not for + development. To get sources and documentation, please visit: + + http://dojotoolkit.org +*/ + +//>>built +require({cache:{ +'dojox/main':function(){ +define(["dojo/_base/kernel"], function(dojo) { + // module: + // dojox/main + // summary: + // The dojox package main module; dojox package is somewhat unusual in that the main module currently just provides an empty object. + + return dojo.dojox; +}); +}, +'dojox/mobile/compat':function(){ +define([ + "dojo/_base/lang", + "dojo/_base/sniff" +], function(lang, has){ + var dm = lang.getObject("dojox.mobile", true); + if(!has("webkit")){ + var s = "dojox/mobile/_compat"; // assign to a variable so as not to be picked up by the build tool + require([s]); + } + return dm; +}); + +}, +'dijit/main':function(){ +define("dijit/main", [ + "dojo/_base/kernel" +], function(dojo){ + // module: + // dijit + // summary: + // The dijit package main module + + return dojo.dijit; +}); + +}}}); + +require(["dojo/i18n"], function(i18n){ +i18n._preloadLocalizations("dojox/mobile/app/nls/compat", []); +}); +// wrapped by build app +define("dojox/mobile/app/compat", ["dijit","dojo","dojox","dojo/require!dojox/mobile/compat"], function(dijit,dojo,dojox){ +dojo.provide("dojox.mobile.app.compat"); +dojo.require("dojox.mobile.compat"); + +// summary: +// CSS3 compatibility module for apps +// description: +// This module provides support for some of the CSS3 features to djMobile +// for non-CSS3 browsers, such as IE or Firefox. +// If you load this module, it directly replaces some of the methods of +// djMobile instead of subclassing. This way, html pages remains the same +// regardless of whether this compatibility module is used or not. +// Recommended usage is as follows. the code below loads dojox.mobile.compat +// only when isWebKit is true. +// +// dojo.require("dojox.mobile"); +// dojo.requireIf(!dojo.isWebKit, "dojox.mobile.appCompat"); + +dojo.extend(dojox.mobile.app.AlertDialog, { + _doTransition: function(dir){ + console.log("in _doTransition and this = ", this); + + var h = dojo.marginBox(this.domNode.firstChild).h; + + var bodyHeight = this.controller.getWindowSize().h; + + var high = bodyHeight - h; + var low = bodyHeight; + + var anim1 = dojo.fx.slideTo({ + node: this.domNode, + duration: 400, + top: {start: dir < 0 ? high : low, end: dir < 0 ? low: high} + }); + + var anim2 = dojo[dir < 0 ? "fadeOut" : "fadeIn"]({ + node: this.mask, + duration: 400 + }); + + var anim = dojo.fx.combine([anim1, anim2]); + + var _this = this; + + dojo.connect(anim, "onEnd", this, function(){ + if(dir < 0){ + _this.domNode.style.display = "none"; + dojo.destroy(_this.domNode); + dojo.destroy(_this.mask); + } + }); + anim.play(); + } +}); + +dojo.extend(dojox.mobile.app.List, { + deleteRow: function(){ + console.log("deleteRow in compat mode", row); + + var row = this._selectedRow; + // First make the row invisible + // Put it back where it came from + dojo.style(row, { + visibility: "hidden", + minHeight: "0px" + }); + dojo.removeClass(row, "hold"); + + + // Animate reducing it's height to zero, then delete the data from the + // array + var height = dojo.contentBox(row).h; + dojo.animateProperty({ + node: row, + duration: 800, + properties: { + height: {start: height, end: 1}, + paddingTop: {end: 0}, + paddingBottom: {end: 0} + }, + onEnd: this._postDeleteAnim + }).play(); + } +}); + +if(dojox.mobile.app.ImageView && !dojo.create("canvas").getContext){ + dojo.extend(dojox.mobile.app.ImageView, { + buildRendering: function(){ + this.domNode.innerHTML = + "ImageView widget is not supported on this browser." + + "Please try again with a modern browser, e.g. " + + "Safari, Chrome or Firefox"; + this.canvas = {}; + }, + + postCreate: function(){} + }); +} + +if(dojox.mobile.app.ImageThumbView){ + dojo.extend(dojox.mobile.app.ImageThumbView, { + place: function(node, x, y){ + dojo.style(node, { + top: y + "px", + left: x + "px", + visibility: "visible" + }); + } + }) +} + +}); diff --git a/js/dojo/dojox/mobile/build/build.bat b/js/dojo/dojox/mobile/build/build.bat new file mode 100644 index 0000000..adf5820 --- /dev/null +++ b/js/dojo/dojox/mobile/build/build.bat @@ -0,0 +1,34 @@ +@echo off + +rem Build script for dojox.mobile + +if "%1"=="separate" goto ok +if "%1"=="single" goto ok +echo Usage: build separate^|single [webkit] +echo separate Create mobile.js that includes only dojox.mobile +echo single Create a single dojo.js layer that includes dojox.mobile +echo webkit Enable webkitMobile=true option (Loses PC browser support) +goto end +:ok + +rem set optimize=shrinksafe +set optimize=closure +set profile=mobile +set dir=release-mobile-separate +set webkit= +rem set standalone=standaloneScrollable=true +if "%~1"=="single" set profile=mobile-all +if "%~1"=="single" set dir=release-mobile-single +shift +if not "%~1"=="webkit" goto skip1 +set webkit=webkitMobile=true +shift +:skip1 + +cd ..\..\..\util\buildscripts + +call build profile=%profile% action=release optimize=%optimize% layerOptimize=%optimize% cssOptimize=comments releaseDir=../../%dir%/ %webkit% %standalone% %~1 %~2 %~3 %~4 %~5 %~6 %~7 %~8 %~9 + +cd ..\..\dojox\mobile\build + +:end diff --git a/js/dojo/dojox/mobile/build/build.sh b/js/dojo/dojox/mobile/build/build.sh new file mode 100644 index 0000000..6ecb656 --- /dev/null +++ b/js/dojo/dojox/mobile/build/build.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +# Build script for dojox.mobile + +if [ $# -eq 0 ]; then + echo 'Usage: build separate|single [webkit]' + echo ' separate Create mobile.js that includes only dojox.mobile' + echo ' single Create a single dojo.js layer that includes dojox.mobile' + echo ' webkit Enable webkitMobile=true option (Loses PC browser support)' + exit 1 +fi + +#optimize=shrinksafe +optimize=closure +profile=mobile +dir=release-mobile-separate +webkit= +#standalone=standaloneScrollable=true +if [ "$1" == "single" ]; then + profile=mobile-all +fi +if [ "$1" == "single" ]; then + dir=release-mobile-single +fi +shift 1 +if [ "$1" == "webkit" ]; then + webkit=webkitMobile=true + shift 1 +fi + +cd ../../../util/buildscripts + +./build.sh profile=$profile action=release optimize=$optimize layerOptimize=$optimize cssOptimize=comments releaseDir=../../$dir/ $webkit $standalone $* + +cd ../../dojox/mobile/build diff --git a/js/dojo/dojox/mobile/common.js b/js/dojo/dojox/mobile/common.js new file mode 100644 index 0000000..3ea911b --- /dev/null +++ b/js/dojo/dojox/mobile/common.js @@ -0,0 +1,497 @@ +//>>built +define("dojox/mobile/common", [ + "dojo/_base/kernel", // to test dojo.hash + "dojo/_base/array", + "dojo/_base/config", + "dojo/_base/connect", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-style", +// "dojo/hash", // optionally prereq'ed + "dojo/ready", + "dijit/registry", // registry.toArray + "./sniff", + "./uacss" +], function(dojo, array, config, connect, lang, win, domClass, domConstruct, domStyle, ready, registry, has, uacss){ + + var dm = lang.getObject("dojox.mobile", true); +/*===== + var dm = dojox.mobile; +=====*/ + + // module: + // dojox/mobile/common + // summary: + // A common module for dojox.mobile. + // description: + // This module includes common utility functions that are used by + // dojox.mobile widgets. Also, it provides functions that are commonly + // necessary for mobile web applications, such as the hide address bar + // function. + + dm.getScreenSize = function(){ + // summary: + // Returns the dimensions of the browser window. + return { + h: win.global.innerHeight || win.doc.documentElement.clientHeight, + w: win.global.innerWidth || win.doc.documentElement.clientWidth + }; + }; + + dm.updateOrient = function(){ + // summary: + // Updates the orientation specific css classes, 'dj_portrait' and + // 'dj_landscape'. + var dim = dm.getScreenSize(); + domClass.replace(win.doc.documentElement, + dim.h > dim.w ? "dj_portrait" : "dj_landscape", + dim.h > dim.w ? "dj_landscape" : "dj_portrait"); + }; + dm.updateOrient(); + + dm.tabletSize = 500; + dm.detectScreenSize = function(/*Boolean?*/force){ + // summary: + // Detects the screen size and determines if the screen is like + // phone or like tablet. If the result is changed, + // it sets either of the following css class to <html> + // - 'dj_phone' + // - 'dj_tablet' + // and it publishes either of the following events. + // - '/dojox/mobile/screenSize/phone' + // - '/dojox/mobile/screenSize/tablet' + var dim = dm.getScreenSize(); + var sz = Math.min(dim.w, dim.h); + var from, to; + if(sz >= dm.tabletSize && (force || (!this._sz || this._sz < dm.tabletSize))){ + from = "phone"; + to = "tablet"; + }else if(sz < dm.tabletSize && (force || (!this._sz || this._sz >= dm.tabletSize))){ + from = "tablet"; + to = "phone"; + } + if(to){ + domClass.replace(win.doc.documentElement, "dj_"+to, "dj_"+from); + connect.publish("/dojox/mobile/screenSize/"+to, [dim]); + } + this._sz = sz; + }; + dm.detectScreenSize(); + + dm.setupIcon = function(/*DomNode*/iconNode, /*String*/iconPos){ + // summary: + // Sets up CSS sprite for a foreground image. + if(iconNode && iconPos){ + var arr = array.map(iconPos.split(/[ ,]/),function(item){return item-0}); + var t = arr[0]; // top + var r = arr[1] + arr[2]; // right + var b = arr[0] + arr[3]; // bottom + var l = arr[1]; // left + domStyle.set(iconNode, { + clip: "rect("+t+"px "+r+"px "+b+"px "+l+"px)", + top: (iconNode.parentNode ? domStyle.get(iconNode, "top") : 0) - t + "px", + left: -l + "px" + }); + } + }; + + // dojox.mobile.hideAddressBarWait: Number + // The time in milliseconds to wait before the fail-safe hiding address + // bar runs. The value must be larger than 800. + dm.hideAddressBarWait = typeof(config["mblHideAddressBarWait"]) === "number" ? + config["mblHideAddressBarWait"] : 1500; + + dm.hide_1 = function(force){ + // summary: + // Internal function to hide the address bar. + scrollTo(0, 1); + var h = dm.getScreenSize().h + "px"; + if(has("android")){ + if(force){ + win.body().style.minHeight = h; + } + dm.resizeAll(); + }else{ + if(force || dm._h === h && h !== win.body().style.minHeight){ + win.body().style.minHeight = h; + dm.resizeAll(); + } + } + dm._h = h; + }; + + dm.hide_fs = function(){ + // summary: + // Internal function to hide the address bar for fail-safe. + // description: + // Resets the height of the body, performs hiding the address + // bar, and calls resizeAll(). + // This is for fail-safe, in case of failure to complete the + // address bar hiding in time. + var t = win.body().style.minHeight; + win.body().style.minHeight = (dm.getScreenSize().h * 2) + "px"; // to ensure enough height for scrollTo to work + scrollTo(0, 1); + setTimeout(function(){ + dm.hide_1(1); + dm._hiding = false; + }, 1000); + }; + dm.hideAddressBar = function(/*Event?*/evt){ + // summary: + // Hides the address bar. + // description: + // Tries hiding of the address bar a couple of times to do it as + // quick as possible while ensuring resize is done after the hiding + // finishes. + if(dm.disableHideAddressBar || dm._hiding){ return; } + dm._hiding = true; + dm._h = 0; + win.body().style.minHeight = (dm.getScreenSize().h * 2) + "px"; // to ensure enough height for scrollTo to work + setTimeout(dm.hide_1, 0); + setTimeout(dm.hide_1, 200); + setTimeout(dm.hide_1, 800); + setTimeout(dm.hide_fs, dm.hideAddressBarWait); + }; + + dm.resizeAll = function(/*Event?*/evt, /*Widget?*/root){ + // summary: + // Call the resize() method of all the top level resizable widgets. + // description: + // Find all widgets that do not have a parent or the parent does not + // have the resize() method, and call resize() for them. + // If a widget has a parent that has resize(), call of the widget's + // resize() is its parent's responsibility. + // evt: + // Native event object + // root: + // If specified, search the specified widget recursively for top level + // resizable widgets. + // root.resize() is always called regardless of whether root is a + // top level widget or not. + // If omitted, search the entire page. + if(dm.disableResizeAll){ return; } + connect.publish("/dojox/mobile/resizeAll", [evt, root]); + dm.updateOrient(); + dm.detectScreenSize(); + var isTopLevel = function(w){ + var parent = w.getParent && w.getParent(); + return !!((!parent || !parent.resize) && w.resize); + }; + var resizeRecursively = function(w){ + array.forEach(w.getChildren(), function(child){ + if(isTopLevel(child)){ child.resize(); } + resizeRecursively(child); + }); + }; + if(root){ + if(root.resize){ root.resize(); } + resizeRecursively(root); + }else{ + array.forEach(array.filter(registry.toArray(), isTopLevel), + function(w){ w.resize(); }); + } + }; + + dm.openWindow = function(url, target){ + // summary: + // Opens a new browser window with the given url. + win.global.open(url, target || "_blank"); + }; + + dm.createDomButton = function(/*DomNode*/refNode, /*Object?*/style, /*DomNode?*/toNode){ + // summary: + // Creates a DOM button. + // description: + // DOM button is a simple graphical object that consists of one or + // more nested DIV elements with some CSS styling. It can be used + // in place of an icon image on ListItem, IconItem, and so on. + // The kind of DOM button to create is given as a class name of + // refNode. The number of DIVs to create is searched from the style + // sheets in the page. However, if the class name has a suffix that + // starts with an underscore, like mblDomButtonGoldStar_5, then the + // suffixed number is used instead. A class name for DOM button + // must starts with 'mblDomButton'. + // refNode: + // A node that has a DOM button class name. + // style: + // A hash object to set styles to the node. + // toNode: + // A root node to create a DOM button. If omitted, refNode is used. + + if(!dm._domButtons){ + if(has("webkit")){ + var findDomButtons = function(sheet, dic){ + // summary: + // Searches the style sheets for DOM buttons. + // description: + // Returns a key-value pair object whose keys are DOM + // button class names and values are the number of DOM + // elements they need. + var i, j; + if(!sheet){ + var dic = {}; + var ss = dojo.doc.styleSheets; + for (i = 0; i < ss.length; i++){ + ss[i] && findDomButtons(ss[i], dic); + } + return dic; + } + var rules = sheet.cssRules || []; + for (i = 0; i < rules.length; i++){ + var rule = rules[i]; + if(rule.href && rule.styleSheet){ + findDomButtons(rule.styleSheet, dic); + }else if(rule.selectorText){ + var sels = rule.selectorText.split(/,/); + for (j = 0; j < sels.length; j++){ + var sel = sels[j]; + var n = sel.split(/>/).length - 1; + if(sel.match(/(mblDomButton\w+)/)){ + var cls = RegExp.$1; + if(!dic[cls] || n > dic[cls]){ + dic[cls] = n; + } + } + } + } + } + } + dm._domButtons = findDomButtons(); + }else{ + dm._domButtons = {}; + } + } + + var s = refNode.className; + var node = toNode || refNode; + if(s.match(/(mblDomButton\w+)/) && s.indexOf("/") === -1){ + var btnClass = RegExp.$1; + var nDiv = 4; + if(s.match(/(mblDomButton\w+_(\d+))/)){ + nDiv = RegExp.$2 - 0; + }else if(dm._domButtons[btnClass] !== undefined){ + nDiv = dm._domButtons[btnClass]; + } + var props = null; + if(has("bb") && config["mblBBBoxShadowWorkaround"] !== false){ + // Removes box-shadow because BlackBerry incorrectly renders it. + props = {style:"-webkit-box-shadow:none"}; + } + for(var i = 0, p = node; i < nDiv; i++){ + p = p.firstChild || domConstruct.create("DIV", props, p); + } + if(toNode){ + setTimeout(function(){ + domClass.remove(refNode, btnClass); + }, 0); + domClass.add(toNode, btnClass); + } + }else if(s.indexOf(".") !== -1){ // file name + domConstruct.create("IMG", {src:s}, node); + }else{ + return null; + } + domClass.add(node, "mblDomButton"); + if(config["mblAndroidWorkaround"] !== false && has("android") >= 2.2){ + // Android workaround for the issue that domButtons' -webkit-transform styles sometimes invalidated + // by applying -webkit-transform:translated3d(x,y,z) style programmatically to non-ancestor elements, + // which results in breaking domButtons. + domStyle.set(node, "webkitTransform", "translate3d(0,0,0)"); + } + !!style && domStyle.set(node, style); + return node; + }; + + dm.createIcon = function(/*String*/icon, /*String*/iconPos, /*DomNode*/node, /*String?*/title, /*DomNode?*/parent){ + // summary: + // Creates or updates an icon node + // description: + // If node exists, updates the existing node. Otherwise, creates a new one. + // icon: + // Path for an image, or DOM button class name. + if(icon && icon.indexOf("mblDomButton") === 0){ + // DOM button + if(node && node.className.match(/(mblDomButton\w+)/)){ + domClass.remove(node, RegExp.$1); + }else{ + node = domConstruct.create("DIV"); + } + node.title = title; + domClass.add(node, icon); + dm.createDomButton(node); + }else if(icon && icon !== "none"){ + // Image + if(!node || node.nodeName !== "IMG"){ + node = domConstruct.create("IMG", { + alt: title + }); + } + node.src = (icon || "").replace("${theme}", dm.currentTheme); + dm.setupIcon(node, iconPos); + if(parent && iconPos){ + var arr = iconPos.split(/[ ,]/); + domStyle.set(parent, { + width: arr[2] + "px", + height: arr[3] + "px" + }); + } + } + if(parent){ + parent.appendChild(node); + } + return node; + }; + + // flag for iphone flicker workaround + dm._iw = config["mblIosWorkaround"] !== false && has("iphone"); + if(dm._iw){ + dm._iwBgCover = domConstruct.create("div"); // Cover to hide flicker in the background + } + + if(config.parseOnLoad){ + ready(90, function(){ + // avoid use of query + /* + var list = query('[lazy=true] [dojoType]', null); + list.forEach(function(node, index, nodeList){ + node.setAttribute("__dojoType", node.getAttribute("dojoType")); + node.removeAttribute("dojoType"); + }); + */ + + var nodes = win.body().getElementsByTagName("*"); + var i, len, s; + len = nodes.length; + for(i = 0; i < len; i++){ + s = nodes[i].getAttribute("dojoType"); + if(s){ + if(nodes[i].parentNode.getAttribute("lazy") == "true"){ + nodes[i].setAttribute("__dojoType", s); + nodes[i].removeAttribute("dojoType"); + } + } + } + }); + } + + ready(function(){ + dm.detectScreenSize(true); + if(config["mblApplyPageStyles"] !== false){ + domClass.add(win.doc.documentElement, "mobile"); + } + if(has("chrome")){ + // dojox.mobile does not load uacss (only _compat does), but we need dj_chrome. + domClass.add(win.doc.documentElement, "dj_chrome"); + } + + if(config["mblAndroidWorkaround"] !== false && has("android") >= 2.2){ // workaround for android screen flicker problem + if(config["mblAndroidWorkaroundButtonStyle"] !== false){ + // workaround to avoid buttons disappear due to the side-effect of the webkitTransform workaroud below + domConstruct.create("style", {innerHTML:"BUTTON,INPUT[type='button'],INPUT[type='submit'],INPUT[type='reset'],INPUT[type='file']::-webkit-file-upload-button{-webkit-appearance:none;}"}, win.doc.head, "first"); + } + if(has("android") < 3){ // for Android 2.2.x and 2.3.x + domStyle.set(win.doc.documentElement, "webkitTransform", "translate3d(0,0,0)"); + // workaround for auto-scroll issue when focusing input fields + connect.connect(null, "onfocus", null, function(e){ + domStyle.set(win.doc.documentElement, "webkitTransform", ""); + }); + connect.connect(null, "onblur", null, function(e){ + domStyle.set(win.doc.documentElement, "webkitTransform", "translate3d(0,0,0)"); + }); + }else{ // for Android 3.x + if(config["mblAndroid3Workaround"] !== false){ + domStyle.set(win.doc.documentElement, { + webkitBackfaceVisibility: "hidden", + webkitPerspective: 8000 + }); + } + } + } + + // You can disable hiding the address bar with the following djConfig. + // var djConfig = { mblHideAddressBar: false }; + var f = dm.resizeAll; + if(config["mblHideAddressBar"] !== false && + navigator.appVersion.indexOf("Mobile") != -1 || + config["mblForceHideAddressBar"] === true){ + dm.hideAddressBar(); + if(config["mblAlwaysHideAddressBar"] === true){ + f = dm.hideAddressBar; + } + } + connect.connect(null, (win.global.onorientationchange !== undefined && !has("android")) + ? "onorientationchange" : "onresize", null, f); + + // avoid use of query + /* + var list = query('[__dojoType]', null); + list.forEach(function(node, index, nodeList){ + node.setAttribute("dojoType", node.getAttribute("__dojoType")); + node.removeAttribute("__dojoType"); + }); + */ + + var nodes = win.body().getElementsByTagName("*"); + var i, len = nodes.length, s; + for(i = 0; i < len; i++){ + s = nodes[i].getAttribute("__dojoType"); + if(s){ + nodes[i].setAttribute("dojoType", s); + nodes[i].removeAttribute("__dojoType"); + } + } + + if(dojo.hash){ + // find widgets under root recursively + var findWidgets = function(root){ + if(!root){ return []; } + var arr = registry.findWidgets(root); + var widgets = arr; + for(var i = 0; i < widgets.length; i++){ + arr = arr.concat(findWidgets(widgets[i].containerNode)); + } + return arr; + }; + connect.subscribe("/dojo/hashchange", null, function(value){ + var view = dm.currentView; + if(!view){ return; } + var params = dm._params; + if(!params){ // browser back/forward button was pressed + var moveTo = value ? value : dm._defaultView.id; + var widgets = findWidgets(view.domNode); + var dir = 1, transition = "slide"; + for(i = 0; i < widgets.length; i++){ + var w = widgets[i]; + if("#"+moveTo == w.moveTo){ + // found a widget that has the given moveTo + transition = w.transition; + dir = (w instanceof dm.Heading) ? -1 : 1; + break; + } + } + params = [ moveTo, dir, transition ]; + } + view.performTransition.apply(view, params); + dm._params = null; + }); + } + + win.body().style.visibility = "visible"; + }); + + // To search _parentNode first. TODO:1.8 reconsider this redefinition. + registry.getEnclosingWidget = function(node){ + while(node){ + var id = node.getAttribute && node.getAttribute("widgetId"); + if(id){ + return registry.byId(id); + } + node = node._parentNode || node.parentNode; + } + return null; + }; + + return dm; +}); diff --git a/js/dojo/dojox/mobile/compat.js b/js/dojo/dojox/mobile/compat.js new file mode 100644 index 0000000..3dc33cc --- /dev/null +++ b/js/dojo/dojox/mobile/compat.js @@ -0,0 +1,15 @@ +/* + 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 +*/ + +/* + This is an optimized version of Dojo, built for deployment and not for + development. To get sources and documentation, please visit: + + http://dojotoolkit.org +*/ + +//>>built +require(["dojo/i18n"],function(_1){_1._preloadLocalizations("dojox/mobile/nls/compat",[]);});define("dojox/mobile/compat",["dojo/_base/lang","dojo/_base/sniff"],function(_2,_3){var dm=_2.getObject("dojox.mobile",true);if(!_3("webkit")){var s="dojox/mobile/_compat";require([s]);}return dm;});
\ No newline at end of file diff --git a/js/dojo/dojox/mobile/compat.js.uncompressed.js b/js/dojo/dojox/mobile/compat.js.uncompressed.js new file mode 100644 index 0000000..045f0da --- /dev/null +++ b/js/dojo/dojox/mobile/compat.js.uncompressed.js @@ -0,0 +1,29 @@ +/* + 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 +*/ + +/* + This is an optimized version of Dojo, built for deployment and not for + development. To get sources and documentation, please visit: + + http://dojotoolkit.org +*/ + +//>>built + +require(["dojo/i18n"], function(i18n){ +i18n._preloadLocalizations("dojox/mobile/nls/compat", []); +}); +define("dojox/mobile/compat", [ + "dojo/_base/lang", + "dojo/_base/sniff" +], function(lang, has){ + var dm = lang.getObject("dojox.mobile", true); + if(!has("webkit")){ + var s = "dojox/mobile/_compat"; // assign to a variable so as not to be picked up by the build tool + require([s]); + } + return dm; +}); diff --git a/js/dojo/dojox/mobile/deviceTheme.js b/js/dojo/dojox/mobile/deviceTheme.js new file mode 100644 index 0000000..6c9aefd --- /dev/null +++ b/js/dojo/dojox/mobile/deviceTheme.js @@ -0,0 +1,189 @@ +//>>built +define("dojox/mobile/deviceTheme", [ + "dojo/_base/array", + "dojo/_base/config", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-construct", + "require" +], function(array, config, lang, win, domClass, domConstruct, require){ + + var dm = lang.getObject("dojox.mobile", true); +/*===== + var dm = dojox.mobile +=====*/ + + // module: + // dojox/mobile/deviceTheme + // summary: + // Automatic Theme Loader + // description: + // Detects the User Agent of the browser and loads appropriate theme files. + // Simply dojo.require this module to enable the automatic theme loading. + // For simulations, the user agent may be overridden by setting djConfig.mblUserAgent. + // + // By default, an all-in-one theme file (e.g. themes/iphone/iphone.css) is + // loaded. The all-in-one theme files contain style sheets for all the + // dojox.mobile widgets regardless of whether they are used in your + // application or not. + // If you want to choose what theme files to load, you can specify them + // via djConfig as shown in the following example: + // + // | djConfig="parseOnLoad:true, mblThemeFiles:['base','Button']" + // + // Or you may want to use dojox.mobile.themeFiles as follows to get the + // same result. Note that the assignment has to be done before loading + // deviceTheme.js. + // + // | dojo.require("dojox.mobile"); + // | dojox.mobile.themeFiles = ['base','Button']; + // | dojo.require("dojox.mobile.deviceTheme"); + // + // In the case of this example, if iphone is detected, for example, the + // following files will be loaded: + // + // | dojox/mobile/themes/iphone/base.css + // | dojox/mobile/themes/iphone/Button.css + // + // If you want to load style sheets for your own custom widgets, you can + // specify a package name along with a theme file name in an array. + // + // | ['base',['com.acme','MyWidget']] + // + // In this case, the following files will be loaded. + // + // | dojox/mobile/themes/iphone/base.css + // | com/acme/themes/iphone/MyWidget.css + // + // If you specify '@theme' as a theme file name, it will be replaced with + // the theme folder name (e.g. 'iphone'). For example, + // + // | ['@theme',['com.acme','MyWidget']] + // + // will load the following files. + // + // | dojox/mobile/themes/iphone/iphone.css + // | com/acme/themes/iphone/MyWidget.css + // + // Note that the load of the theme files is performed asynchronously by + // the browser, and thus you cannot assume the load has been completed + // when your appliation is initialized. For example, if some widget in + // your application uses node dimensions that cannot be determined + // without CSS styles being applied to them to calculate its layout at + // initialization, the layout calculation may fail. + // Possible workaround for this problem is to use dojo.require to load + // deviceTheme.js and place it in a separate <script> block immediately + // below a script tag that loads dojo.js as below. This may (or may + // not) solve the problem. + // + // | <script src="dojo.js"></script> + // | <script> + // | dojo.require("dojox.mobile.deviceTheme"); + // | </script> + // | <script> + // | dojo.require("dojox.mobile"); + // | .... + // + // A better solution would be to not use deviceTheme and use <link> + // or @import instead to load the theme files. + + + dm.loadCssFile = function(/*String*/file){ + // summary: + // Loads the given CSS file programmatically. + dm.loadedCssFiles.push(domConstruct.create("LINK", { + href: file, + type: "text/css", + rel: "stylesheet" + }, win.doc.getElementsByTagName('head')[0])); + }; + + dm.themeMap = dm.themeMap || [ + // summary: + // A map of user-agents to theme files. + // description: + // The first array element is a regexp pattern that matches the + // userAgent string. + // + // The second array element is a theme folder name. + // + // The third array element is an array of css file paths to load. + // + // The matching is performed in the array order, and stops after the + // first match. + [ + "Android", + "android", + [] + ], + [ + "BlackBerry", + "blackberry", + [] + ], + [ + "iPad", + "iphone", + [require.toUrl("dojox/mobile/themes/iphone/ipad.css")] + ], + [ + "Custom", + "custom", + [] + ], + [ + ".*", + "iphone", + [] + ] + ]; + + dm.loadDeviceTheme = function(/*String?*/userAgent){ + // summary: + // Loads a device-specific theme according to the user-agent + // string. + // description: + // This function is automatically called when this module is + // evaluated. + var t = config["mblThemeFiles"] || dm.themeFiles || ["@theme"]; + if(!lang.isArray(t)){ console.log("loadDeviceTheme: array is expected but found: "+t); } + var i, j; + var m = dm.themeMap; + var ua = userAgent || config["mblUserAgent"] || (location.search.match(/theme=(\w+)/) ? RegExp.$1 : navigator.userAgent); + for(i = 0; i < m.length; i++){ + if(ua.match(new RegExp(m[i][0]))){ + var theme = m[i][1]; + domClass.replace(win.doc.documentElement, theme + "_theme", dm.currentTheme ? dm.currentTheme + "_theme" : ""); + dm.currentTheme = theme; + var files = [].concat(m[i][2]); + for(j = t.length - 1; j >= 0; j--){ + var pkg = lang.isArray(t[j]) ? (t[j][0]||"").replace(/\./g, '/') : "dojox/mobile"; + var name = lang.isArray(t[j]) ? t[j][1] : t[j]; + var f = "themes/" + theme + "/" + + (name === "@theme" ? theme : name) + ".css"; + files.unshift(require.toUrl(pkg+"/"+f)); + } + //remove old css files + array.forEach(dm.loadedCssFiles, function(n){ + n.parentNode.removeChild(n); + }); + dm.loadedCssFiles = []; + for(j = 0; j < files.length; j++){ + dm.loadCssFile(files[j].toString()); + } + if(userAgent && dm.loadCompatCssFiles){ // we will assume compat is loaded and ready.. + dm.loadCompatCssFiles(); + } + break; + } + } + }; + + if(dm.configDeviceTheme){ + dm.configDeviceTheme(); + } + dm.loadDeviceTheme(); + + return dm; +}); diff --git a/js/dojo/dojox/mobile/i18n.js b/js/dojo/dojox/mobile/i18n.js new file mode 100644 index 0000000..a237b3d --- /dev/null +++ b/js/dojo/dojox/mobile/i18n.js @@ -0,0 +1,47 @@ +//>>built +define("dojox/mobile/i18n", [ + "dojo/_base/lang", + "dojo/i18n", + "dijit/_WidgetBase" +], function(lang, di18n, WidgetBase){ + +/*===== + var WidgetBase = dijit._WidgetBase; +=====*/ + + // module: + // dojox/mobile/i18n + // summary: + // An internationalization utility for dojox.mobile-based user + // applications. + + var i18n = lang.getObject("dojox.mobile.i18n", true); +/*===== + var i18n = dojox.mobile.i18n; +=====*/ + + i18n.load = function(/*String*/packageName, /*String*/bundleName, /*String?*/locale){ + // summary: + // Loads an nls resouce bundle and returns an array of localized + // resources. + return i18n.registerBundle(di18n.getLocalization(packageName, bundleName, locale)); + }; + + i18n.registerBundle = function(/*Array*/bundle){ + // summary: + // Accumulates the given localized resouces in an array and returns + // it. + if(!i18n.bundle){ i18n.bundle = []; } + return lang.mixin(i18n.bundle, bundle); + }; + + lang.extend(WidgetBase, { + mblNoConv: false, + _cv: function(s){ + if(this.mblNoConv || !i18n.bundle){ return s; } + return i18n.bundle[lang.trim(s)] || s; + } + }); + + return i18n; +}); diff --git a/js/dojo/dojox/mobile/mobile-all.js b/js/dojo/dojox/mobile/mobile-all.js new file mode 100644 index 0000000..9cad213 --- /dev/null +++ b/js/dojo/dojox/mobile/mobile-all.js @@ -0,0 +1,48 @@ +//>>built +define("dojox/mobile/mobile-all", [ + "./_base", + "./compat", + "./Button", + "./Carousel", + "./CheckBox", + "./ComboBox", + "./ContentPane", + "./EdgeToEdgeDataList", + "./ExpandingTextArea", + "./FixedSplitter", + "./FixedSplitterPane", + "./FlippableView", + "./IconContainer", + "./IconItem", + "./Opener", + "./Overlay", + "./PageIndicator", + "./RadioButton", + "./RoundRectDataList", + "./ScrollableView", + "./Slider", + "./SpinWheel", + "./SpinWheelDatePicker", + "./SpinWheelSlot", + "./SpinWheelTimePicker", + "./SwapView", + "./Switch", + "./TabBar", + "./TabBarButton", + "./TextArea", + "./TextBox", + "./ToggleButton", + "./Tooltip", + "./transition", + "./TransitionEvent", + "./ViewController" +], function(common){ + // module: + // dojox/mobile/mobile-all + // summary: + // A rollup that includes every mobile module. You probably don't need this. + + console.warn("mobile-all may include much more code than your application actually requires. We strongly recommend that you investigate a custom build."); + + return common; +}); diff --git a/js/dojo/dojox/mobile/parser.js b/js/dojo/dojox/mobile/parser.js new file mode 100644 index 0000000..8450aa8 --- /dev/null +++ b/js/dojo/dojox/mobile/parser.js @@ -0,0 +1,114 @@ +//>>built +define("dojox/mobile/parser", [ + "dojo/_base/kernel", + "dojo/_base/config", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/ready" +], function(dojo, config, lang, win, ready){ + + // module: + // dojox/mobile/parser + // summary: + // A lightweight parser. + + var dm = lang.getObject("dojox.mobile", true); + + var parser = new function(){ + // summary: + // A lightweight parser. + // description: + // dojox.mobile.parser is an extremely small subset of + // dojo.parser. It has no extended features over dojo.parser, so + // there is no reason you have to use dojox.mobile.parser instead + // of dojo.parser. However, if dojox.mobile.parser's capability is + // enough for your application, use of it could reduce the total + // code size. + + this.instantiate = function(/* Array */nodes, /* Object? */mixin, /* Object? */args){ + // summary: + // Function for instantiating a list of widget nodes. + // nodes: + // The list of DOMNodes to walk and instantiate widgets on. + mixin = mixin || {}; + args = args || {}; + var i, ws = []; + if(nodes){ + for(i = 0; i < nodes.length; i++){ + var n = nodes[i]; + var cls = lang.getObject(n.getAttribute("dojoType") || n.getAttribute("data-dojo-type")); + var proto = cls.prototype; + var params = {}, prop, v, t; + lang.mixin(params, eval('({'+(n.getAttribute("data-dojo-props")||"")+'})')); + lang.mixin(params, args.defaults); + lang.mixin(params, mixin); + for(prop in proto){ + v = n.getAttributeNode(prop); + v = v && v.nodeValue; + t = typeof proto[prop]; + if(!v && (t !== "boolean" || v !== "")){ continue; } + if(t === "string"){ + params[prop] = v; + }else if(t === "number"){ + params[prop] = v - 0; + }else if(t === "boolean"){ + params[prop] = (v !== "false"); + }else if(t === "object"){ + params[prop] = eval("(" + v + ")"); + } + } + params["class"] = n.className; + params.style = n.style && n.style.cssText; + v = n.getAttribute("data-dojo-attach-point"); + if(v){ params.dojoAttachPoint = v; } + v = n.getAttribute("data-dojo-attach-event"); + if(v){ params.dojoAttachEvent = v; } + var instance = new cls(params, n); + ws.push(instance); + var jsId = n.getAttribute("jsId") || n.getAttribute("data-dojo-id"); + if(jsId){ + lang.setObject(jsId, instance); + } + } + for(i = 0; i < ws.length; i++){ + var w = ws[i]; + !args.noStart && w.startup && !w._started && w.startup(); + } + } + return ws; + }; + + this.parse = function(rootNode, args){ + // summary: + // Function to handle parsing for widgets in the current document. + // It is not as powerful as the full parser, but it will handle basic + // use cases fine. + // rootNode: + // The root node in the document to parse from + if(!rootNode){ + rootNode = win.body(); + }else if(!args && rootNode.rootNode){ + // Case where 'rootNode' is really a params object. + args = rootNode; + rootNode = rootNode.rootNode; + } + + var nodes = rootNode.getElementsByTagName("*"); + var i, list = []; + for(i = 0; i < nodes.length; i++){ + var n = nodes[i]; + if(n.getAttribute("dojoType") || n.getAttribute("data-dojo-type")){ + list.push(n); + } + } + var mixin = args && args.template ? {template: true} : null; + return this.instantiate(list, mixin, args); + }; + }(); + if(config.parseOnLoad){ + ready(100, parser, "parse"); + } + dm.parser = parser; // for backward compatibility + dojo.parser = parser; // in case user application calls dojo.parser + return parser; +}); diff --git a/js/dojo/dojox/mobile/scrollable.js b/js/dojo/dojox/mobile/scrollable.js new file mode 100644 index 0000000..82f44a6 --- /dev/null +++ b/js/dojo/dojox/mobile/scrollable.js @@ -0,0 +1,1106 @@ +//>>built + + +define("dojox/mobile/scrollable", [ + "dojo/_base/kernel", + "dojo/_base/connect", + "dojo/_base/event", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-construct", + "dojo/dom-style", + "./sniff" +], function(dojo, connect, event, lang, win, domClass, domConstruct, domStyle, has){ + + var dm = lang.getObject("dojox.mobile", true); + +/*===== +// summary: +// Utility for enabling touch scrolling capability. +// description: +// Mobile WebKit browsers do not allow scrolling inner DIVs. (You need +// the two-finger operation to scroll them.) +// That means you cannot have fixed-positioned header/footer bars. +// To solve this issue, this module disables the browsers default scrolling +// behavior, and re-builds its own scrolling machinery by handling touch +// events. In this module, this.domNode has height "100%" and is fixed to +// the window, and this.containerNode scrolls. If you place a bar outside +// of this.containerNode, then it will be fixed-positioned while +// this.containerNode is scrollable. +// +// This module has the following features: +// - Scrolls inner DIVs vertically, horizontally, or both. +// - Vertical and horizontal scroll bars. +// - Flashes the scroll bars when a view is shown. +// - Simulates the flick operation using animation. +// - Respects header/footer bars if any. +// +// dojox.mobile.scrollable is a simple function object, which holds +// several properties and functions in it. But if you transform it to a +// dojo class, it can be used as a mix-in class for any custom dojo +// widgets. dojox.mobile._ScrollableMixin is such a class. +// +// Also, it can be used even for non-dojo applications. In such cases, +// several dojo APIs used in this module, such as dojo.connect, +// dojo.create, etc., are re-defined so that the code works without dojo. +// When in dojo, of course those re-defined functions are not necessary. +// So, they are surrounded by the includeStart and includeEnd directives +// so that they can be excluded from the build. +// +// If you use this module for non-dojo application, you need to explicitly +// assign your outer fixed node and inner scrollable node to this.domNode +// and this.containerNode respectively. +// +// Non-dojo application should capture the onorientationchange or +// the onresize event and call resize() in the event handler. +// +// example: +// Use this module from a non-dojo applicatoin: +// | function onLoad(){ +// | var scrollable = new dojox.mobile.scrollable(dojo, dojox); +// | scrollable.init({ +// | domNode: "outer", // id or node +// | containerNode: "inner" // id or node +// | }); +// | } +// | <body onload="onLoad()"> +// | <h1 id="hd1" style="position:relative;width:100%;z-index:1;"> +// | Fixed Header +// | </h1> +// | <div id="outer" style="position:relative;height:100%;overflow:hidden;"> +// | <div id="inner" style="position:absolute;width:100%;"> +// | ... content ... +// | </div> +// | </div> +// | </body> +=====*/ + +var scrollable = function(/*Object?*/dojo, /*Object?*/dojox){ + this.fixedHeaderHeight = 0; // height of a fixed header + this.fixedFooterHeight = 0; // height of a fixed footer + this.isLocalFooter = false; // footer is view-local (as opposed to application-wide) + this.scrollBar = true; // show scroll bar or not + this.scrollDir = "v"; // v: vertical, h: horizontal, vh: both, f: flip + this.weight = 0.6; // frictional drag + this.fadeScrollBar = true; + this.disableFlashScrollBar = false; + this.threshold = 4; // drag threshold value in pixels + this.constraint = true; // bounce back to the content area + this.touchNode = null; // a node that will have touch event handlers + this.isNested = false; // this scrollable's parent is also a scrollable + this.dirLock = false; // disable the move handler if scroll starts in the unexpected direction + this.height = ""; // explicitly specified height of this widget (ex. "300px") + this.androidWorkaroud = true; // workaround input field jumping issue + + + this.init = function(/*Object?*/params){ + if(params){ + for(var p in params){ + if(params.hasOwnProperty(p)){ + this[p] = ((p == "domNode" || p == "containerNode") && typeof params[p] == "string") ? + win.doc.getElementById(params[p]) : params[p]; // mix-in params + } + } + } + this.touchNode = this.touchNode || this.containerNode; + this._v = (this.scrollDir.indexOf("v") != -1); // vertical scrolling + this._h = (this.scrollDir.indexOf("h") != -1); // horizontal scrolling + this._f = (this.scrollDir == "f"); // flipping views + + this._ch = []; // connect handlers + this._ch.push(connect.connect(this.touchNode, + has("touch") ? "touchstart" : "onmousedown", this, "onTouchStart")); + if(has("webkit")){ + this._ch.push(connect.connect(this.domNode, "webkitAnimationEnd", this, "onFlickAnimationEnd")); + this._ch.push(connect.connect(this.domNode, "webkitAnimationStart", this, "onFlickAnimationStart")); + + this._aw = this.androidWorkaroud && + has("android") >= 2.2 && has("android") < 3; + if(this._aw){ + this._ch.push(connect.connect(win.global, "onresize", this, "onScreenSizeChanged")); + this._ch.push(connect.connect(win.global, "onfocus", this, function(e){ + if(this.containerNode.style.webkitTransform){ + this.stopAnimation(); + this.toTopLeft(); + } + })); + this._sz = this.getScreenSize(); + } + + // Creation of keyframes takes a little time. If they are created + // in a lazy manner, a slight delay is noticeable when you start + // scrolling for the first time. This is to create keyframes up front. + for(var i = 0; i < 3; i++){ + this.setKeyframes(null, null, i); + } + } + // Workaround for iPhone flicker issue + if(has("iphone")){ + domStyle.set(this.containerNode, "webkitTransform", "translate3d(0,0,0)"); + } + + this._speed = {x:0, y:0}; + this._appFooterHeight = 0; + if(this.isTopLevel() && !this.noResize){ + this.resize(); + } + var _this = this; + setTimeout(function(){ + _this.flashScrollBar(); + }, 600); + }; + + this.isTopLevel = function(){ + // subclass may want to override + return true; + }; + + this.cleanup = function(){ + if(this._ch){ + for(var i = 0; i < this._ch.length; i++){ + connect.disconnect(this._ch[i]); + } + this._ch = null; + } + }; + + this.findDisp = function(/*DomNode*/node){ + // summary: + // Finds the currently displayed view node from my sibling nodes. + if(!node.parentNode){ return null; } + var nodes = node.parentNode.childNodes; + for(var i = 0; i < nodes.length; i++){ + var n = nodes[i]; + if(n.nodeType === 1 && domClass.contains(n, "mblView") && n.style.display !== "none"){ + return n; + } + } + return node; + }; + + this.getScreenSize = function(){ + // summary: + // Returns the dimensions of the browser window. + return { + h: win.global.innerHeight||win.doc.documentElement.clientHeight||win.doc.documentElement.offsetHeight, + w: win.global.innerWidth||win.doc.documentElement.clientWidth||win.doc.documentElement.offsetWidth + }; + }; + + this.isKeyboardShown = function(e){ + // summary: + // Internal function for android workaround. + // description: + // Returns true if a virtual keyboard is shown. + // Indirectly detects whether a virtual keyboard is shown or not by + // examining the screen size. + // TODO: need more reliable detection logic + if(!this._sz){ return false; } + var sz = this.getScreenSize(); + return (sz.w * sz.h) / (this._sz.w * this._sz.h) < 0.8; + }; + + this.disableScroll = function(/*Boolean*/v){ + // summary: + // Internal function for android workaround. + // description: + // Disables the touch scrolling and enables the browser's default + // scrolling. + if(this.disableTouchScroll === v || this.domNode.style.display === "none"){ return; } + this.disableTouchScroll = v; + this.scrollBar = !v; + dm.disableHideAddressBar = dm.disableResizeAll = v; + var of = v ? "visible" : "hidden"; + domStyle.set(this.domNode, "overflow", of); + domStyle.set(win.doc.documentElement, "overflow", of); + domStyle.set(win.body(), "overflow", of); + var c = this.containerNode; + if(v){ + if(!c.style.webkitTransform){ + // stop animation when soft keyborad is shown before animation ends. + // TODO: there might be a better way to wait for animation ending. + this.stopAnimation(); + this.toTopLeft(); + } + var mt = parseInt(c.style.marginTop) || 0; + var h = c.offsetHeight + mt + this.fixedFooterHeight - this._appFooterHeight; + domStyle.set(this.domNode, "height", h + "px"); + + this._cPos = { // store containerNode's position + x: parseInt(c.style.left) || 0, + y: parseInt(c.style.top) || 0 + }; + domStyle.set(c, { + top: "0px", + left: "0px" + }); + + var a = win.doc.activeElement; // focused input field + if(a){ // scrolling to show focused input field + var at = 0; // top position of focused input field + for(var n = a; n.tagName != "BODY"; n = n.offsetParent){ + at += n.offsetTop; + } + var st = at + a.clientHeight + 10 - this.getScreenSize().h; // top postion of browser scroll bar + if(st > 0){ + win.body().scrollTop = st; + } + } + }else{ + if(this._cPos){ // restore containerNode's position + domStyle.set(c, { + top: this._cPos.y + "px", + left: this._cPos.x + "px" + }); + this._cPos = null; + } + var tags = this.domNode.getElementsByTagName("*"); + for(var i = 0; i < tags.length; i++){ + tags[i].blur && tags[i].blur(); + } + // Call dojox.mobile.resizeAll if exists. + dm.resizeAll && dm.resizeAll(); + } + }; + + this.onScreenSizeChanged = function(e){ + // summary: + // Internal function for android workaround. + var sz = this.getScreenSize(); + if(sz.w * sz.h > this._sz.w * this._sz.h){ + this._sz = sz; // update the screen size + } + this.disableScroll(this.isKeyboardShown()); + }; + + this.toTransform = function(e){ + // summary: + // Internal function for android workaround. + var c = this.containerNode; + if(c.offsetTop === 0 && c.offsetLeft === 0 || !c._webkitTransform){ return; } + domStyle.set(c, { + webkitTransform: c._webkitTransform, + top: "0px", + left: "0px" + }); + c._webkitTransform = null; + }; + + this.toTopLeft = function(){ + // summary: + // Internal function for android workaround. + var c = this.containerNode; + if(!c.style.webkitTransform){ return; } // already converted to top/left + c._webkitTransform = c.style.webkitTransform; + var pos = this.getPos(); + domStyle.set(c, { + webkitTransform: "", + top: pos.y + "px", + left: pos.x + "px" + }); + }; + + this.resize = function(e){ + // summary: + // Adjusts the height of the widget. + // description: + // If the height property is 'inherit', the height is inherited + // from its offset parent. If 'auto', the content height, which + // could be smaller than the entire screen height, is used. If an + // explicit height value (ex. "300px"), it is used as the new + // height. If nothing is specified as the height property, from the + // current top position of the widget to the bottom of the screen + // will be the new height. + + // moved from init() to support dynamically added fixed bars + this._appFooterHeight = (this.fixedFooterHeight && !this.isLocalFooter) ? + this.fixedFooterHeight : 0; + if(this.isLocalHeader){ + this.containerNode.style.marginTop = this.fixedHeaderHeight + "px"; + } + + // Get the top position. Same as dojo.position(node, true).y + var top = 0; + for(var n = this.domNode; n && n.tagName != "BODY"; n = n.offsetParent){ + n = this.findDisp(n); // find the first displayed view node + if(!n){ break; } + top += n.offsetTop; + } + + // adjust the height of this view + var h, + screenHeight = this.getScreenSize().h, + dh = screenHeight - top - this._appFooterHeight; // default height + if(this.height === "inherit"){ + if(this.domNode.offsetParent){ + h = this.domNode.offsetParent.offsetHeight + "px"; + } + }else if(this.height === "auto"){ + var parent = this.domNode.offsetParent; + if(parent){ + this.domNode.style.height = "0px"; + var parentRect = parent.getBoundingClientRect(), + scrollableRect = this.domNode.getBoundingClientRect(), + contentBottom = parentRect.bottom - this._appFooterHeight; + if(scrollableRect.bottom >= contentBottom){ // use entire screen + dh = screenHeight - (scrollableRect.top - parentRect.top) - this._appFooterHeight; + }else{ // stretch to fill predefined area + dh = contentBottom - scrollableRect.bottom; + } + } + // content could be smaller than entire screen height + var contentHeight = Math.max(this.domNode.scrollHeight, this.containerNode.scrollHeight); + h = (contentHeight ? Math.min(contentHeight, dh) : dh) + "px"; + }else if(this.height){ + h = this.height; + } + if(!h){ + h = dh + "px"; + } + if(h.charAt(0) !== "-" && // to ensure that h is not negative (e.g. "-10px") + h !== "default"){ + this.domNode.style.height = h; + } + + // to ensure that the view is within a scrolling area when resized. + this.onTouchEnd(); + }; + + this.onFlickAnimationStart = function(e){ + event.stop(e); + }; + + this.onFlickAnimationEnd = function(e){ + var an = e && e.animationName; + if(an && an.indexOf("scrollableViewScroll2") === -1){ + if(an.indexOf("scrollableViewScroll0") !== -1){ // scrollBarV + domClass.remove(this._scrollBarNodeV, "mblScrollableScrollTo0"); + }else if(an.indexOf("scrollableViewScroll1") !== -1){ // scrollBarH + domClass.remove(this._scrollBarNodeH, "mblScrollableScrollTo1"); + }else{ // fade or others + if(this._scrollBarNodeV){ this._scrollBarNodeV.className = ""; } + if(this._scrollBarNodeH){ this._scrollBarNodeH.className = ""; } + } + return; + } + if(e && e.srcElement){ + event.stop(e); + } + this.stopAnimation(); + if(this._bounce){ + var _this = this; + var bounce = _this._bounce; + setTimeout(function(){ + _this.slideTo(bounce, 0.3, "ease-out"); + }, 0); + _this._bounce = undefined; + }else{ + this.hideScrollBar(); + this.removeCover(); + if(this._aw){ this.toTopLeft(); } // android workaround + } + }; + + this.isFormElement = function(node){ + if(node && node.nodeType !== 1){ node = node.parentNode; } + if(!node || node.nodeType !== 1){ return false; } + var t = node.tagName; + return (t === "SELECT" || t === "INPUT" || t === "TEXTAREA" || t === "BUTTON"); + }; + + this.onTouchStart = function(e){ + if(this.disableTouchScroll){ return; } + if(this._conn && (new Date()).getTime() - this.startTime < 500){ + return; // ignore successive onTouchStart calls + } + if(!this._conn){ + this._conn = []; + this._conn.push(connect.connect(win.doc, has("touch") ? "touchmove" : "onmousemove", this, "onTouchMove")); + this._conn.push(connect.connect(win.doc, has("touch") ? "touchend" : "onmouseup", this, "onTouchEnd")); + } + + this._aborted = false; + if(domClass.contains(this.containerNode, "mblScrollableScrollTo2")){ + this.abort(); + }else{ // reset scrollbar class especially for reseting fade-out animation + if(this._scrollBarNodeV){ this._scrollBarNodeV.className = ""; } + if(this._scrollBarNodeH){ this._scrollBarNodeH.className = ""; } + } + if(this._aw){ this.toTransform(e); } // android workaround + this.touchStartX = e.touches ? e.touches[0].pageX : e.clientX; + this.touchStartY = e.touches ? e.touches[0].pageY : e.clientY; + this.startTime = (new Date()).getTime(); + this.startPos = this.getPos(); + this._dim = this.getDim(); + this._time = [0]; + this._posX = [this.touchStartX]; + this._posY = [this.touchStartY]; + this._locked = false; + + if(!this.isFormElement(e.target) && !this.isNested){ + event.stop(e); + } + }; + + this.onTouchMove = function(e){ + if(this._locked){ return; } + var x = e.touches ? e.touches[0].pageX : e.clientX; + var y = e.touches ? e.touches[0].pageY : e.clientY; + var dx = x - this.touchStartX; + var dy = y - this.touchStartY; + var to = {x:this.startPos.x + dx, y:this.startPos.y + dy}; + var dim = this._dim; + + dx = Math.abs(dx); + dy = Math.abs(dy); + if(this._time.length == 1){ // the first TouchMove after TouchStart + if(this.dirLock){ + if(this._v && !this._h && dx >= this.threshold && dx >= dy || + (this._h || this._f) && !this._v && dy >= this.threshold && dy >= dx){ + this._locked = true; + return; + } + } + if(this._v && Math.abs(dy) < this.threshold || + (this._h || this._f) && Math.abs(dx) < this.threshold){ + return; + } + this.addCover(); + this.showScrollBar(); + } + + var weight = this.weight; + if(this._v && this.constraint){ + if(to.y > 0){ // content is below the screen area + to.y = Math.round(to.y * weight); + }else if(to.y < -dim.o.h){ // content is above the screen area + if(dim.c.h < dim.d.h){ // content is shorter than display + to.y = Math.round(to.y * weight); + }else{ + to.y = -dim.o.h - Math.round((-dim.o.h - to.y) * weight); + } + } + } + if((this._h || this._f) && this.constraint){ + if(to.x > 0){ + to.x = Math.round(to.x * weight); + }else if(to.x < -dim.o.w){ + if(dim.c.w < dim.d.w){ + to.x = Math.round(to.x * weight); + }else{ + to.x = -dim.o.w - Math.round((-dim.o.w - to.x) * weight); + } + } + } + this.scrollTo(to); + + var max = 10; + var n = this._time.length; // # of samples + if(n >= 2){ + // Check the direction of the finger move. + // If the direction has been changed, discard the old data. + var d0, d1; + if(this._v && !this._h){ + d0 = this._posY[n - 1] - this._posY[n - 2]; + d1 = y - this._posY[n - 1]; + }else if(!this._v && this._h){ + d0 = this._posX[n - 1] - this._posX[n - 2]; + d1 = x - this._posX[n - 1]; + } + if(d0 * d1 < 0){ // direction changed + // leave only the latest data + this._time = [this._time[n - 1]]; + this._posX = [this._posX[n - 1]]; + this._posY = [this._posY[n - 1]]; + n = 1; + } + } + if(n == max){ + this._time.shift(); + this._posX.shift(); + this._posY.shift(); + } + this._time.push((new Date()).getTime() - this.startTime); + this._posX.push(x); + this._posY.push(y); + }; + + this.onTouchEnd = function(e){ + if(this._locked){ return; } + var speed = this._speed = {x:0, y:0}; + var dim = this._dim; + var pos = this.getPos(); + var to = {}; // destination + if(e){ + if(!this._conn){ return; } // if we get onTouchEnd without onTouchStart, ignore it. + for(var i = 0; i < this._conn.length; i++){ + connect.disconnect(this._conn[i]); + } + this._conn = null; + + var n = this._time.length; // # of samples + var clicked = false; + if(!this._aborted){ + if(n <= 1){ + clicked = true; + }else if(n == 2 && Math.abs(this._posY[1] - this._posY[0]) < 4 + && has("touch")){ // for desktop browsers, posY could be the same, since we're using clientY, see onTouchMove() + clicked = true; + } + } + var isFormElem = this.isFormElement(e.target); + if(clicked && !isFormElem){ // clicked, not dragged or flicked + this.hideScrollBar(); + this.removeCover(); + if(has("touch")){ + var elem = e.target; + if(elem.nodeType != 1){ + elem = elem.parentNode; + } + var ev = win.doc.createEvent("MouseEvents"); + ev.initMouseEvent("click", true, true, win.global, 1, e.screenX, e.screenY, e.clientX, e.clientY); + setTimeout(function(){ + elem.dispatchEvent(ev); + }, 0); + } + return; + }else if(this._aw && clicked && isFormElem){ // clicked input fields + this.hideScrollBar(); + this.toTopLeft(); + return; + } + speed = this._speed = this.getSpeed(); + }else{ + if(pos.x == 0 && pos.y == 0){ return; } // initializing + dim = this.getDim(); + } + + if(this._v){ + to.y = pos.y + speed.y; + } + if(this._h || this._f){ + to.x = pos.x + speed.x; + } + + this.adjustDestination(to, pos); + + if(this.scrollDir == "v" && dim.c.h < dim.d.h){ // content is shorter than display + this.slideTo({y:0}, 0.3, "ease-out"); // go back to the top + return; + }else if(this.scrollDir == "h" && dim.c.w < dim.d.w){ // content is narrower than display + this.slideTo({x:0}, 0.3, "ease-out"); // go back to the left + return; + }else if(this._v && this._h && dim.c.h < dim.d.h && dim.c.w < dim.d.w){ + this.slideTo({x:0, y:0}, 0.3, "ease-out"); // go back to the top-left + return; + } + + var duration, easing = "ease-out"; + var bounce = {}; + if(this._v && this.constraint){ + if(to.y > 0){ // going down. bounce back to the top. + if(pos.y > 0){ // started from below the screen area. return quickly. + duration = 0.3; + to.y = 0; + }else{ + to.y = Math.min(to.y, 20); + easing = "linear"; + bounce.y = 0; + } + }else if(-speed.y > dim.o.h - (-pos.y)){ // going up. bounce back to the bottom. + if(pos.y < -dim.o.h){ // started from above the screen top. return quickly. + duration = 0.3; + to.y = dim.c.h <= dim.d.h ? 0 : -dim.o.h; // if shorter, move to 0 + }else{ + to.y = Math.max(to.y, -dim.o.h - 20); + easing = "linear"; + bounce.y = -dim.o.h; + } + } + } + if((this._h || this._f) && this.constraint){ + if(to.x > 0){ // going right. bounce back to the left. + if(pos.x > 0){ // started from right of the screen area. return quickly. + duration = 0.3; + to.x = 0; + }else{ + to.x = Math.min(to.x, 20); + easing = "linear"; + bounce.x = 0; + } + }else if(-speed.x > dim.o.w - (-pos.x)){ // going left. bounce back to the right. + if(pos.x < -dim.o.w){ // started from left of the screen top. return quickly. + duration = 0.3; + to.x = dim.c.w <= dim.d.w ? 0 : -dim.o.w; // if narrower, move to 0 + }else{ + to.x = Math.max(to.x, -dim.o.w - 20); + easing = "linear"; + bounce.x = -dim.o.w; + } + } + } + this._bounce = (bounce.x !== undefined || bounce.y !== undefined) ? bounce : undefined; + + if(duration === undefined){ + var distance, velocity; + if(this._v && this._h){ + velocity = Math.sqrt(speed.x+speed.x + speed.y*speed.y); + distance = Math.sqrt(Math.pow(to.y - pos.y, 2) + Math.pow(to.x - pos.x, 2)); + }else if(this._v){ + velocity = speed.y; + distance = to.y - pos.y; + }else if(this._h){ + velocity = speed.x; + distance = to.x - pos.x; + } + if(distance === 0 && !e){ return; } // #13154 + duration = velocity !== 0 ? Math.abs(distance / velocity) : 0.01; // time = distance / velocity + } + this.slideTo(to, duration, easing); + }; + + this.adjustDestination = function(to, pos){ + // subclass may want to implement + }; + + this.abort = function(){ + this.scrollTo(this.getPos()); + this.stopAnimation(); + this._aborted = true; + }; + + this.stopAnimation = function(){ + // stop the currently running animation + domClass.remove(this.containerNode, "mblScrollableScrollTo2"); + if(has("android")){ + domStyle.set(this.containerNode, "webkitAnimationDuration", "0s"); // workaround for android screen flicker problem + } + if(this._scrollBarV){ + this._scrollBarV.className = ""; + } + if(this._scrollBarH){ + this._scrollBarH.className = ""; + } + }; + + this.getSpeed = function(){ + var x = 0, y = 0, n = this._time.length; + // if the user holds the mouse or finger more than 0.5 sec, do not move. + if(n >= 2 && (new Date()).getTime() - this.startTime - this._time[n - 1] < 500){ + var dy = this._posY[n - (n > 3 ? 2 : 1)] - this._posY[(n - 6) >= 0 ? n - 6 : 0]; + var dx = this._posX[n - (n > 3 ? 2 : 1)] - this._posX[(n - 6) >= 0 ? n - 6 : 0]; + var dt = this._time[n - (n > 3 ? 2 : 1)] - this._time[(n - 6) >= 0 ? n - 6 : 0]; + y = this.calcSpeed(dy, dt); + x = this.calcSpeed(dx, dt); + } + return {x:x, y:y}; + }; + + this.calcSpeed = function(/*Number*/d, /*Number*/t){ + return Math.round(d / t * 100) * 4; + }; + + this.scrollTo = function(/*Object*/to, /*Boolean?*/doNotMoveScrollBar, /*DomNode?*/node){ // to: {x, y} + // summary: + // Scrolls to the given position. + var s = (node || this.containerNode).style; + if(has("webkit")){ + s.webkitTransform = this.makeTranslateStr(to); + }else{ + if(this._v){ + s.top = to.y + "px"; + } + if(this._h || this._f){ + s.left = to.x + "px"; + } + } + if(!doNotMoveScrollBar){ + this.scrollScrollBarTo(this.calcScrollBarPos(to)); + } + }; + + this.slideTo = function(/*Object*/to, /*Number*/duration, /*String*/easing){ + // summary: + // Scrolls to the given position with slide animation. + this._runSlideAnimation(this.getPos(), to, duration, easing, this.containerNode, 2); + this.slideScrollBarTo(to, duration, easing); + }; + + this.makeTranslateStr = function(to){ + var y = this._v && typeof to.y == "number" ? to.y+"px" : "0px"; + var x = (this._h||this._f) && typeof to.x == "number" ? to.x+"px" : "0px"; + return dm.hasTranslate3d ? + "translate3d("+x+","+y+",0px)" : "translate("+x+","+y+")"; + }; + + this.getPos = function(){ + // summary: + // Get the top position in the midst of animation + if(has("webkit")){ + var m = win.doc.defaultView.getComputedStyle(this.containerNode, '')["-webkit-transform"]; + if(m && m.indexOf("matrix") === 0){ + var arr = m.split(/[,\s\)]+/); + return {y:arr[5] - 0, x:arr[4] - 0}; + } + return {x:0, y:0}; + }else{ + // this.containerNode.offsetTop does not work here, + // because it adds the height of the top margin. + var y = parseInt(this.containerNode.style.top) || 0; + return {y:y, x:this.containerNode.offsetLeft}; + } + }; + + this.getDim = function(){ + var d = {}; + // content width/height + d.c = {h:this.containerNode.offsetHeight, w:this.containerNode.offsetWidth}; + + // view width/height + d.v = {h:this.domNode.offsetHeight + this._appFooterHeight, w:this.domNode.offsetWidth}; + + // display width/height + d.d = {h:d.v.h - this.fixedHeaderHeight - this.fixedFooterHeight, w:d.v.w}; + + // overflowed width/height + d.o = {h:d.c.h - d.v.h + this.fixedHeaderHeight + this.fixedFooterHeight, w:d.c.w - d.v.w}; + return d; + }; + + this.showScrollBar = function(){ + if(!this.scrollBar){ return; } + + var dim = this._dim; + if(this.scrollDir == "v" && dim.c.h <= dim.d.h){ return; } + if(this.scrollDir == "h" && dim.c.w <= dim.d.w){ return; } + if(this._v && this._h && dim.c.h <= dim.d.h && dim.c.w <= dim.d.w){ return; } + + var createBar = function(self, dir){ + var bar = self["_scrollBarNode" + dir]; + if(!bar){ + var wrapper = domConstruct.create("div", null, self.domNode); + var props = { position: "absolute", overflow: "hidden" }; + if(dir == "V"){ + props.right = "2px"; + props.width = "5px"; + }else{ + props.bottom = (self.isLocalFooter ? self.fixedFooterHeight : 0) + 2 + "px"; + props.height = "5px"; + } + domStyle.set(wrapper, props); + wrapper.className = "mblScrollBarWrapper"; + self["_scrollBarWrapper"+dir] = wrapper; + + bar = domConstruct.create("div", null, wrapper); + domStyle.set(bar, { + opacity: 0.6, + position: "absolute", + backgroundColor: "#606060", + fontSize: "1px", + webkitBorderRadius: "2px", + MozBorderRadius: "2px", + webkitTransformOrigin: "0 0", + zIndex: 2147483647 // max of signed 32-bit integer + }); + domStyle.set(bar, dir == "V" ? {width: "5px"} : {height: "5px"}); + self["_scrollBarNode" + dir] = bar; + } + return bar; + }; + if(this._v && !this._scrollBarV){ + this._scrollBarV = createBar(this, "V"); + } + if(this._h && !this._scrollBarH){ + this._scrollBarH = createBar(this, "H"); + } + this.resetScrollBar(); + }; + + this.hideScrollBar = function(){ + var fadeRule; + if(this.fadeScrollBar && has("webkit")){ + if(!dm._fadeRule){ + var node = domConstruct.create("style", null, win.doc.getElementsByTagName("head")[0]); + node.textContent = + ".mblScrollableFadeScrollBar{"+ + " -webkit-animation-duration: 1s;"+ + " -webkit-animation-name: scrollableViewFadeScrollBar;}"+ + "@-webkit-keyframes scrollableViewFadeScrollBar{"+ + " from { opacity: 0.6; }"+ + " to { opacity: 0; }}"; + dm._fadeRule = node.sheet.cssRules[1]; + } + fadeRule = dm._fadeRule; + } + if(!this.scrollBar){ return; } + var f = function(bar, self){ + domStyle.set(bar, { + opacity: 0, + webkitAnimationDuration: "" + }); + if(self._aw){ // android workaround + bar.style.webkitTransform = ""; + }else{ + bar.className = "mblScrollableFadeScrollBar"; + } + }; + if(this._scrollBarV){ + f(this._scrollBarV, this); + this._scrollBarV = null; + } + if(this._scrollBarH){ + f(this._scrollBarH, this); + this._scrollBarH = null; + } + }; + + this.calcScrollBarPos = function(/*Object*/to){ // to: {x, y} + var pos = {}; + var dim = this._dim; + var f = function(wrapperH, barH, t, d, c){ + var y = Math.round((d - barH - 8) / (d - c) * t); + if(y < -barH + 5){ + y = -barH + 5; + } + if(y > wrapperH - 5){ + y = wrapperH - 5; + } + return y; + }; + if(typeof to.y == "number" && this._scrollBarV){ + pos.y = f(this._scrollBarWrapperV.offsetHeight, this._scrollBarV.offsetHeight, to.y, dim.d.h, dim.c.h); + } + if(typeof to.x == "number" && this._scrollBarH){ + pos.x = f(this._scrollBarWrapperH.offsetWidth, this._scrollBarH.offsetWidth, to.x, dim.d.w, dim.c.w); + } + return pos; + }; + + this.scrollScrollBarTo = function(/*Object*/to){ // to: {x, y} + if(!this.scrollBar){ return; } + if(this._v && this._scrollBarV && typeof to.y == "number"){ + if(has("webkit")){ + this._scrollBarV.style.webkitTransform = this.makeTranslateStr({y:to.y}); + }else{ + this._scrollBarV.style.top = to.y + "px"; + } + } + if(this._h && this._scrollBarH && typeof to.x == "number"){ + if(has("webkit")){ + this._scrollBarH.style.webkitTransform = this.makeTranslateStr({x:to.x}); + }else{ + this._scrollBarH.style.left = to.x + "px"; + } + } + }; + + this.slideScrollBarTo = function(/*Object*/to, /*Number*/duration, /*String*/easing){ + if(!this.scrollBar){ return; } + var fromPos = this.calcScrollBarPos(this.getPos()); + var toPos = this.calcScrollBarPos(to); + if(this._v && this._scrollBarV){ + this._runSlideAnimation({y:fromPos.y}, {y:toPos.y}, duration, easing, this._scrollBarV, 0); + } + if(this._h && this._scrollBarH){ + this._runSlideAnimation({x:fromPos.x}, {x:toPos.x}, duration, easing, this._scrollBarH, 1); + } + }; + + this._runSlideAnimation = function(/*Object*/from, /*Object*/to, /*Number*/duration, /*String*/easing, node, idx){ + // idx: 0:scrollbarV, 1:scrollbarH, 2:content + if(has("webkit")){ + this.setKeyframes(from, to, idx); + domStyle.set(node, { + webkitAnimationDuration: duration + "s", + webkitAnimationTimingFunction: easing + }); + domClass.add(node, "mblScrollableScrollTo"+idx); + if(idx == 2){ + this.scrollTo(to, true, node); + }else{ + this.scrollScrollBarTo(to); + } + }else if(dojo.fx && dojo.fx.easing && duration){ + // If you want to support non-webkit browsers, + // your application needs to load necessary modules as follows: + // + // | dojo.require("dojo.fx"); + // | dojo.require("dojo.fx.easing"); + // + // This module itself does not make dependency on them. + var s = dojo.fx.slideTo({ + node: node, + duration: duration*1000, + left: to.x, + top: to.y, + easing: (easing == "ease-out") ? dojo.fx.easing.quadOut : dojo.fx.easing.linear + }).play(); + if(idx == 2){ + connect.connect(s, "onEnd", this, "onFlickAnimationEnd"); + } + }else{ + // directly jump to the destination without animation + if(idx == 2){ + this.scrollTo(to, false, node); + this.onFlickAnimationEnd(); + }else{ + this.scrollScrollBarTo(to); + } + } + }; + + this.resetScrollBar = function(){ + // summary: + // Resets the scroll bar length, position, etc. + var f = function(wrapper, bar, d, c, hd, v){ + if(!bar){ return; } + var props = {}; + props[v ? "top" : "left"] = hd + 4 + "px"; // +4 is for top or left margin + var t = (d - 8) <= 0 ? 1 : d - 8; + props[v ? "height" : "width"] = t + "px"; + domStyle.set(wrapper, props); + var l = Math.round(d * d / c); // scroll bar length + l = Math.min(Math.max(l - 8, 5), t); // -8 is for margin for both ends + bar.style[v ? "height" : "width"] = l + "px"; + domStyle.set(bar, {"opacity": 0.6}); + }; + var dim = this.getDim(); + f(this._scrollBarWrapperV, this._scrollBarV, dim.d.h, dim.c.h, this.fixedHeaderHeight, true); + f(this._scrollBarWrapperH, this._scrollBarH, dim.d.w, dim.c.w, 0); + this.createMask(); + }; + + this.createMask = function(){ + // summary: + // Creates a mask for a scroll bar edge. + // description: + // This function creates a mask that hides corners of one scroll + // bar edge to make it round edge. The other side of the edge is + // always visible and round shaped with the border-radius style. + if(!has("webkit")){ return; } + var ctx; + if(this._scrollBarWrapperV){ + var h = this._scrollBarWrapperV.offsetHeight; + ctx = win.doc.getCSSCanvasContext("2d", "scrollBarMaskV", 5, h); + ctx.fillStyle = "rgba(0,0,0,0.5)"; + ctx.fillRect(1, 0, 3, 2); + ctx.fillRect(0, 1, 5, 1); + ctx.fillRect(0, h - 2, 5, 1); + ctx.fillRect(1, h - 1, 3, 2); + ctx.fillStyle = "rgb(0,0,0)"; + ctx.fillRect(0, 2, 5, h - 4); + this._scrollBarWrapperV.style.webkitMaskImage = "-webkit-canvas(scrollBarMaskV)"; + } + if(this._scrollBarWrapperH){ + var w = this._scrollBarWrapperH.offsetWidth; + ctx = win.doc.getCSSCanvasContext("2d", "scrollBarMaskH", w, 5); + ctx.fillStyle = "rgba(0,0,0,0.5)"; + ctx.fillRect(0, 1, 2, 3); + ctx.fillRect(1, 0, 1, 5); + ctx.fillRect(w - 2, 0, 1, 5); + ctx.fillRect(w - 1, 1, 2, 3); + ctx.fillStyle = "rgb(0,0,0)"; + ctx.fillRect(2, 0, w - 4, 5); + this._scrollBarWrapperH.style.webkitMaskImage = "-webkit-canvas(scrollBarMaskH)"; + } + }; + + this.flashScrollBar = function(){ + if(this.disableFlashScrollBar || !this.domNode){ return; } + this._dim = this.getDim(); + if(this._dim.d.h <= 0){ return; } // dom is not ready + this.showScrollBar(); + var _this = this; + setTimeout(function(){ + _this.hideScrollBar(); + }, 300); + }; + + this.addCover = function(){ + if(!has("touch") && !this.noCover){ + if(!this._cover){ + this._cover = domConstruct.create("div", null, win.doc.body); + domStyle.set(this._cover, { + backgroundColor: "#ffff00", + opacity: 0, + position: "absolute", + top: "0px", + left: "0px", + width: "100%", + height: "100%", + zIndex: 2147483647 // max of signed 32-bit integer + }); + this._ch.push(connect.connect(this._cover, + has("touch") ? "touchstart" : "onmousedown", this, "onTouchEnd")); + }else{ + this._cover.style.display = ""; + } + this.setSelectable(this._cover, false); + this.setSelectable(this.domNode, false); + } + }; + + this.removeCover = function(){ + if(!has("touch") && this._cover){ + this._cover.style.display = "none"; + this.setSelectable(this._cover, true); + this.setSelectable(this.domNode, true); + } + }; + + this.setKeyframes = function(/*Object*/from, /*Object*/to, /*Number*/idx){ + if(!dm._rule){ + dm._rule = []; + } + // idx: 0:scrollbarV, 1:scrollbarH, 2:content + if(!dm._rule[idx]){ + var node = domConstruct.create("style", null, win.doc.getElementsByTagName("head")[0]); + node.textContent = + ".mblScrollableScrollTo"+idx+"{-webkit-animation-name: scrollableViewScroll"+idx+";}"+ + "@-webkit-keyframes scrollableViewScroll"+idx+"{}"; + dm._rule[idx] = node.sheet.cssRules[1]; + } + var rule = dm._rule[idx]; + if(rule){ + if(from){ + rule.deleteRule("from"); + rule.insertRule("from { -webkit-transform: "+this.makeTranslateStr(from)+"; }"); + } + if(to){ + if(to.x === undefined){ to.x = from.x; } + if(to.y === undefined){ to.y = from.y; } + rule.deleteRule("to"); + rule.insertRule("to { -webkit-transform: "+this.makeTranslateStr(to)+"; }"); + } + } + }; + + this.setSelectable = function(node, selectable){ + // dojo.setSelectable has dependency on dojo.query. Re-define our own. + node.style.KhtmlUserSelect = selectable ? "auto" : "none"; + node.style.MozUserSelect = selectable ? "" : "none"; + node.onselectstart = selectable ? null : function(){return false;}; + if(has("ie")){ + node.unselectable = selectable ? "" : "on"; + var nodes = node.getElementsByTagName("*"); + for(var i = 0; i < nodes.length; i++){ + nodes[i].unselectable = selectable ? "" : "on"; + } + } + }; + + // feature detection + if(has("webkit")){ + var elem = win.doc.createElement("div"); + elem.style.webkitTransform = "translate3d(0px,1px,0px)"; + win.doc.documentElement.appendChild(elem); + var v = win.doc.defaultView.getComputedStyle(elem, '')["-webkit-transform"]; + dm.hasTranslate3d = v && v.indexOf("matrix") === 0; + win.doc.documentElement.removeChild(elem); + } +}; + +dm.scrollable = scrollable; // for backward compatibility +return scrollable; +}); diff --git a/js/dojo/dojox/mobile/sniff.js b/js/dojo/dojox/mobile/sniff.js new file mode 100644 index 0000000..6991fcd --- /dev/null +++ b/js/dojo/dojox/mobile/sniff.js @@ -0,0 +1,32 @@ +//>>built +define("dojox/mobile/sniff", [ + "dojo/_base/window", + "dojo/_base/sniff" +], function(win, has){ + + var ua = navigator.userAgent; + + // BlackBerry (OS 6 or later only) + has.add("bb", ua.indexOf("BlackBerry") >= 0 && parseFloat(ua.split("Version/")[1]) || undefined, undefined, true); + + // Android + has.add("android", parseFloat(ua.split("Android ")[1]) || undefined, undefined, true); + + // iPhone, iPod, or iPad + // If iPod or iPad is detected, in addition to has("ipod") or has("ipad"), + // has("iphone") will also have iOS version number. + if(ua.match(/(iPhone|iPod|iPad)/)){ + var p = RegExp.$1.replace(/P/, 'p'); + var v = ua.match(/OS ([\d_]+)/) ? RegExp.$1 : "1"; + var os = parseFloat(v.replace(/_/, '.').replace(/_/g, '')); + has.add(p, os, undefined, true); + has.add("iphone", os, undefined, true); + } + + if(has("webkit")){ + has.add("touch", (typeof win.doc.documentElement.ontouchstart != "undefined" && + navigator.appVersion.indexOf("Mobile") != -1) || !!has("android"), undefined, true); + } + + return has; +}); diff --git a/js/dojo/dojox/mobile/themes/android/Button-compat.css b/js/dojo/dojox/mobile/themes/android/Button-compat.css new file mode 100644 index 0000000..c1bd8cf --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Button-compat.css @@ -0,0 +1,33 @@ +/* dojox.mobile.Button */ +.mblButton { + background-color: #cfcfcf; + background-image: url(compat/button-bg.png); + background-repeat: repeat-x; + -moz-border-radius: 3px; + -o-border-radius: 3px; + -ms-border-radius: 3px; + border-radius: 3px; +} +.mblButtonSelected { + background-color: #ffab00; + background-image: url(compat/button-sel-bg.png); +} +.mblButtonDisabled { + background-image: none; +} +.mblBlueButton { + background-color: #2261dd; + background-image: url(compat/blue-button-bg.png); +} +.mblBlueButtonSelected { + background-color: #ffab00; + background-image: url(compat/button-sel-bg.png); +} +.mblRedButton { + background-color: #ee4115; + background-image: url(compat/red-button-bg.png); +} +.mblRedButtonSelected { + background-color: #ffab00; + background-image: url(compat/button-sel-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/android/Button.css b/js/dojo/dojox/mobile/themes/android/Button.css new file mode 100644 index 0000000..2eb8311 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Button.css @@ -0,0 +1,45 @@ +/* dojox.mobile.Button */ +.mblButton { + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + padding: 0px 10px; + height: 29px; + border: #9CACC0 1px outset; + -webkit-border-radius: 3px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd), to(#cecece), color-stop(0.5, #f8f8f8), color-stop(0.5, #eeeeee)); + color: black; + font-family: Helvetica; + font-size: 13px; + line-height: 29px; +} +.mblButton.mblBlueButton { + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7a9de9), to(#2362dd), color-stop(0.5, #366edf), color-stop(0.5, #215fdc)); + color: white; +} +.mblButton.mblBlueButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#ad7500), to(#ffaa00), color-stop(0.06, #ffb200), color-stop(0.5, #ffc700)); + color: white; +} +.mblButton.mblRedButton { + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fa9d58), to(#ee4115), color-stop(0.5, #ff4d25), color-stop(0.5, #ed4d15)); + color: white; +} +.mblButton.mblRedButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#ad7500), to(#ffaa00), color-stop(0.06, #ffb200), color-stop(0.5, #ffc700)); + color: white; +} +.mblButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#ad7500), to(#ffaa00), color-stop(0.06, #ffb200), color-stop(0.5, #ffc700)); + color: white; +} +.mblButtonDisabled, .mblButton:disabled { + cursor: default; + border-color: grey; + background-image: none; + color: grey; +} diff --git a/js/dojo/dojox/mobile/themes/android/Button.less b/js/dojo/dojox/mobile/themes/android/Button.less new file mode 100644 index 0000000..ab3a96c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Button.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Button.less"; diff --git a/js/dojo/dojox/mobile/themes/android/Carousel.css b/js/dojo/dojox/mobile/themes/android/Carousel.css new file mode 100644 index 0000000..a415950 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Carousel.css @@ -0,0 +1,60 @@ +/* dojox.mobile.Carousel */ +.mblCarousel { + overflow: hidden; +} +.mblCarouselBox { + position: relative; + float: left; +} +.mblCarouselImg { + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5); + vertical-align: bottom; +} +.mblCarouselImgSelected { + border: 1px dashed #C0C0C0; + -webkit-box-shadow: none; +} +.mblCarouselImgHeaderText { + color: white; + font: 14px arial, helvetica, clean, sans-serif; +} +.mblCarouselImgFooterText { + color: white; + font: 14px arial, helvetica, clean, sans-serif; +} +.mblCarouselHeaderBar { + background-color: #3A3A3B; + color: #B1B1B1; + font: bold 16px arial, helvetica, clean, sans-serif; + padding: 1px; +} +.mblCarouselBtnContainer { + float: right; +} +.mblCarouselBtn { + height: 18px; + width: 46px; + font: bold 14px arial, helvetica, clean, sans-serif; + color: gray; + padding-top: 0px; + margin: 0px 2px; + border-width: 1px; + /* workaround for android problem */ + +} +.mblCarouselTitle { + margin: 2px 0px 2px 4px; +} +.mblCarouselHeaderBar .mblPageIndicator { + float: right; + width: auto; + padding: 0px 20px; +} +.mblCarouselHeaderBar .mblPageIndicatorContainer { + margin-left: 0px; + margin-right: 0px; +} +.mblCarouselPages { + position: relative; + text-align: center; +} diff --git a/js/dojo/dojox/mobile/themes/android/Carousel.less b/js/dojo/dojox/mobile/themes/android/Carousel.less new file mode 100644 index 0000000..d717397 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Carousel.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Carousel.less"; diff --git a/js/dojo/dojox/mobile/themes/android/CheckBox-compat.css b/js/dojo/dojox/mobile/themes/android/CheckBox-compat.css new file mode 100644 index 0000000..1a37a2a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/CheckBox-compat.css @@ -0,0 +1,37 @@ +/* dojox.mobile.CheckBox */ +.mblCheckBox { + background-image: url(compat/button-bg.png); + -moz-border-radius: 3px; + -o-border-radius: 3px; + -ms-border-radius: 3px; + border-radius: 3px; + -moz-appearance: none; + -o-appearance: none; + -ms-appearance: none; + appearance: none; + -o-transform: translateY(0.45em); + -ms-transform: translateY(0.45em); + transform: translateY(0.45em); +} +.mblCheckBoxSelected { + background-image: url(compat/button-sel-bg.png); +} +.mblCheckBoxChecked, +.mblCheckBox:checked { + background-image: url(compat/togglebutton-chk-bg.png); +} +.mblCheckBoxChecked::after, +.mblCheckBox:checked::after { + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; +} +.mblCheckBoxChecked.mblCheckBoxSelected { + background-image: url(compat/button-sel-bg.png); +} + diff --git a/js/dojo/dojox/mobile/themes/android/CheckBox.css b/js/dojo/dojox/mobile/themes/android/CheckBox.css new file mode 100644 index 0000000..bf3c3f5 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/CheckBox.css @@ -0,0 +1,44 @@ +/* dojox.mobile.CheckBox */ +.mblCheckBox { + position: relative; + cursor: pointer; + outline: none; + -webkit-appearance: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + border: #9CACC0 1px outset; + -webkit-border-radius: 3px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd), to(#cecece), color-stop(0.5, #f8f8f8), color-stop(0.5, #eeeeee)); + font: inherit; + -webkit-transform: translatey(0.45em); +} +.mblCheckBoxSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#ad7500), to(#ffaa00), color-stop(0.06, #ffb200), color-stop(0.5, #ffc700)); + border-color: #9CACC0; +} +.mblCheckBoxChecked, .mblCheckBox:checked { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#00a200), to(#00d300), color-stop(0.2, #00ba00), color-stop(0.2, #00ba00)); +} +.mblCheckBoxChecked::after, .mblCheckBox:checked::after { + position: absolute; + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.3em; + border-color: white; + border-width: 0.15em; + border-style: none solid solid none; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblCheckBoxChecked.mblCheckBoxSelected, .mblCheckBox:checked.mblCheckBoxSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#ad7500), to(#ffaa00), color-stop(0.06, #ffb200), color-stop(0.5, #ffc700)); + border-color: #9CACC0; +} +.mblCheckBoxChecked.mblCheckBoxSelected::after, .mblCheckBox:checked.mblCheckBoxSelected::after { + border-color: #9CACC0; +} diff --git a/js/dojo/dojox/mobile/themes/android/CheckBox.less b/js/dojo/dojox/mobile/themes/android/CheckBox.less new file mode 100644 index 0000000..09f93b2 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/CheckBox.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/CheckBox.less"; diff --git a/js/dojo/dojox/mobile/themes/android/ComboBox-compat.css b/js/dojo/dojox/mobile/themes/android/ComboBox-compat.css new file mode 100644 index 0000000..d9e9fa9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ComboBox-compat.css @@ -0,0 +1,7 @@ +/* dojox.mobile.ComboBox */ +.dijitPopup { + -moz-box-shadow: 0px 0px 50px black; + -o-box-shadow: 0px 0px 50px black; + -ms-box-shadow: 0px 0px 50px black; + box-shadow: 0px 0px 50px black; +} diff --git a/js/dojo/dojox/mobile/themes/android/ComboBox.css b/js/dojo/dojox/mobile/themes/android/ComboBox.css new file mode 100644 index 0000000..8556a91 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ComboBox.css @@ -0,0 +1,45 @@ +/* dojox.mobile.ComboBox */ +.dijitPopup { + margin: 0; + padding: 0; + position: absolute; + border: 0; + background-color: transparent; + -webkit-box-shadow: 0px 0px 50px black; + -webkit-border-radius: 0px; +} +.mblReset { + margin: 0; + padding: 0; + border: 0; + line-height: normal; + font: inherit; + color: inherit; +} +.mblComboBoxMenu { + overflow-y: hidden !important; + position: relative; + overflow: hidden; + border: 1px solid black; + -webkit-border-radius: 0px; + background-color: white; + color: black; +} +.mblComboBoxMenuItem { + white-space: nowrap; + padding: .1em .2em; + border-width: 1px 0 1px 0; + border-style: solid; + border-color: #ffffff; + color: inherit; + text-align: left; +} +.mblComboBoxMenuItemSelected { + background-color: black; + background-image: -webkit-gradient(linear, left top, left bottom, from(#048bf4), to(#005ce5)); + color: white; +} +.mblComboBoxMenuPreviousButton, .mblComboBoxMenuNextButton { + font-style: italic; + overflow: hidden; +} diff --git a/js/dojo/dojox/mobile/themes/android/ComboBox.less b/js/dojo/dojox/mobile/themes/android/ComboBox.less new file mode 100644 index 0000000..ab9458c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ComboBox.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ComboBox.less"; diff --git a/js/dojo/dojox/mobile/themes/android/EdgeToEdgeCategory.css b/js/dojo/dojox/mobile/themes/android/EdgeToEdgeCategory.css new file mode 100644 index 0000000..f585a35 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/EdgeToEdgeCategory.css @@ -0,0 +1,18 @@ +/* dojox.mobile.EdgeToEdgeCategory */ +.mblEdgeToEdgeCategory { + position: relative; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin: 0px; + padding: 0px 10px; + height: 22px; + border-bottom: 1px solid #393439; + background-color: #212021; + font-family: Helvetica; + font-size: 16px; + font-weight: bold; + color: white; + line-height: 22px; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0px; +} diff --git a/js/dojo/dojox/mobile/themes/android/EdgeToEdgeCategory.less b/js/dojo/dojox/mobile/themes/android/EdgeToEdgeCategory.less new file mode 100644 index 0000000..3bb63da --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/EdgeToEdgeCategory.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/EdgeToEdgeCategory.less"; diff --git a/js/dojo/dojox/mobile/themes/android/EdgeToEdgeList.css b/js/dojo/dojox/mobile/themes/android/EdgeToEdgeList.css new file mode 100644 index 0000000..83e2a57 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/EdgeToEdgeList.css @@ -0,0 +1,12 @@ +/* dojox.mobile.EdgeToEdgeList */ +.mblEdgeToEdgeList { + position: relative; + /* IE needs this */ + + margin: 0px; + padding: 0px; + background-color: black; +} +.mblEdgeToEdgeList .mblListItem:last-child { + border-bottom-color: #313431; +} diff --git a/js/dojo/dojox/mobile/themes/android/EdgeToEdgeList.less b/js/dojo/dojox/mobile/themes/android/EdgeToEdgeList.less new file mode 100644 index 0000000..227627c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/EdgeToEdgeList.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/EdgeToEdgeList.less"; diff --git a/js/dojo/dojox/mobile/themes/android/Heading-compat.css b/js/dojo/dojox/mobile/themes/android/Heading-compat.css new file mode 100644 index 0000000..8b9b01f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Heading-compat.css @@ -0,0 +1,22 @@ +/* mbl.widget.Heading */ +.mblHeading { + background-image: url(compat/heading-bg.png); +} +.mblHeadingSpanTitle { + white-space: normal; +} + +/* Heading Arrow Button */ +.mblArrowButtonHead { + position: absolute; + top: 0px; + left: 3px; + width: 19px; + height: 29px; + border-style: none; + background-image: url(compat/arrow-button-head.png); +} +.mblArrowButtonBody { + padding: 0px 10px 0px 3px; + background-image: url(compat/arrow-button-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/android/Heading.css b/js/dojo/dojox/mobile/themes/android/Heading.css new file mode 100644 index 0000000..8147058 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Heading.css @@ -0,0 +1,81 @@ +/* dojox.mobile.Heading */ +.mblHeading { + position: relative; + margin: 0px; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + z-index: 1; + padding: 0px 0px 0px 4px; + height: 25px; + background-color: #8C8A8C; + background-image: -webkit-gradient(linear, left top, left bottom, from(#9c9e9c), to(#848284)); + border-top: 1px solid #CDD5DF; + border-bottom: 1px solid #2D3642; + color: white; + font-family: Helvetica; + font-size: 14px; + font-weight: bold; + text-align: center; + line-height: 26px; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0px; +} +.mblHeading * { + z-index: 2; +} +.mblHeadingDivTitle { + position: absolute; + width: 100%; + display: none; + left: 0px; + z-index: 1; +} +.mblHeadingCenterTitle .mblHeadingDivTitle { + display: block; +} +.mblHeadingCenterTitle .mblHeadingSpanTitle { + display: none; +} +/* Heading Arrow Button */ +.mblArrowButton { + position: relative; + float: left; + height: 25px; + margin-right: 10px; +} +.mblArrowButtonHead { + position: absolute; + top: 4px; + left: 6px; + width: 14px; + height: 14px; + border: 1px solid #555555; + -webkit-transform: scale(0.8, 1) rotate(45deg); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e5e5e5), to(#7f7f7f), color-stop(0.5, #adadad), color-stop(0.5, #909090)); +} +.dj_chrome .mblArrowButtonHead { + border: 1px outset #555555; +} +.mblArrowButtonBody { + position: absolute; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + top: 0px; + left: 14px; + padding: 0px 10px 0px 3px; + height: 22px; + border-width: 1px 1px 1px 0px; + border-style: solid; + border-color: #555555; + font-family: Helvetica; + font-size: 13px; + color: white; + line-height: 23px; + background-color: #ADADAD; + background-image: -webkit-gradient(linear, left top, left bottom, from(#e5e5e5), to(#7f7f7f), color-stop(0.5, #adadad), color-stop(0.5, #909090)); +} +.mblArrowButtonSelected .mblArrowButtonHead, .mblArrowButtonSelected .mblArrowButtonBody { + background-color: #FFC700; + background-image: -webkit-gradient(linear, left top, left bottom, from(#ad7500), to(#ffaa00), color-stop(0.06, #ffb200), color-stop(0.5, #ffc700)); +} diff --git a/js/dojo/dojox/mobile/themes/android/Heading.less b/js/dojo/dojox/mobile/themes/android/Heading.less new file mode 100644 index 0000000..cfc8580 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Heading.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Heading.less"; diff --git a/js/dojo/dojox/mobile/themes/android/IconContainer-compat.css b/js/dojo/dojox/mobile/themes/android/IconContainer-compat.css new file mode 100644 index 0000000..adf6d49 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/IconContainer-compat.css @@ -0,0 +1,11 @@ +@import url("../common/domButtons/DomButtonColorButtons-compat.css"); + +/* dojox.mobile.IconItem */ +.mblIconArea div { + *font-size: 60px; /* IE 7 quirks */ +} + +/* Icon Content Heading */ +.mblIconContentHeading { + background-image: url(compat/icon-content-heading-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/android/IconContainer.css b/js/dojo/dojox/mobile/themes/android/IconContainer.css new file mode 100644 index 0000000..9e11d7b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/IconContainer.css @@ -0,0 +1,99 @@ +@import url("../common/domButtons/DomButtonColorButtons.css"); + +@import url("../common/IconContainer_keyframes.css"); +/* dojox.mobile.IconContainer */ +.mblIconContainer { + margin: 20px 0px 0px 10px; + padding: 0px 0px 40px 0px; +} +/* dojox.mobile.IconItem */ +.mblIconItem { + list-style-type: none; + float: left; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} +.mblIconItemTerminator { + list-style-type: none; + clear: both; + height: 20px; +} +.mblIconItemSub { + list-style-type: none; + margin-left: -10px; + background-color: white; + color: black; +} +.mblIconArea { + margin-bottom: 10px; + height: 78px; + width: 74px; + font-family: Helvetica; + font-size: 12px; + color: white; + text-align: center; +} +.mblIconArea div { + position: relative; + height: 65px; + line-height: 65px; + text-align: center; +} +.mblIconArea img { + vertical-align: middle; +} +.mblIconItemSpriteIcon { + position: absolute; +} +.mblContent { + clear: both; + padding-bottom: 20px; +} +table.mblClose { + clear: both; + cursor: pointer; +} +.mblVibrate { + position: relative; + -webkit-animation-duration: .5s; + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-iteration-count: 20; + -webkit-animation-name: mblVibrate; + -webkit-transform: rotate(0deg); +} +.mblCloseContent { + -webkit-animation-duration: .3s; + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-name: mblShrink; + -webkit-transform: scale(0.01); +} +.mblCloseContent.mblShrink0 { + -webkit-animation-name: mblShrink0; +} +.mblCloseContent.mblShrink1 { + -webkit-animation-name: mblShrink1; +} +.mblCloseContent.mblShrink2 { + -webkit-animation-name: mblShrink2; +} +.mblCloseContent.mblShrink3 { + -webkit-animation-name: mblShrink3; +} +/* Icon Content Heading */ +.mblIconContentHeading { + position: relative; + clear: both; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin-top: 0px; + padding-left: 40px; + height: 25px; + border-top: 1px solid #F1F3F4; + border-bottom: 1px solid #717D85; + background-image: -webkit-gradient(linear, left top, left bottom, from(#e0e4e7), to(#b4bec6), color-stop(0.5, #c4ccd2), color-stop(0.5, #bfc8ce)); + font-family: Helvetica; + font-size: 14px; + color: white; + line-height: 26px; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0px; +} diff --git a/js/dojo/dojox/mobile/themes/android/IconContainer.less b/js/dojo/dojox/mobile/themes/android/IconContainer.less new file mode 100644 index 0000000..963eae6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/IconContainer.less @@ -0,0 +1,5 @@ +@import url("../common/domButtons/DomButtonColorButtons.css"); +@import url("../common/IconContainer_keyframes.css"); + +@import "variables.less"; +@import "../common/IconContainer.less"; diff --git a/js/dojo/dojox/mobile/themes/android/ListItem-compat.css b/js/dojo/dojox/mobile/themes/android/ListItem-compat.css new file mode 100644 index 0000000..5ced8fe --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ListItem-compat.css @@ -0,0 +1,26 @@ +@import url("../common/domButtons/DomButtonGrayArrow-compat.css"); +@import url("../common/domButtons/DomButtonDarkBlueCheck-compat.css"); + +/* mbl.widget.ListItem */ +*html li.mblListItem.mblVariableHeight { /* IE6 hack */ + height: 0; +} + +.mblListItemIcon { + top: 18px; +} +.mblListItem .mblArrow { + border-style: none; + width: 9px; + height: 13px; + background-image: url(compat/gray-arrow.png); +} +.mblItemSelected .mblArrow { + background-image: url(compat/white-arrow.png); +} +*html .mblListItemTextBox { /* IE6 hack */ + height: 100%; +} +*html li.mblListItem.mblVariableHeight .mblListItemTextBox { /* IE6 hack */ + height: auto; +} diff --git a/js/dojo/dojox/mobile/themes/android/ListItem.css b/js/dojo/dojox/mobile/themes/android/ListItem.css new file mode 100644 index 0000000..8d61090 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ListItem.css @@ -0,0 +1,84 @@ +@import url("../common/domButtons/DomButtonGrayArrow.css"); + +@import url("../common/domButtons/DomButtonWhiteCheck.css"); +/* dojox.mobile.ListItem */ +.mblListItem { + position: relative; + list-style-type: none; + vertical-align: bottom; + /* To avoid IE6 LI bug */ + + padding: 0px 0px 0px 7px; + height: 64px; + border-bottom: solid 1px #313431; + background-color: black; + font-size: 21px; + color: white; + line-height: 64px; +} +.mblListItem.mblVariableHeight { + height: auto; + padding: 11px 0px 10px 6px; + line-height: normal; +} +.mblListItem .mblListItemAnchor { + display: block; + height: 100%; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + background-position: 14px 17px; + text-decoration: none; + padding-right: 7px; +} +.mblListItem .mblListItemAnchor * { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0.2); +} +.mblItemSelected { + background-color: #FFC700; + background-image: -webkit-gradient(linear, left top, left bottom, from(#ad7500), to(#ffaa00), color-stop(0.06, #ffb200), color-stop(0.5, #ffc700)); +} +.mblItemSelected .mblListItemAnchor { + color: black; +} +.mblItemSelected .mblDomButton div { + border-color: white; +} +.mblListItemTextBoxSelected { + background-color: #048BF4; +} +.mblListItemIcon { + float: left; + line-height: normal; + margin-top: 17px; + margin-right: 11px; +} +.mblListItemSpriteIcon { + position: absolute; + margin-top: 7px; + margin-left: 8px; +} +.mblListItemRightIcon, .mblListItemRightIcon2 { + position: relative; + float: right; + line-height: normal; + margin-top: 17px; + margin-bottom: -17px; +} +.mblListItemRightText { + position: relative; + float: right; + line-height: normal; + color: white; + margin: 20px 4px 0 0; +} +.mblListItemTextBox { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.mblVariableHeight .mblListItemTextBox { + white-space: normal; +} +.mblListItemSubText { + font-size: 14px; + color: gray; +} diff --git a/js/dojo/dojox/mobile/themes/android/ListItem.less b/js/dojo/dojox/mobile/themes/android/ListItem.less new file mode 100644 index 0000000..45d4386 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ListItem.less @@ -0,0 +1,5 @@ +@import url("../common/domButtons/DomButtonGrayArrow.css"); +@import url("../common/domButtons/DomButtonWhiteCheck.css"); + +@import "variables.less"; +@import "../common/ListItem.less"; diff --git a/js/dojo/dojox/mobile/themes/android/Opener-compat.css b/js/dojo/dojox/mobile/themes/android/Opener-compat.css new file mode 100644 index 0000000..68cb1a8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Opener-compat.css @@ -0,0 +1,3 @@ +/* dojox.mobile.Opener */ +@import url("Overlay-compat.css"); +@import url("Tooltip-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/android/Opener.css b/js/dojo/dojox/mobile/themes/android/Opener.css new file mode 100644 index 0000000..8f2d4c8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Opener.css @@ -0,0 +1,7 @@ +/* dojox.mobile.Opener */ +@import url("Overlay.css"); +@import url("Tooltip.css"); + +.mblOpenerUnderlay { + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} diff --git a/js/dojo/dojox/mobile/themes/android/Overlay-compat.css b/js/dojo/dojox/mobile/themes/android/Overlay-compat.css new file mode 100644 index 0000000..3bc72a3 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Overlay-compat.css @@ -0,0 +1,13 @@ +/* dojox.mobile.Overlay */ +.mblOverlay { + _position: absolute; + text-align: center; +} +.dj_gecko .mblOverlay { + text-align: -moz-center; +} +.dj_ie9 .mblOverlay > *, +.dj_ie8 .mblOverlay > * +{ + margin: 0 auto; +} diff --git a/js/dojo/dojox/mobile/themes/android/Overlay.css b/js/dojo/dojox/mobile/themes/android/Overlay.css new file mode 100644 index 0000000..40a1228 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Overlay.css @@ -0,0 +1,18 @@ +@import url("../common/transitions/coverv.css"); + +@import url("../common/transitions/revealv.css"); +/* dojox.mobile.Overlay */ +.mblOverlay { + position: fixed; + z-index: 2000; + left: 0; + bottom: 0; + margin: 0; + width: 100%; + text-align: -webkit-center; + background-color: #333333; + background-image: none; +} +.mblOverlayHidden *, .mblOverlayHidden { + visibility: hidden !important; +} diff --git a/js/dojo/dojox/mobile/themes/android/Overlay.less b/js/dojo/dojox/mobile/themes/android/Overlay.less new file mode 100644 index 0000000..e49ea9e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Overlay.less @@ -0,0 +1,5 @@ +@import url("../common/transitions/coverv.css"); +@import url("../common/transitions/revealv.css"); + +@import "variables.less"; +@import "../common/Overlay.less"; diff --git a/js/dojo/dojox/mobile/themes/android/PageIndicator.css b/js/dojo/dojox/mobile/themes/android/PageIndicator.css new file mode 100644 index 0000000..a175ad6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/PageIndicator.css @@ -0,0 +1,24 @@ +/* dojox.mobile.PageIndicator */ +.mblPageIndicator { + position: relative; + width: 100%; + height: 20px; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} +.mblPageIndicatorContainer { + margin-top: 4px; + margin-left: auto; + margin-right: auto; +} +.mblPageIndicatorDot { + margin: 0px 3px; + width: 6px; + height: 6px; + font-size: 1px; + background-color: #949294; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; +} +.mblPageIndicatorDotSelected { + background-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/android/PageIndicator.less b/js/dojo/dojox/mobile/themes/android/PageIndicator.less new file mode 100644 index 0000000..9bb6c49 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/PageIndicator.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/PageIndicator.less"; diff --git a/js/dojo/dojox/mobile/themes/android/ProgressIndicator-compat.css b/js/dojo/dojox/mobile/themes/android/ProgressIndicator-compat.css new file mode 100644 index 0000000..4ee0810 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ProgressIndicator-compat.css @@ -0,0 +1,46 @@ +/* Progress Indicator */ +.mblProg { + position: absolute; + top: 0px; + width: 4px; + font-size: 1px; + height: 36px; + overflow: hidden; + background-color: #C0C0C0; +} +.mblProg0 { + left: 0px; +} +.mblProg1 { + left: 8px; +} +.mblProg2 { + left: 16px; +} +.mblProg3 { + left: 24px; +} +.mblProg4 { + left: 32px; +} +.mblProg5 { + left: 40px; +} +.mblProg6 { + left: 48px; +} +.mblProg7 { + left: 56px; +} +.mblProg8 { + left: 64px; +} +.mblProg9 { + left: 72px; +} +.mblProg10 { + left: 80px; +} +.mblProg11 { + left: 80px; +} diff --git a/js/dojo/dojox/mobile/themes/android/ProgressIndicator.css b/js/dojo/dojox/mobile/themes/android/ProgressIndicator.css new file mode 100644 index 0000000..2340637 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ProgressIndicator.css @@ -0,0 +1,58 @@ +/* Progress Indicator */ +.mblProgContainer { + position: absolute; + width: 40px; + height: 40px; + top: 180px; + left: 50%; + margin: -18px 0px 0px -18px; +} +.mblProg { + position: absolute; + left: 2px; + top: 0px; + width: 11px; + font-size: 1px; + height: 4px; + overflow: hidden; + -webkit-transform-origin: 0 2px; + background-color: #C0C0C0; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} +.mblProg0 { + -webkit-transform: translate(18px, 10px) rotate(-90.1deg); +} +.mblProg1 { + -webkit-transform: translate(22px, 11px) rotate(-60deg); +} +.mblProg2 { + -webkit-transform: translate(25px, 14px) rotate(-30deg); +} +.mblProg3 { + -webkit-transform: translate(26px, 18px) rotate(0deg); +} +.mblProg4 { + -webkit-transform: translate(25px, 22px) rotate(30deg); +} +.mblProg5 { + -webkit-transform: translate(22px, 25px) rotate(60deg); +} +.mblProg6 { + -webkit-transform: translate(18px, 26px) rotate(90.1deg); +} +.mblProg7 { + -webkit-transform: translate(14px, 25px) rotate(120deg); +} +.mblProg8 { + -webkit-transform: translate(11px, 22px) rotate(150deg); +} +.mblProg9 { + -webkit-transform: translate(10px, 18px) rotate(180deg); +} +.mblProg10 { + -webkit-transform: translate(11px, 14px) rotate(210deg); +} +.mblProg11 { + -webkit-transform: translate(14px, 11px) rotate(240deg); +} diff --git a/js/dojo/dojox/mobile/themes/android/ProgressIndicator.less b/js/dojo/dojox/mobile/themes/android/ProgressIndicator.less new file mode 100644 index 0000000..2ab2a2d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ProgressIndicator.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ProgressIndicator.less"; diff --git a/js/dojo/dojox/mobile/themes/android/RadioButton-compat.css b/js/dojo/dojox/mobile/themes/android/RadioButton-compat.css new file mode 100644 index 0000000..17e473f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/RadioButton-compat.css @@ -0,0 +1,33 @@ +/* dojox.mobile.RadioButton */ +.mblRadioButton { + background-image: url(compat/button-bg.png); + -moz-border-radius: 0.5em; + -o-border-radius: 0.5em; + -ms-border-radius: 0.5em; + border-radius: 0.5em; + -moz-appearance: none; + -o-appearance: none; + -ms-appearance: none; + appearance: none; + -o-transform: translateY(0.45em); + -ms-transform: translateY(0.45em); + transform: translateY(0.45em); +} +.mblRadioButtonChecked, +.mblRadioButton:checked { + background-image: url(compat/togglebutton-chk-bg.png); +} +.mblRadioButtonChecked::after, +.mblRadioButton:checked::after { + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; +} +.mblRadioButtonChecked.mblRadioButtonSelected { + background-image: url(compat/button-sel-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/android/RadioButton.css b/js/dojo/dojox/mobile/themes/android/RadioButton.css new file mode 100644 index 0000000..1f997dc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/RadioButton.css @@ -0,0 +1,41 @@ +/* dojox.mobile.RadioButton */ +.mblRadioButton { + position: relative; + cursor: pointer; + outline: none; + -webkit-appearance: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + border: #9CACC0 1px outset; + -webkit-border-radius: 0.5em; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd), to(#cecece), color-stop(0.5, #f8f8f8), color-stop(0.5, #eeeeee)); + font: inherit; + -webkit-transform: translatey(0.45em); +} +.mblRadioButtonChecked, .mblRadioButton:checked { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#00a200), to(#00d300), color-stop(0.2, #00ba00), color-stop(0.2, #00ba00)); +} +.mblRadioButtonChecked::after, .mblRadioButton:checked::after { + position: absolute; + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.25em; + border-color: white; + border-width: 0.15em; + border-style: none solid solid none; + border-color: white; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblRadioButtonChecked.mblRadioButtonSelected, .mblRadioButton:checked.mblRadioButtonSelected { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#ad7500), to(#ffaa00), color-stop(0.06, #ffb200), color-stop(0.5, #ffc700)); +} +.mblRadioButtonChecked.mblRadioButtonSelected::after, .mblRadioButton:checked.mblRadioButtonSelected::after { + border-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/android/RadioButton.less b/js/dojo/dojox/mobile/themes/android/RadioButton.less new file mode 100644 index 0000000..0793ca6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/RadioButton.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RadioButton.less"; diff --git a/js/dojo/dojox/mobile/themes/android/RoundRect-compat.css b/js/dojo/dojox/mobile/themes/android/RoundRect-compat.css new file mode 100644 index 0000000..cf3ce84 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/RoundRect-compat.css @@ -0,0 +1,64 @@ +/* Round Corner */ +.mblRoundCorner { + background-color: black; + height: 1px; + font-size: 1px; + overflow: hidden; + border-style: solid; + border-color: #ADAAAD; + border-width: 0px 1px; +} +.mblRoundRectContainer { + padding: 3px 8px; + background-color: black; + border-style: solid; + border-color: #ADAAAD; + border-width: 0px 1px; +} +.mblRoundRectList .mblRoundRectContainer { + margin: 0px; + padding: 0px; +} +.mblRoundCorner0T { + height: 0px; +} +.mblRoundCorner1T { + background-color: #ADAAAD; + margin: 0px 5px; +} +.mblRoundCorner2T { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner3T { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4T { + margin: 0px 1px; +} +.mblRoundCorner5T { + margin: 0px 1px; +} + +.mblRoundCorner0B { + height: 0px; +} +.mblRoundCorner1B { + margin: 0px 1px; +} +.mblRoundCorner2B { + margin: 0px 1px; +} +.mblRoundCorner3B { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4B { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner5B { + background-color: #ADAAAD; + margin: 0px 5px; +} diff --git a/js/dojo/dojox/mobile/themes/android/RoundRect.css b/js/dojo/dojox/mobile/themes/android/RoundRect.css new file mode 100644 index 0000000..c76a82f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/RoundRect.css @@ -0,0 +1,13 @@ +/* dojox.mobile.RoundRect */ +.mblRoundRect { + margin: 7px 9px 16px; + padding: 8px; + border: 1px solid #ADAAAD; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + color: white; + background-color: black; +} +.mblRoundRect.mblShadow { + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5); +} diff --git a/js/dojo/dojox/mobile/themes/android/RoundRect.less b/js/dojo/dojox/mobile/themes/android/RoundRect.less new file mode 100644 index 0000000..efec816 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/RoundRect.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RoundRect.less"; diff --git a/js/dojo/dojox/mobile/themes/android/RoundRectCategory.css b/js/dojo/dojox/mobile/themes/android/RoundRectCategory.css new file mode 100644 index 0000000..9be5f0c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/RoundRectCategory.css @@ -0,0 +1,10 @@ +/* dojox.mobile.RoundRectCategory */ +.mblRoundRectCategory { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + margin: 18px 0px 0px 20px; + font-family: Helvetica; + font-size: 16px; + color: white; +} diff --git a/js/dojo/dojox/mobile/themes/android/RoundRectCategory.less b/js/dojo/dojox/mobile/themes/android/RoundRectCategory.less new file mode 100644 index 0000000..e9148cc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/RoundRectCategory.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RoundRectCategory.less"; diff --git a/js/dojo/dojox/mobile/themes/android/RoundRectList-compat.css b/js/dojo/dojox/mobile/themes/android/RoundRectList-compat.css new file mode 100644 index 0000000..cf3ce84 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/RoundRectList-compat.css @@ -0,0 +1,64 @@ +/* Round Corner */ +.mblRoundCorner { + background-color: black; + height: 1px; + font-size: 1px; + overflow: hidden; + border-style: solid; + border-color: #ADAAAD; + border-width: 0px 1px; +} +.mblRoundRectContainer { + padding: 3px 8px; + background-color: black; + border-style: solid; + border-color: #ADAAAD; + border-width: 0px 1px; +} +.mblRoundRectList .mblRoundRectContainer { + margin: 0px; + padding: 0px; +} +.mblRoundCorner0T { + height: 0px; +} +.mblRoundCorner1T { + background-color: #ADAAAD; + margin: 0px 5px; +} +.mblRoundCorner2T { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner3T { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4T { + margin: 0px 1px; +} +.mblRoundCorner5T { + margin: 0px 1px; +} + +.mblRoundCorner0B { + height: 0px; +} +.mblRoundCorner1B { + margin: 0px 1px; +} +.mblRoundCorner2B { + margin: 0px 1px; +} +.mblRoundCorner3B { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4B { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner5B { + background-color: #ADAAAD; + margin: 0px 5px; +} diff --git a/js/dojo/dojox/mobile/themes/android/RoundRectList.css b/js/dojo/dojox/mobile/themes/android/RoundRectList.css new file mode 100644 index 0000000..058587c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/RoundRectList.css @@ -0,0 +1,25 @@ +/* dojox.mobile.RoundRectList */ +.mblRoundRectList { + position: relative; + /* IE needs this */ + + margin: 7px 9px 16px; + padding: 0px; + border: 1px solid #ADAAAD; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + background-color: white; +} +.mblRoundRectList .mblListItem:first-child { + -webkit-border-top-left-radius: 8px; + -webkit-border-top-right-radius: 8px; + -moz-border-radius-topleft: 8px; + -moz-border-radius-topright: 8px; +} +.mblRoundRectList .mblListItem:last-child { + border-bottom-width: 0px; + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; +} diff --git a/js/dojo/dojox/mobile/themes/android/RoundRectList.less b/js/dojo/dojox/mobile/themes/android/RoundRectList.less new file mode 100644 index 0000000..52e1164 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/RoundRectList.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RoundRectList.less"; diff --git a/js/dojo/dojox/mobile/themes/android/Slider-compat.css b/js/dojo/dojox/mobile/themes/android/Slider-compat.css new file mode 100644 index 0000000..c8a47f8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Slider-compat.css @@ -0,0 +1,43 @@ +/* dojox.mobile.Slider */ +.mblSlider { + background-image: url(compat/slider-h-bg.png); + -moz-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + border-radius: 2px; + -moz-user-select: none; /* prevent selection */ + -o-user-select: none; + -ms-user-select: none; + user-select: none; + -moz-box-sizing: content-box; /* make width and height consistent with a DIV */ + -o-box-sizing: content-box; + -ms-box-sizing: content-box; + box-sizing: content-box; +} +.mblSlider.mblSliderV { + background: #BDBEBD; +} +.mblSliderProgressBar { + background-image: url(compat/slider-h-bar-bg.png); + background-repeat: repeat-x; + -moz-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + border-radius: 2px; +} +.mblSliderV .mblSliderProgressBar { + background: #00A200; +} +.mblSliderHandle { + background-image: url(compat/slider-handle-bg.png); + -moz-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + border-radius: 2px; +} +.mblSliderTransition { + -moz-transition-duration: 400ms; + -o-transition-duration: 400ms; + -ms-transition-duration: 400ms; + transition-duration: 400ms; +} diff --git a/js/dojo/dojox/mobile/themes/android/Slider.css b/js/dojo/dojox/mobile/themes/android/Slider.css new file mode 100644 index 0000000..4a16e82 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Slider.css @@ -0,0 +1,62 @@ +/* dojox.mobile.Slider */ +.mblSlider { + outline: none; + -webkit-user-select: none; + /* prevent selection */ + + -webkit-box-sizing: content-box; + /* make width and height consistent with a DIV */ + + margin: 15px; + /* 1/2 handle width for hanging off the ends of the bar */ + + border: #B0B0B0 1px inset; + background-image: -webkit-gradient(linear, left top, left bottom, from(#bdbebd), to(#f7f3f7)); + -webkit-border-radius: 2px; +} +.mblSliderH { + width: 200px; + height: 8px; +} +.mblSliderH .mblSliderProgressBar { + height: 100%; +} +.mblSliderH .mblSliderHandle { + top: 50%; +} +.mblSliderV { + height: 200px; + width: 8px; +} +.mblSliderV .mblSliderProgressBar { + width: 100%; +} +.mblSliderV .mblSliderHandle { + left: 50%; +} +.mblSliderProgressBar { + background-image: -webkit-gradient(linear, left top, left bottom, from(#00a200), to(#00d300), color-stop(0.2, #00ba00), color-stop(0.2, #00ba00)); + -webkit-border-radius: 2px; +} +.mblSliderHandle { + margin: -10px 0 0 -10px; + width: 18px; + height: 18px; + border: #9D9D9D 1px outset; + -webkit-border-radius: 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#9c9a9c), to(#848284)); +} +.mblSliderTransition { + -webkit-transition-duration: 400ms; +} +.mblSliderTouchBox { + margin: 0; + padding: 12pt; + left: -12pt; + top: -12pt; + border: none; + width: 100%; + height: 100%; + background-color: transparent; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} diff --git a/js/dojo/dojox/mobile/themes/android/Slider.less b/js/dojo/dojox/mobile/themes/android/Slider.less new file mode 100644 index 0000000..928972f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Slider.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Slider.less"; diff --git a/js/dojo/dojox/mobile/themes/android/Switch-compat.css b/js/dojo/dojox/mobile/themes/android/Switch-compat.css new file mode 100644 index 0000000..3756d95 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Switch-compat.css @@ -0,0 +1,70 @@ +/* Switch - default */ +.mblSwitchBg { + border: none; +} +.mblSwitchBgLeft { + background: none; + background-image: url(compat/switch-default-l.gif); + background-repeat: no-repeat; +} +.mblSwitchBgRight { + background: none; + background-image: url(compat/switch-default-r.gif); + background-repeat: no-repeat; +} +.mblSwitchKnob { + top: 0px; + height: 27px; + background: none; + background-image: url(compat/switch-default-k.gif); + background-repeat: no-repeat; + border: none; +} +/* Switch - Round Shape1 */ +.mblSwRoundShape1 .mblSwitchBgLeft { + background-image: url(compat/switch-round-l.gif); +} +.mblSwRoundShape1 .mblSwitchBgRight { + background-image: url(compat/switch-round-r.gif); +} +.mblSwRoundShape1 .mblSwitchKnob { + top: 1px; + height: 26px; + background-image: url(compat/switch-round1-k.gif); +} +/* Switch - Round Shape2 */ +.mblSwRoundShape2 .mblSwitchBgLeft { + background-image: url(compat/switch-round-l.gif); +} +.mblSwRoundShape2 .mblSwitchBgRight { + background-image: url(compat/switch-round-r.gif); +} +.mblSwRoundShape2 .mblSwitchKnob { + top: 1px; + height: 26px; + background-image: url(compat/switch-round2-k.gif); +} +/* Switch - Arc Shape1 */ +.mblSwArcShape1 .mblSwitchBgLeft { + background-image: url(compat/switch-arc-l.gif); +} +.mblSwArcShape1 .mblSwitchBgRight { + background-image: url(compat/switch-arc-r.gif); +} +.mblSwArcShape1 .mblSwitchKnob { + top: 1px; + height: 26px; + background-image: url(compat/switch-arc1-k.gif); +} +/* Switch - Arc Shape2 */ +.mblSwArcShape2 .mblSwitchBgLeft { + background-image: url(compat/switch-arc-l.gif); +} +.mblSwArcShape2 .mblSwitchBgRight { + background-image: url(compat/switch-arc-r.gif); +} +.mblSwArcShape2 .mblSwitchKnob { + top: 1px; + height: 26px; + background-image: url(compat/switch-arc2-k.gif); +} diff --git a/js/dojo/dojox/mobile/themes/android/Switch.css b/js/dojo/dojox/mobile/themes/android/Switch.css new file mode 100644 index 0000000..f8d1147 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Switch.css @@ -0,0 +1,18 @@ +@import url("../common/Switch.css"); +/* dojox.mobile.Switch */ +.mblItemSwitch { + top: 18px; +} +.mblSwitchBg { + -webkit-border-radius: 2px; +} +.mblSwitchBgLeft { + background-image: -webkit-gradient(linear, left top, left bottom, from(#00a200), to(#00d300), color-stop(0.2, #00ba00), color-stop(0.2, #00ba00)); +} +.mblSwitchBgRight { + background-image: -webkit-gradient(linear, left top, left bottom, from(#bdbebd), to(#f7f3f7)); +} +.mblSwitchKnob { + background-image: -webkit-gradient(linear, left top, left bottom, from(#9c9a9c), to(#848284)); + -webkit-border-radius: 2px; +} diff --git a/js/dojo/dojox/mobile/themes/android/Switch.less b/js/dojo/dojox/mobile/themes/android/Switch.less new file mode 100644 index 0000000..84a1146 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Switch.less @@ -0,0 +1,4 @@ +@import url("../common/Switch.css"); + +@import "variables.less"; +@import "../common/Switch.less"; diff --git a/js/dojo/dojox/mobile/themes/android/TabBar-compat.css b/js/dojo/dojox/mobile/themes/android/TabBar-compat.css new file mode 100644 index 0000000..94fbb13 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/TabBar-compat.css @@ -0,0 +1,35 @@ +/* dojox.mobile.TabBarButton */ +.mblTabBar { + background-color: #1e1e1e; +} +.dj_ie6 .mblTabBarButtonDiv, .dj_ie7 .mblTabBarButtonDiv { + left: auto; +} +.dj_ie6 .mblTabBar .mblTabBarButton { + display: inline; /* IE bug*/ +} +.mblTabBar .mblTabBarButton.mblTabButtonSelected { + -moz-border-radius: 3px; + background-image: none; +} +.mblTabPanelHeader .mblTabButton { + background-image: url(compat/tab-button-bg.png); +} +.mblTabPanelHeader .mblTabButton.mblTabButtonSelected { + background-image: url(compat/tab-sel-button-bg.png); +} +*html .mblTabButton { /* IE6 hack */ + behavior: expression( + (function(el){ + if(!el.previousSibling) + el.style.borderWidth = "1px"; + el.style.behavior = "none"; + })(this) + ); +} +.dj_ie6 .mblTabPanelHeader .mblDomButton { + left: 0px; +} +.mblHeading .mblTabPanelHeader .mblTabButton { + background-image: none; +} diff --git a/js/dojo/dojox/mobile/themes/android/TabBar.css b/js/dojo/dojox/mobile/themes/android/TabBar.css new file mode 100644 index 0000000..99955c8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/TabBar.css @@ -0,0 +1,158 @@ +/* dojox.mobile.TabBar */ +.mblTabBar { + position: relative; + overflow: hidden; + white-space: nowrap; + margin: 0px; + padding: 0px; + height: 48px; + border-top: 1px solid #000000; + background-color: #000000; + background-image: -webkit-gradient(linear, left top, left bottom, from(#2d2d2d), to(#000000)); + color: white; + text-align: center; +} +.mblTabBarNoIcons { + height: 34px; +} +.mblTabBarNoText { + height: 34px; +} +/* dojox.mobile.TabBarButton */ +.mblTabBarButton { + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} +.mblTabBar .mblTabBarButton { + position: relative; + list-style-type: none; + float: left; +} +.mblTabBar .mblTabBarButton.mblTabButtonSelected { + -webkit-border-radius: 3px; + background-color: #404040; + background-image: -webkit-gradient(linear, left top, left bottom, from(#484848), to(#242424)); +} +.mblTabBarButtonAnchor { + display: block; + text-decoration: none; +} +.mblTabBarButtonDiv { + position: relative; + margin-left: auto; + margin-right: auto; + width: 29px; + height: 32px; + margin-top: 2px; +} +.mblTabBarButtonIcon { + position: absolute; + left: 0px; + top: 0px; +} +.mblTabBarButtonSpriteIcon { + position: absolute; +} +.mblTabBarButtonTextBox { + font-family: "Helvetica Neue", Helvetica; + font-size: 11px; +} +.mblTabBarNoIcons .mblTabBarButtonDiv { + display: none; +} +.mblTabBarNoIcons .mblTabBarButtonTextBox { + line-height: 34px; + font-size: 20px; +} +.mblTabBarTop .mblTabButton .mblTabBarButtonDiv { + height: 38px; +} +.mblTabBarHead .mblTabButton .mblTabBarButtonDiv { + margin-top: -2px; +} +.mblTabButton { + position: relative; + float: left; + list-style-type: none; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + margin-right: 2px; + width: 78px; + height: 61px; + border-width: 0px 1px 0px 1px; + border-style: solid; + border-color: black #182018 black #393C39; + background-color: #212421; + background-image: -webkit-gradient(linear, left top, left bottom, from(#181818), to(#100c10), color-stop(0.1, #313031)); + font-family: Helvetica; + font-size: 13px; + color: white; + text-align: center; +} +.mblTabButton img { + position: absolute; + left: 0px; + margin-top: 8px; +} +.mblTabButtonSelected .mblTabBarButtonTextBox { + color: white; +} +.mblTabButtonSelected.mblTabButton { + background-color: #8C8E8C; + background-image: -webkit-gradient(linear, left top, left bottom, from(#a59ea5), to(#848284)); +} +.mblTabButtonHighlighted.mblTabButton { + background-color: #FFB600; + background-image: -webkit-gradient(linear, left top, left bottom, from(#ffcb00), to(#ff9a00)); +} +.mblTabButtonImgDiv { + position: relative; + margin-left: 24px; + height: 40px; +} +.mblTabPanelHeader { + position: relative; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin: 0px; + padding: 0px 0px 0px 0px; + height: 64px; + border-top: 1px solid #CDD5DF; + border-bottom: 2px solid #949694; + background-color: #000000; + font-family: Helvetica; + font-size: 20px; + color: white; + text-align: center; +} +.mblTabPanelHeader .mblTabButton { + margin-top: 3px; +} +.mblTabPanelHeader .mblTabButtonDomButton { + width: 43px; +} +.mblTabPanelHeader .mblTabButtonDomButtonClass { + left: 8px; +} +.mblHeading .mblTabPanelHeader { + height: 25px; +} +.mblHeading .mblTabPanelHeader .mblTabButton { + margin-top: 0; + margin-right: 0; + height: 22px; + line-height: 23px; + border-width: 1px 1px 1px 0px; + border-style: solid; + border-color: #555555; + background-color: #ADADAD; + background-image: -webkit-gradient(linear, left top, left bottom, from(#e5e5e5), to(#7f7f7f), color-stop(0.5, #adadad), color-stop(0.5, #909090)); +} +.mblHeading .mblTabPanelHeader .mblTabButton:first-child { + border-left-width: 1px; +} +.mblHeading .mblTabPanelHeader .mblTabButtonSelected { + background-color: #FFC700; + background-image: -webkit-gradient(linear, left top, left bottom, from(#ad7500), to(#ffaa00), color-stop(0.06, #ffb200), color-stop(0.5, #ffc700)); +} diff --git a/js/dojo/dojox/mobile/themes/android/TabBar.less b/js/dojo/dojox/mobile/themes/android/TabBar.less new file mode 100644 index 0000000..4875c40 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/TabBar.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/TabBar.less"; diff --git a/js/dojo/dojox/mobile/themes/android/TextArea-compat.css b/js/dojo/dojox/mobile/themes/android/TextArea-compat.css new file mode 100644 index 0000000..a4312f1 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/TextArea-compat.css @@ -0,0 +1,7 @@ +/* dojox.mobile.TextArea */ +.mblTextArea { + -moz-border-radius: 3px; + -o-border-radius: 3px; + -ms-border-radius: 3px; + border-radius: 3px; +} diff --git a/js/dojo/dojox/mobile/themes/android/TextArea.css b/js/dojo/dojox/mobile/themes/android/TextArea.css new file mode 100644 index 0000000..4cb389c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/TextArea.css @@ -0,0 +1,14 @@ +/* dojox.mobile.TextArea */ +.mblTextArea { + padding: 4px 1px; + border-color: #9CACC0; + border-width: 1px; + border-style: inset; + -webkit-border-radius: 3px; + font-family: Helvetica; + font-size: 13px; +} +/* dojox.mobile.ExpandingTextArea */ +.mblExpandingTextArea { + margin: 2px; +} diff --git a/js/dojo/dojox/mobile/themes/android/TextArea.less b/js/dojo/dojox/mobile/themes/android/TextArea.less new file mode 100644 index 0000000..c16ffe0 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/TextArea.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/TextArea.less"; diff --git a/js/dojo/dojox/mobile/themes/android/TextBox-compat.css b/js/dojo/dojox/mobile/themes/android/TextBox-compat.css new file mode 100644 index 0000000..619c360 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/TextBox-compat.css @@ -0,0 +1,7 @@ +/* dojox.mobile.TextBox */ +.mblTextBox { + -moz-border-radius: 3px; + -o-border-radius: 3px; + -ms-border-radius: 3px; + border-radius: 3px; +} diff --git a/js/dojo/dojox/mobile/themes/android/TextBox.css b/js/dojo/dojox/mobile/themes/android/TextBox.css new file mode 100644 index 0000000..d847ab5 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/TextBox.css @@ -0,0 +1,8 @@ +/* dojox.mobile.TextBox */ +.mblTextBox { + height: 22px; + border: #9CACC0 1px inset; + -webkit-border-radius: 3px; + font-family: Helvetica; + font-size: 13px; +} diff --git a/js/dojo/dojox/mobile/themes/android/TextBox.less b/js/dojo/dojox/mobile/themes/android/TextBox.less new file mode 100644 index 0000000..c83890a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/TextBox.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/TextBox.less"; diff --git a/js/dojo/dojox/mobile/themes/android/ToggleButton-compat.css b/js/dojo/dojox/mobile/themes/android/ToggleButton-compat.css new file mode 100644 index 0000000..9891522 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ToggleButton-compat.css @@ -0,0 +1,30 @@ +/* dojox.mobile.ToggleButton */ +.mblToggleButton { + background-image: url(compat/button-bg.png); + -moz-border-radius: 3px; + -o-border-radius: 3px; + -ms-border-radius: 3px; + border-radius: 3px; +} +.mblToggleButtonSelected { + background-image: url(compat/button-sel-bg.png); +} +.mblToggleButtonChecked { + background-image: url(compat/togglebutton-chk-bg.png); +} +.mblToggleButton.mblToggleButtonChecked::after { + -moz-transform: translate(-25px,0px) rotate(45deg) skew(10deg); + -o-transform: rotate(45deg) skew(10deg); + -ms-transform: rotate(45deg) skew(10deg); + transform: rotate(45deg) skew(10deg); + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; +} +.dj_ff3 .mblToggleButton.mblToggleButtonChecked::after { + -moz-transform: translate(-25px,-6px) rotate(45deg) skew(10deg); +} +.mblToggleButtonChecked.mblToggleButtonSelected { + background-image: url(compat/button-sel-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/android/ToggleButton.css b/js/dojo/dojox/mobile/themes/android/ToggleButton.css new file mode 100644 index 0000000..31d0557 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ToggleButton.css @@ -0,0 +1,52 @@ +/* dojox.mobile.ToggleButton */ +.mblToggleButton { + position: relative; + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + padding: 0px 10px 0px 25px; + height: 29px; + border-width: 1px 1px 1px 1px; + border-style: outset; + border-color: #9CACC0; + -webkit-border-radius: 3px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd), to(#cecece), color-stop(0.5, #f8f8f8), color-stop(0.5, #eeeeee)); + font-family: Helvetica; + font-size: 13px; + color: black; + line-height: 29px; +} +.mblToggleButton.mblToggleButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#ad7500), to(#ffaa00), color-stop(0.06, #ffb200), color-stop(0.5, #ffc700)); + color: white; +} +.mblToggleButton.mblToggleButtonChecked { + background-image: -webkit-gradient(linear, left top, left bottom, from(#00a200), to(#00d300), color-stop(0.2, #00ba00), color-stop(0.2, #00ba00)); + color: white; +} +.mblToggleButton.mblToggleButtonChecked::after { + position: absolute; + content: ""; + top: 6px; + left: 7px; + width: 5px; + height: 10px; + border-color: white; + border-width: 2px; + border-style: none solid solid none; + -webkit-transform: rotate(45deg) skew(10deg); + -webkit-transform-origin: 50% 50%; +} +.mblToggleButton.mblToggleButtonChecked.mblToggleButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#ad7500), to(#ffaa00), color-stop(0.06, #ffb200), color-stop(0.5, #ffc700)); + color: white; +} +.mblToggleButton.mblToggleButtonChecked.mblToggleButtonSelected::after { + border-color: white; +} +.mblToggleButton:disabled { + cursor: default; + border-color: grey; + background-image: none; + color: grey; +} diff --git a/js/dojo/dojox/mobile/themes/android/ToggleButton.less b/js/dojo/dojox/mobile/themes/android/ToggleButton.less new file mode 100644 index 0000000..bdce40f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ToggleButton.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ToggleButton.less"; diff --git a/js/dojo/dojox/mobile/themes/android/ToolBarButton.css b/js/dojo/dojox/mobile/themes/android/ToolBarButton.css new file mode 100644 index 0000000..968b029 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ToolBarButton.css @@ -0,0 +1,31 @@ +/* dojox.mobile.ToolBarButton */ +.mblToolBarButton { + float: left; + position: relative; + overflow: hidden; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + margin: 0px 6px; + height: 22px; + border: 1px solid #555555; + font-family: Helvetica; + font-size: 13px; + font-weight: bold; + color: white; + line-height: 23px; + text-align: center; +} +div.mblToolBarButtonDomButton { + height: 23px; +} +.mblToolBarButtonIcon { + position: relative; + top: -2px; + padding: 0px; +} +.mblToolBarButtonSpriteIcon { + position: absolute; +} +.mblToolBarButtonText { + padding: 0px 10px; +} diff --git a/js/dojo/dojox/mobile/themes/android/ToolBarButton.less b/js/dojo/dojox/mobile/themes/android/ToolBarButton.less new file mode 100644 index 0000000..3b67bdc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/ToolBarButton.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ToolBarButton.less"; diff --git a/js/dojo/dojox/mobile/themes/android/Tooltip-compat.css b/js/dojo/dojox/mobile/themes/android/Tooltip-compat.css new file mode 100644 index 0000000..6fd514d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Tooltip-compat.css @@ -0,0 +1,47 @@ +/* dojox.mobile.Tooltip */ +.mblTooltip { + -moz-border-radius: 8px; + -o-border-radius: 8px; + -ms-border-radius: 8px; + border-radius: 8px; + background-image: none; +} +.mblTooltipBefore .mblTooltipArrow { + *right: 0; /* IE 7 quirks */ +} +.mblTooltipAbove .mblTooltipArrow { + *bottom: 0px; /* IE 7 quirks */ +} +.mblTooltipBefore .mblTooltipInnerArrow { + *right: -1px; /* IE 7 quirks */ +} +.mblTooltipAbove .mblTooltipInnerArrow { + *bottom: -1px; /* IE 7 quirks */ +} +.mblTooltipBefore .mblTooltipInnerArrow { + border-right-color: #8C8A8C; +} +.mblTooltipAfter .mblTooltipInnerArrow { + border-left-color: #8C8A8C; +} +.mblTooltipAbove .mblTooltipInnerArrow { + border-bottom-color: #8C8A8C; +} +.mblTooltipBelow .mblTooltipInnerArrow { + border-top-color: #8C8A8C; +} +.mblTooltip .mblHeading { + *padding: 0 9px 12px; + *border-top: 1px solid #8C8A8C; + *border-bottom: 1px solid #8C8A8C; + *width: auto; + *height: auto; + *overflow: visible; + *line-height: normal; +} +.dj_ie9 .mblTooltip .mblHeading { + width: auto; +} +.mblTooltip .mblHeading .mblToolBarButton { + *margin: auto 6px; +} diff --git a/js/dojo/dojox/mobile/themes/android/Tooltip.css b/js/dojo/dojox/mobile/themes/android/Tooltip.css new file mode 100644 index 0000000..cc28997 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Tooltip.css @@ -0,0 +1,144 @@ +/* dojox.mobile.Tooltip */ +.mblTooltip { + position: absolute; + z-index: 2000; + display: block; + margin: 0; + padding: 5px; + border: #ADAAAD 1px solid; + background-color: #8C8A8C; + background-image: -webkit-gradient(linear, left top, left bottom, from(#9c9e9c), to(#848284)); + -webkit-border-radius: 3px; + opacity: .97; +} +.mblTooltipBubble { + overflow: visible; + padding: 3px; + background-color: #FFC700; + background-image: none; + color: black; +} +.mblTooltipBubble.mblTooltipAbove .mblTooltipInnerArrow { + border-bottom-color: #FFC700; +} +.mblTooltipBubble.mblTooltipBelow .mblTooltipInnerArrow { + border-top-color: #FFC700; +} +.mblTooltipBubble.mblTooltipAfter .mblTooltipInnerArrow { + border-left-color: #FFC700; +} +.mblTooltipBubble.mblTooltipBefore .mblTooltipInnerArrow { + border-right-color: #FFC700; +} +.mblTooltip.mblTooltipAfter { + margin-left: -11px; +} +.mblTooltip.mblTooltipBefore { + margin-left: 11px; +} +.mblTooltip.mblTooltipAbove { + margin-top: 11px; +} +.mblTooltip.mblTooltipBelow { + margin-top: -11px; +} +.mblTooltipAnchor { + position: absolute; + width: 1px; + height: 1px; + background-color: transparent; + line-height: 0; + font-size: 0; +} +.mblTooltipBefore .mblTooltipAnchor { + left: -1px; +} +.mblTooltipAfter .mblTooltipAnchor { + right: -1px; +} +.mblTooltipAbove .mblTooltipAnchor { + top: -1px; +} +.mblTooltipBelow .mblTooltipAnchor { + bottom: -1px; +} +.mblTooltipArrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + border: 11px solid transparent; +} +.mblTooltipBefore .mblTooltipArrow { + left: auto; + right: 1px; + top: 0; + bottom: auto; + border-left-width: 0; + border-right-color: #ADAAAD; +} +.mblTooltipAfter .mblTooltipArrow { + left: 1px; + right: auto; + top: 0; + bottom: auto; + border-right-width: 0; + border-left-color: #ADAAAD; +} +.mblTooltipAbove .mblTooltipArrow { + top: auto; + bottom: 1px; + left: auto; + right: auto; + border-top-width: 0; + border-bottom-color: #ADAAAD; +} +.mblTooltipBelow .mblTooltipArrow { + top: 1px; + bottom: auto; + left: auto; + right: auto; + border-bottom-width: 0; + border-top-color: #ADAAAD; +} +.mblTooltipInnerArrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + border: 10px solid transparent; +} +.mblTooltipBefore .mblTooltipInnerArrow { + right: 0; + top: 0; + border-left-width: 0; + border-right-color: #848284; +} +.mblTooltipAfter .mblTooltipInnerArrow { + left: 0; + top: 0; + border-right-width: 0; + border-left-color: #848284; +} +.mblTooltipAbove .mblTooltipInnerArrow { + bottom: 0; + left: 0; + border-top-width: 0; + border-bottom-color: #9C9E9C; +} +.mblTooltipBelow .mblTooltipInnerArrow { + top: 0; + left: 0; + border-bottom-width: 0; + border-top-color: #848284; +} +.mblTooltipHidden, .mblTooltipHidden * { + visibility: hidden !important; +} +.mblTooltip .mblHeading { + padding-bottom: 3px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + background-color: transparent; + background-image: none; +} diff --git a/js/dojo/dojox/mobile/themes/android/Tooltip.less b/js/dojo/dojox/mobile/themes/android/Tooltip.less new file mode 100644 index 0000000..60af6d1 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/Tooltip.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Tooltip.less"; diff --git a/js/dojo/dojox/mobile/themes/android/View.css b/js/dojo/dojox/mobile/themes/android/View.css new file mode 100644 index 0000000..fe86a8c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/View.css @@ -0,0 +1,24 @@ +@import url("../common/transitions/slide.css"); + +@import url("../common/transitions/flip.css"); + +@import url("../common/transitions/fade.css"); +/* dojox.mobile.View */ +.mblView { + position: relative; + top: 0px; + left: 0px; + width: 100%; + color: white; +} +.mblView.mblIn { + position: absolute; +} +.mblFixedHeaderBar { + z-index: 1; +} +.mblFixedBottomBar { + position: absolute !important; + width: 100%; + z-index: 1; +} diff --git a/js/dojo/dojox/mobile/themes/android/View.less b/js/dojo/dojox/mobile/themes/android/View.less new file mode 100644 index 0000000..910651f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/View.less @@ -0,0 +1,6 @@ +@import url("../common/transitions/slide.css"); +@import url("../common/transitions/flip.css"); +@import url("../common/transitions/fade.css"); + +@import "variables.less"; +@import "../common/View.less"; diff --git a/js/dojo/dojox/mobile/themes/android/android-app-compat.css b/js/dojo/dojox/mobile/themes/android/android-app-compat.css new file mode 100644 index 0000000..8a55bc6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/android-app-compat.css @@ -0,0 +1,24 @@ +/* mbl.widget.Heading */ +@import url("android-compat.css"); + +.alertTitle { + background-image: url(compat/heading-bg.png); +} + +.mblImageThumbView .mblThumb { + -moz-transition: all 0.5s ease-in-out; + -o-transition: all 0.5s ease-in-out; +} + +.mblImageThumbView .mblThumb:hover { + -moz-transform: scale(1.2); + -moz-transition: all 0.3s ease-in-out; + -o-transform: scale(1.2); + -o-transition: all 0.3s ease-in-out; +} +.mblImageThumbView .mblThumbInner .mblThumbMask .mblThumbSrc { + -moz-background-size: 100% 100%; + -moz-border-radius: 5px; + -o-background-size: 100% 100%; + -o-border-radius: 5px; +}
\ No newline at end of file diff --git a/js/dojo/dojox/mobile/themes/android/android-app.css b/js/dojo/dojox/mobile/themes/android/android-app.css new file mode 100644 index 0000000..cb58fa3 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/android-app.css @@ -0,0 +1,349 @@ +@import url("android.css"); + +.alertDialog { + width: 100%; + padding-left: 2px; + padding-right: 2px; + z-index: 1000; +} + +.alertDialogBody { + border: 1px solid #ADAAAD; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + background-color: white; + margin-left: 2px; + margin-right: 4px; +} + +.alertTitle { + height: 42px; + margin: 0px; + padding: 0px; + background-color: #889BB3; + background: -webkit-gradient(linear, left top, left bottom, from(#B0BCCD), to(#6D84A2), color-stop(0.5, #889BB3), color-stop(0.5, #8195AF)); + border-top: 1px solid #CDD5DF; + border-bottom: 1px solid #2D3642; + font-family: Helvetica; + font-size: 20px; + color: white; + text-align: center; + line-height: 44px; + text-shadow: rgba(0,0,0,0.6) 0px -1px 0px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + text-align: center; +} + +.alertText { + text-align: center; +} + +.alertBtns { + padding: 5px; + text-align: center; +} + +.alertBtns .mblButton { + width: 100%; + margin-top: 5px; +} + +.alertDialog.mblOut { + position: absolute; +} + +.alertDialog.mblIn { + position: absolute; +} + +.mblSlidev.mblOut { + -webkit-animation-duration: .4s; + -webkit-animation-name: mblSlideOut; + -webkit-animation-timing-function: linear; + -webkit-transform: translateY(-100%); +} +.mblSlidev.mblIn { + -webkit-animation-duration: .4s; + -webkit-animation-name: mblSlideIn; + -webkit-animation-timing-function: linear; + -webkit-transform: translateY(0px); +} +.mblSlidev.mblOut.mblReverse { + -webkit-animation-name: mblSlideOutReverse; +} +.mblSlidev.mblIn.mblReverse { + -webkit-animation-name: mblSlideInReverse; +} + +.dialogUnderlayWrapper { + position: absolute; + left: 0; + top: 0; + z-index: 998; + background: transparent !important; + visibility: visible; + height: 100%; + width: 100%; +} + +.dialogUnderlay { + background-color: #eee; + opacity: 0.5; + width: 100%; + height: 100%; +} + +.list .row { + padding: 10px; + border-bottom: 1px solid #444; + position: relative; + background-color: black; + z-index: 6; /* Must be greater than the .buttons z-index */ +} +.list .row.mblListItem { + padding: 0px; +} + +.list .row.last { + border-bottom: none; +} + +.list .row.hold { + background-color: #444; +} + +.list .buttons { + position: absolute; + text-align: center; + padding-top: 10px; + width: 100%; + height: 100%; + z-index: 5; +} + +.list .buttons .mblButton { +} + +.list .buttons .deleteBtn { + background-color: red; + +} +.list .buttons .cancelBtn { + margin-left: 10px; + background-color: blue; +} + +.row.collapsed { + -webkit-animation-name: collapse-vert; + -webkit-animation-duration: 0.5s; + -webkit-animation-timing-function: linear; +} + +@-webkit-keyframes collapse-vert { + from { + height: 100%; + padding: 10px; + } + to { + height: 0px; + padding: 0px; + } +} + +.listSelector { + position: absolute; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border: 1px solid #666; + background-color: #ccc; + color: #333; + z-index: 1000; +} +.listSelectorRow { + padding: 10px; + border-bottom: 1px solid #666; + white-space: nowrap; +} +.listSelectorRow-selected { + background-color: #666; + color: #ccc; +} + +.listSelectorRow.last { + border-bottom: none; +} + +.mblImageView, .mblImageView canvas { + width: 100%; + height: 100%; +} + +.mblPillar { + display: none; +} + +/* Form Input Styles */ + +input { + -webkit-text-size-adjust: 140%; +} + + +/* ImageThumbView styles */ +.mblImageThumbView { + position: relative; + -webkit-transition-property: height; + -webkit-transition-duration: 0.8s; + -webkit-transition-delay: 0; +} + +.mblImageThumbView .mblThumb { + width: 100px; + min-height: 100px; + display: inline-block; + z-index: 2; + position: absolute; +} + +.mblImageThumbView.animated .mblThumb { + -webkit-transition-property: -webkit-transform, opacity; + -webkit-transition-duration: 1.3s, 1s; + -webkit-transition-delay: 0, 0; +} + +.mblImageThumbView .mblThumb.hidden { + z-index: 1; + opacity: 0; +} +.mblImageThumbView .mblThumbInner { + width: 102px; + height: 102px; + position: relative; +} + +.mblImageThumbView .mblThumbOverlay { + width: 102px; + height: 102px; + background: url(images/thumb-overlay.png) center top no-repeat; + position: absolute; + z-index: 20; + overflow: hidden; +} +.mblImageThumbView .mblThumb.selected .mblThumbOverlay { + background-position: center bottom; +} +.mblImageThumbView .mblThumbInner .mblThumbMask { + width: 90px; + height: 90px; + overflow: hidden; + padding-left: 6px; + padding-top: 5px; + z-index: 10; +} +.mblImageThumbView .mblThumbInner .mblThumbMask img { + left: 0px; + top: 0px; + width: 90px; + height: 90px; +} + +.mblImageThumbView .mblThumbInner .mblThumbMask .mblThumbSrc { + left: 6px; + top: 5px; + background-position: center center; + background-repeat: no-repeat; + overflow: hidden; + position: absolute; + -webkit-background-size: 100% 100%; + -webkit-border-radius: 5px; + width: 90px; + height: 90px; + z-index: 5; +} + +.mblImageThumbView .mblThumbMask div { + left: 0px; + top: 0px; + width: 90px; + height: 90px; + background-repeat: no-repeat; +} +.mblImageThumbView .mblThumb:hover, +.mblImageThumbView .mblThumb.selected { + -webkit-transform: scale(1.2); + transform: scale(1.2); +} + +/* Large Images */ +.mblImageThumbView.large .mblThumb { + width: 150px; + min-height: 150px; +} + +.mblImageThumbView.large .mblThumbInner{ + width: 152px; + height: 152px; +} + +.mblImageThumbView.large .mblThumbOverlay { + background: url(images/thumb-overlay-large.png) center top no-repeat; + width: 152px; + height: 152px; +} +.mblImageThumbView.large .mblThumbInner .mblThumbMask, +.mblImageThumbView.large .mblThumbInner .mblThumbMask img, +.mblImageThumbView.large .mblThumbInner .mblThumbMask .mblThumbSrc, +.mblImageThumbView.large .mblThumbMask div { + width: 133px; + height: 133px; +} + +.mblImageThumbView.large .mblThumbInner .mblThumbMask .mblThumbSrc { + left: 9px; + top: 7px; +} +/* Small Images */ +.mblImageThumbView.small .mblThumb { + width: 75px; + min-height: 75px; +} + +.mblImageThumbView.small .mblThumbInner{ + width: 77px; + height: 77px; +} + +.mblImageThumbView.small .mblThumbOverlay { + background: url(images/thumb-overlay-small.png) center top no-repeat; + width: 77px; + height: 77px; +} +.mblImageThumbView.small .mblThumbInner .mblThumbMask, +.mblImageThumbView.small .mblThumbInner .mblThumbMask img, +.mblImageThumbView.small .mblThumbInner .mblThumbMask .mblThumbSrc, +.mblImageThumbView.small .mblThumbMask div { + width: 70px; + height: 70px; +} + +.mblImageThumbView.small .mblThumbInner .mblThumbMask .mblThumbSrc { + left: 4px; + top: 3px; +} + +.mblImageThumbView .mblThumbLabel { + font-size: smaller; + overflow: hidden; + white-space: nowrap; + text-align: center; +} + +/* Back Button */ +.mblNativeBack .mblArrowButtonHead, +.mblNativeBack .mblArrowButtonBody, +.mblNativeBack .mblArrowButtonNeck { + display: none; +} + diff --git a/js/dojo/dojox/mobile/themes/android/android-compat.css b/js/dojo/dojox/mobile/themes/android/android-compat.css new file mode 100644 index 0000000..f5a0140 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/android-compat.css @@ -0,0 +1,18 @@ +@import url("base-compat.css"); + +/* common styles */ +@import url("../common/domButtons-compat.css"); +@import url("../common/SpinWheel-compat.css"); + +/* widget styles */ +@import url("Button-compat.css"); +@import url("CheckBox-compat.css"); +@import url("ComboBox-compat.css"); +@import url("IconContainer-compat.css"); +@import url("Opener-compat.css"); +@import url("RadioButton-compat.css"); +@import url("Slider-compat.css"); +@import url("TabBar-compat.css"); +@import url("TextArea-compat.css"); +@import url("TextBox-compat.css"); +@import url("ToggleButton-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/android/android.css b/js/dojo/dojox/mobile/themes/android/android.css new file mode 100644 index 0000000..a50e0ce --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/android.css @@ -0,0 +1,22 @@ +@import url("base.css"); + +/* common styles */ +@import url("../common/domButtons.css"); +@import url("../common/FixedSplitter.css"); +@import url("../common/SpinWheel.css"); +@import url("../common/transitions.css"); + +/* widget styles */ +@import url("Button.css"); +@import url("Carousel.css"); +@import url("CheckBox.css"); +@import url("ComboBox.css"); +@import url("IconContainer.css"); +@import url("Opener.css"); +@import url("PageIndicator.css"); +@import url("RadioButton.css"); +@import url("Slider.css"); +@import url("TabBar.css"); +@import url("TextArea.css"); +@import url("TextBox.css"); +@import url("ToggleButton.css"); diff --git a/js/dojo/dojox/mobile/themes/android/base-compat.css b/js/dojo/dojox/mobile/themes/android/base-compat.css new file mode 100644 index 0000000..d12cf2b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/base-compat.css @@ -0,0 +1,7 @@ +@import url("Heading-compat.css"); +@import url("RoundRect-compat.css"); +@import url("RoundRectList-compat.css"); +@import url("EdgeToEdgeCategory-compat.css"); +@import url("ListItem-compat.css"); +@import url("Switch-compat.css"); +@import url("ProgressIndicator-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/android/base.css b/js/dojo/dojox/mobile/themes/android/base.css new file mode 100644 index 0000000..2409467 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/base.css @@ -0,0 +1,12 @@ +@import url("common.css"); +@import url("Heading.css"); +@import url("View.css"); +@import url("ToolBarButton.css"); +@import url("RoundRect.css"); +@import url("EdgeToEdgeCategory.css"); +@import url("RoundRectCategory.css"); +@import url("RoundRectList.css"); +@import url("EdgeToEdgeList.css"); +@import url("ListItem.css"); +@import url("Switch.css"); +@import url("ProgressIndicator.css"); diff --git a/js/dojo/dojox/mobile/themes/android/common.css b/js/dojo/dojox/mobile/themes/android/common.css new file mode 100644 index 0000000..7cf6b02 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/common.css @@ -0,0 +1,27 @@ +html.mobile, .mobile body { + width: 100%; + margin: 0px; + padding: 0px; +} +.mobile body { + overflow-x: hidden; + -webkit-text-size-adjust: none; + background-color: black; + font-family: Helvetica; + font-size: 17px; + color: white; +} +/* Button Colors */ +.mblColorBlue { + background-color: #366EDF; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7a9de9), to(#2362dd), color-stop(0.5, #366edf), color-stop(0.5, #215fdc)); +} +/* Default Button Colors */ +.mblColorDefault { + background-color: #ADADAD; + background-image: -webkit-gradient(linear, left top, left bottom, from(#e5e5e5), to(#7f7f7f), color-stop(0.5, #adadad), color-stop(0.5, #909090)); +} +.mblColorDefaultSel { + background-color: #FFC700; + background-image: -webkit-gradient(linear, left top, left bottom, from(#ad7500), to(#ffaa00), color-stop(0.06, #ffb200), color-stop(0.5, #ffc700)); +} diff --git a/js/dojo/dojox/mobile/themes/android/common.less b/js/dojo/dojox/mobile/themes/android/common.less new file mode 100644 index 0000000..4e57a5c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/common.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/common.less"; diff --git a/js/dojo/dojox/mobile/themes/android/compat/arrow-button-bg.png b/js/dojo/dojox/mobile/themes/android/compat/arrow-button-bg.png Binary files differnew file mode 100644 index 0000000..7ac8061 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/arrow-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/arrow-button-head.png b/js/dojo/dojox/mobile/themes/android/compat/arrow-button-head.png Binary files differnew file mode 100644 index 0000000..74ecb76 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/arrow-button-head.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/blue-button-bg.png b/js/dojo/dojox/mobile/themes/android/compat/blue-button-bg.png Binary files differnew file mode 100644 index 0000000..3bd558b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/blue-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/button-bg.png b/js/dojo/dojox/mobile/themes/android/compat/button-bg.png Binary files differnew file mode 100644 index 0000000..0d378fa --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/button-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/button-sel-bg.png b/js/dojo/dojox/mobile/themes/android/compat/button-sel-bg.png Binary files differnew file mode 100644 index 0000000..75ff0f8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/button-sel-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/gray-arrow.png b/js/dojo/dojox/mobile/themes/android/compat/gray-arrow.png Binary files differnew file mode 100644 index 0000000..c93d17f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/gray-arrow.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/heading-bg.png b/js/dojo/dojox/mobile/themes/android/compat/heading-bg.png Binary files differnew file mode 100644 index 0000000..8c3999b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/heading-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/icon-content-heading-bg.png b/js/dojo/dojox/mobile/themes/android/compat/icon-content-heading-bg.png Binary files differnew file mode 100644 index 0000000..3daa1a8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/icon-content-heading-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/red-button-bg.png b/js/dojo/dojox/mobile/themes/android/compat/red-button-bg.png Binary files differnew file mode 100644 index 0000000..799870f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/red-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/slider-h-bar-bg.png b/js/dojo/dojox/mobile/themes/android/compat/slider-h-bar-bg.png Binary files differnew file mode 100644 index 0000000..970c7ff --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/slider-h-bar-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/slider-h-bg.png b/js/dojo/dojox/mobile/themes/android/compat/slider-h-bg.png Binary files differnew file mode 100644 index 0000000..0a08c57 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/slider-h-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/slider-handle-bg.png b/js/dojo/dojox/mobile/themes/android/compat/slider-handle-bg.png Binary files differnew file mode 100644 index 0000000..1988f04 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/slider-handle-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/switch-arc-l.gif b/js/dojo/dojox/mobile/themes/android/compat/switch-arc-l.gif Binary files differnew file mode 100644 index 0000000..3f01809 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/switch-arc-l.gif diff --git a/js/dojo/dojox/mobile/themes/android/compat/switch-arc-r.gif b/js/dojo/dojox/mobile/themes/android/compat/switch-arc-r.gif Binary files differnew file mode 100644 index 0000000..3bb5901 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/switch-arc-r.gif diff --git a/js/dojo/dojox/mobile/themes/android/compat/switch-arc1-k.gif b/js/dojo/dojox/mobile/themes/android/compat/switch-arc1-k.gif Binary files differnew file mode 100644 index 0000000..3dec6bd --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/switch-arc1-k.gif diff --git a/js/dojo/dojox/mobile/themes/android/compat/switch-arc2-k.gif b/js/dojo/dojox/mobile/themes/android/compat/switch-arc2-k.gif Binary files differnew file mode 100644 index 0000000..638e76a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/switch-arc2-k.gif diff --git a/js/dojo/dojox/mobile/themes/android/compat/switch-default-k.gif b/js/dojo/dojox/mobile/themes/android/compat/switch-default-k.gif Binary files differnew file mode 100644 index 0000000..61aca0b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/switch-default-k.gif diff --git a/js/dojo/dojox/mobile/themes/android/compat/switch-default-l.gif b/js/dojo/dojox/mobile/themes/android/compat/switch-default-l.gif Binary files differnew file mode 100644 index 0000000..9903c39 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/switch-default-l.gif diff --git a/js/dojo/dojox/mobile/themes/android/compat/switch-default-r.gif b/js/dojo/dojox/mobile/themes/android/compat/switch-default-r.gif Binary files differnew file mode 100644 index 0000000..5dbc4bc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/switch-default-r.gif diff --git a/js/dojo/dojox/mobile/themes/android/compat/switch-round-l.gif b/js/dojo/dojox/mobile/themes/android/compat/switch-round-l.gif Binary files differnew file mode 100644 index 0000000..0a50568 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/switch-round-l.gif diff --git a/js/dojo/dojox/mobile/themes/android/compat/switch-round-r.gif b/js/dojo/dojox/mobile/themes/android/compat/switch-round-r.gif Binary files differnew file mode 100644 index 0000000..1cd3c95 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/switch-round-r.gif diff --git a/js/dojo/dojox/mobile/themes/android/compat/switch-round1-k.gif b/js/dojo/dojox/mobile/themes/android/compat/switch-round1-k.gif Binary files differnew file mode 100644 index 0000000..2b4a9da --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/switch-round1-k.gif diff --git a/js/dojo/dojox/mobile/themes/android/compat/switch-round2-k.gif b/js/dojo/dojox/mobile/themes/android/compat/switch-round2-k.gif Binary files differnew file mode 100644 index 0000000..08eb031 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/switch-round2-k.gif diff --git a/js/dojo/dojox/mobile/themes/android/compat/tab-button-bg.png b/js/dojo/dojox/mobile/themes/android/compat/tab-button-bg.png Binary files differnew file mode 100644 index 0000000..548ef73 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/tab-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/tab-orange-button-bg.png b/js/dojo/dojox/mobile/themes/android/compat/tab-orange-button-bg.png Binary files differnew file mode 100644 index 0000000..56f555b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/tab-orange-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/tab-sel-button-bg.png b/js/dojo/dojox/mobile/themes/android/compat/tab-sel-button-bg.png Binary files differnew file mode 100644 index 0000000..c454088 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/tab-sel-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/compat/togglebutton-chk-bg.png b/js/dojo/dojox/mobile/themes/android/compat/togglebutton-chk-bg.png Binary files differnew file mode 100644 index 0000000..4bfad06 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/compat/togglebutton-chk-bg.png diff --git a/js/dojo/dojox/mobile/themes/android/images/thumb-overlay-large.png b/js/dojo/dojox/mobile/themes/android/images/thumb-overlay-large.png Binary files differnew file mode 100644 index 0000000..dfac370 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/images/thumb-overlay-large.png diff --git a/js/dojo/dojox/mobile/themes/android/images/thumb-overlay-small.png b/js/dojo/dojox/mobile/themes/android/images/thumb-overlay-small.png Binary files differnew file mode 100644 index 0000000..b6836d9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/images/thumb-overlay-small.png diff --git a/js/dojo/dojox/mobile/themes/android/images/thumb-overlay.png b/js/dojo/dojox/mobile/themes/android/images/thumb-overlay.png Binary files differnew file mode 100644 index 0000000..b16efec --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/images/thumb-overlay.png diff --git a/js/dojo/dojox/mobile/themes/android/variables.less b/js/dojo/dojox/mobile/themes/android/variables.less new file mode 100644 index 0000000..c7ffdfb --- /dev/null +++ b/js/dojo/dojox/mobile/themes/android/variables.less @@ -0,0 +1,737 @@ +// common.less +.mobile-body-styles () { + background-color: black; + font-family: Helvetica; + font-size: 17px; + color: white; +} + +.mblView-styles () { + color: white; +} + +.mblColorBlue-styles () { + background-color: #366EDF; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7A9DE9), to(#2362DD), color-stop(0.5, #366EDF), color-stop(0.5, #215FDC)); +} +.mblColorDefault-styles () { + background-color: #ADADAD; + background-image: -webkit-gradient(linear, left top, left bottom, from(#E5E5E5), to(#7F7F7F), color-stop(0.5, #ADADAD), color-stop(0.5, #909090)); +} +.mblColorDefaultSel-styles () { + background-color: #FFC700; + background-image: -webkit-gradient(linear, left top, left bottom, from(#AD7500), to(#FFAA00), color-stop(0.06, #FFB200), color-stop(0.5, #FFC700)); +} + +// Heading.less +.mblHeading-styles () { + padding: 0px 0px 0px 4px; + height: 25px; + background-color: #8C8A8C; + background-image: -webkit-gradient(linear, left top, left bottom, from(#9C9E9C), to(#848284)); + border-top: 1px solid #CDD5DF; + border-bottom: 1px solid #2D3642; + color: white; + font-family: Helvetica; + font-size: 14px; + font-weight: bold; + text-align: center; + line-height: 26px; + text-shadow: rgba(0,0,0,0.6) 0px -1px 0px; +} +.mblArrowButton-styles () { + height: 25px; + margin-right: 10px; +} +.mblArrowButtonHead-styles () { + top: 4px; + left: 6px; + width: 14px; + height: 14px; + border: 1px solid #555555; + -webkit-transform: scale(.8,1) rotate(45deg); + background-image: -webkit-gradient(linear, left top, left bottom, from(#E5E5E5), to(#7F7F7F), color-stop(0.5, #ADADAD), color-stop(0.5, #909090)); +} +.mblArrowButtonHeadChrome-styles () { + border: 1px outset #555555; +} +.mblArrowButtonBody-styles () { + top: 0px; + left: 14px; + padding: 0px 10px 0px 3px; + height: 22px; + border-width: 1px 1px 1px 0px; + border-style: solid; + border-color: #555555; + font-family: Helvetica; + font-size: 13px; + color: white; + line-height: 23px; + background-color: #ADADAD; + background-image: -webkit-gradient(linear, left top, left bottom, from(#E5E5E5), to(#7F7F7F), color-stop(0.5, #ADADAD), color-stop(0.5, #909090)); +} +.mblArrowButtonSelected-styles () { + background-color: #FFC700; + background-image: -webkit-gradient(linear, left top, left bottom, from(#AD7500), to(#FFAA00), color-stop(0.06, #FFB200), color-stop(0.5, #FFC700)); +} +.mblArrowButtonHeadSelected-styles () { +} +.mblArrowButtonBodySelected-styles () { +} + +// ToolBarButton.less +.mblToolBarButton-styles () { + margin: 0px 6px; + height: 22px; + border: 1px solid #555555; + font-family: Helvetica; + font-size: 13px; + font-weight: bold; + color: white; + line-height: 23px; + text-align: center; +} +.mblToolBarButtonDomButton-styles () { + height: 23px; +} +.mblToolBarButtonIcon-styles () { + top: -2px; + padding: 0px; +} + +// RoundRect.less +.mblRoundRect-styles () { + margin: 7px 9px 16px; + padding: 8px; + border: 1px solid #ADAAAD; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + color: white; + background-color: black; +} +.mblRoundRectShadowBox-styles () { + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5); +} + +// EdgeToEdgeCategory.less +.mblEdgeToEdgeCategory-styles () { + margin: 0px; + padding: 0px 10px; + height: 22px; + border-bottom: 1px solid #393439; + background-color: #212021; + font-family: Helvetica; + font-size: 16px; + font-weight: bold; + color: white; + line-height: 22px; + text-shadow: rgba(0,0,0,0.6) 0px -1px 0px; +} + +// RoundRectCategory.less +.mblRoundRectCategory-styles () { + margin: 18px 0px 0px 20px; + font-family: Helvetica; + font-size: 16px; + color: white; +} + +// RoundRectList.less +.mblRoundRectList-styles () { + margin: 7px 9px 16px; + padding: 0px; + border: 1px solid #ADAAAD; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + background-color: white; +} +.mblRoundRectList-withCategory-styles () { +} +.mblRoundRectList-FirstListItem-styles () { + -webkit-border-top-left-radius: 8px; + -webkit-border-top-right-radius: 8px; + -moz-border-radius-topleft: 8px; + -moz-border-radius-topright: 8px; +} +.mblRoundRectList-withCategory-FirstListItem-styles () { +} +.mblRoundRectList-LastListItem-styles () { + border-bottom-width: 0px; + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; +} + +// EdgeToEdgeList.less +.mblEdgeToEdgeList-styles () { + margin: 0px; + padding: 0px; + background-color: black; +} +.mblEdgeToEdgeList-LastListItem-styles () { + border-bottom-color: #313431; +} + +// ListItem.less +.mblListItem-styles () { + padding: 0px 0px 0px 7px; + height: 64px; + border-bottom: solid 1px #313431; + background-color: black; + font-size: 21px; + color: white; + line-height: 64px; +} +.mblListItem-mblVariableHeight-styles () { + padding: 11px 0px 10px 6px; + line-height: normal; +} +.mblListItem-mblListItemAnchor-styles () { + background-position: 14px 17px; + text-decoration: none; + padding-right: 7px; +} +.mblItemSelected-styles () { + background-color: #FFC700; + background-image: -webkit-gradient(linear, left top, left bottom, from(#AD7500), to(#FFAA00), color-stop(0.06, #FFB200), color-stop(0.5, #FFC700)); +} +.mblItemSelected-mblListItemAnchor-styles () { + color: black; +} +.mblItemSelected-mblDomButton-Div-styles () { + border-color: white; +} +.mblItemSelected-mblListItemSubText-styles () { +} +.mblListItemTextBoxSelected-styles () { + background-color: #048BF4; +} +.mblListItemChecked-styles () { +} +.mblListItemIcon-styles () { + margin-top: 17px; + margin-right: 11px; +} +.mblListItemSpriteIcon-styles () { + margin-top: 7px; + margin-left: 8px; +} +.mblListItemRightIcon-styles () { + margin-top: 17px; + margin-bottom: -17px; +} +.mblListItemRightText-styles () { + color: white; + margin: 20px 4px 0 0; +} +.mblListItemTextBox-styles () { +} +.mblListItemAnchorNoIcon-mblListItemTextBox-styles () { +} +.mblListItemSubText-styles () { + font-size: 14px; + color: gray; +} + +// Switch.less +.mblItemSwitch-styles () { + top: 18px; +} +.mblSwitchBg-styles () { + -webkit-border-radius: 2px; +} +.mblSwitchBgLeft-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#00A200), to(#00D300), color-stop(0.2, #00BA00), color-stop(0.2, #00BA00)); +} +.mblSwitchBgRight-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#BDBEBD), to(#F7F3F7)); +} +.mblSwitchKnob-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#9C9A9C), to(#848284)); + -webkit-border-radius: 2px; +} + +// Button.less +.mblButton-styles () { + padding: 0px 10px; + height: 29px; + border: #9CACC0 1px outset; + -webkit-border-radius: 3px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#FDFDFD), to(#CECECE), color-stop(0.5, #F8F8F8), color-stop(0.5, #EEEEEE)); + color: black; + font-family: Helvetica; + font-size: 13px; + line-height: 29px; +} +.mblButton-mblBlueButton-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7A9DE9), to(#2362DD), color-stop(0.5, #366EDF), color-stop(0.5, #215FDC)); + color: white; +} +.mblButton-mblBlueButtonSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#AD7500), to(#FFAA00), color-stop(0.06, #FFB200), color-stop(0.5, #FFC700)); + color: white; +} +.mblButton-mblRedButton-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#FA9D58), to(#EE4115), color-stop(0.5, #FF4D25), color-stop(0.5, #ED4D15)); + color: white; +} +.mblButton-mblRedButtonSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#AD7500), to(#FFAA00), color-stop(0.06, #FFB200), color-stop(0.5, #FFC700)); + color: white; +} +.mblButtonSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#AD7500), to(#FFAA00), color-stop(0.06, #FFB200), color-stop(0.5, #FFC700)); + color: white; +} +.mblButtonDisabled-styles () { + border-color: grey; + background-image: none; + color: grey; +} + +// CheckBox.less +.mblCheckBox-styles () { + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + border: #9CACC0 1px outset; + -webkit-border-radius: 3px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#FDFDFD), to(#CECECE), color-stop(0.5, #F8F8F8), color-stop(0.5, #EEEEEE)); + font: inherit; + -webkit-transform: translateY(0.45em); +} +.mblCheckBoxSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#AD7500), to(#FFAA00), color-stop(0.06, #FFB200), color-stop(0.5, #FFC700)); + border-color: #9CACC0; +} +.mblCheckBoxChecked-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#00A200), to(#00D300), color-stop(0.2, #00BA00), color-stop(0.2, #00BA00)); +} +.mblCheckBoxChecked-after-styles () { + position: absolute; + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.3em; + border-color: white; + border-width: 0.15em; + border-style: none solid solid none; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblCheckBoxChecked-mblCheckBoxSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#AD7500), to(#FFAA00), color-stop(0.06, #FFB200), color-stop(0.5, #FFC700)); + border-color: #9CACC0; +} +.mblCheckBoxChecked-mblCheckBoxSelected-after-styles () { + border-color: #9CACC0; +} + +// ComboBox.less +.dijitPopup-styles () { + -webkit-box-shadow: 0px 0px 50px black; + -webkit-border-radius: 0px; +} +.mblComboBoxMenu-styles () { + border: 1px solid black; + -webkit-border-radius: 0px; + background-color: white; + color: black; +} +.mblComboBoxMenuItemSelected-styles () { + background-color: black; + background-image: -webkit-gradient(linear, left top, left bottom, from(#048BF4), to(#005CE5)); + color: white; +} +.mblComboBoxMenuItem-styles () { + padding: .1em .2em; + border-width: 1px 0 1px 0; + border-style: solid; + border-color: #ffffff; + color: inherit; + text-align: left; +} +.mblComboBoxMenuPreviousButton-styles () { + font-style: italic; + overflow: hidden; +} + +// IconContainer.less +.mblIconContainer-styles () { + margin: 20px 0px 0px 10px; + padding: 0px 0px 40px 0px; +} + +// IconItem.less +.mblIconItemTerminator-styles () { + height: 20px; +} +.mblIconItemSub-styles () { + margin-left: -10px; + background-color: white; + color: black; +} +.mblIconArea-styles () { + margin-bottom: 10px; + height: 78px; + width: 74px; + font-family: Helvetica; + font-size: 12px; + color: white; + text-align: center; +} +.mblContent-styles () { + padding-bottom: 20px; +} +.mblIconContentHeading-styles () { + margin-top: 0px; + padding-left: 40px; + height: 25px; + border-top: 1px solid #F1F3F4; + border-bottom: 1px solid #717D85; + background-image: -webkit-gradient(linear, left top, left bottom, from(#E0E4E7), to(#B4BEC6), color-stop(0.5, #C4CCD2), color-stop(0.5, #BFC8CE)); + font-family: Helvetica; + font-size: 14px; + color: white; + line-height: 26px; + text-shadow: rgba(0,0,0,0.6) 0px -1px 0px; +} + +// RadioButton.less +.mblRadioButton-styles () { + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + border: #9CACC0 1px outset; + -webkit-border-radius: 0.5em; + background-image: -webkit-gradient(linear, left top, left bottom, from(#FDFDFD), to(#CECECE), color-stop(0.5, #F8F8F8), color-stop(0.5, #EEEEEE)); + font: inherit; + -webkit-transform: translateY(0.45em); +} +.mblRadioButtonChecked-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#00A200), to(#00D300), color-stop(0.2, #00BA00), color-stop(0.2, #00BA00)); +} +.mblRadioButtonChecked-after-styles () { + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.25em; + border-color: white; + border-width: 0.15em; + border-style: none solid solid none; + border-color: white; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblRadioButtonChecked-Selected-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#AD7500), to(#FFAA00), color-stop(0.06, #FFB200), color-stop(0.5, #FFC700)); +} +.mblRadioButtonChecked-Selected-after-styles () { + border-color: white; +} + +// Slider.less +.mblSlider-styles () { + margin: 15px; /* 1/2 handle width for hanging off the ends of the bar */ + border: #B0B0B0 1px inset; + background-image: -webkit-gradient(linear, left top, left bottom, from(#BDBEBD), to(#F7F3F7)); + -webkit-border-radius: 2px; +} +.mblSliderProgressBar-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#00A200), to(#00D300), color-stop(0.2, #00BA00), color-stop(0.2, #00BA00)); + -webkit-border-radius: 2px; +} +.mblSliderHandle-styles () { + margin: -10px 0 0 -10px; + width: 18px; + height: 18px; + border: #9D9D9D 1px outset; + -webkit-border-radius: 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#9C9A9C), to(#848284)); +} + +// TabBar.less +.mblTabBar-styles () { + margin: 0px; + padding: 0px; + height: 48px; + border-top: 1px solid #000000; + background-color: #000000; + background-image: -webkit-gradient(linear, left top, left bottom, from(#2D2D2D), to(#000000)); + color: white; + text-align: center; +} +.mblTabBar-TabBarButton-styles () { +} +.mblTabBar-TabBarButton-Selected-styles () { + -webkit-border-radius: 3px; + background-color: #404040; + background-image: -webkit-gradient(linear, left top, left bottom, from(#484848), to(#242424)); +} +.mblTabBarButtonDiv-styles () { + width: 29px; + height: 32px; + margin-top: 2px; +} +.mblTabBarButtonIcon-styles () { + left: 0px; + top: 0px; +} +.mblTabBarButtonTextBox-styles () { + font-family: "Helvetica Neue", Helvetica; + font-size: 11px; +} +.mblTabBarNoIcons-TabBarButtonTextBox-styles () { + line-height: 34px; + font-size: 20px; +} +.mblTabButton-styles () { + margin-right: 2px; + width: 78px; + height: 61px; + border-width: 0px 1px 0px 1px; + border-style: solid; + border-color: black #182018 black #393C39; + background-color: #212421; + background-image: -webkit-gradient(linear, left top, left bottom, from(#181818), to(#100C10), color-stop(0.1, #313031)); + font-family: Helvetica; + font-size: 13px; + color: white; + text-align: center; +} +.mblTabButton-TabBarButtonAnchor-styles () { +} +.mblTabBarTop-TabButton-TabBarButtonDiv-styles () { + height: 38px; +} +.mblTabBarHead-TabButton-TabBarButtonDiv-styles () { + margin-top: -2px; +} +.mblTabButton-FirstTabButtom-styles () { +} +.mblTabButton-LastTabButton-styles () { +} +.mblTabButton-img-styles () { + position: absolute; + left: 0px; + margin-top: 8px; +} +.mblTabBarButtonTextBoxSelected-styles () { + color: white; +} +.mblTabButtonSelected-styles () { + background-color: #8C8E8C; + background-image: -webkit-gradient(linear, left top, left bottom, from(#A59EA5), to(#848284)); +} +.mblTabButtonHighlighted-styles () { + background-color: #FFB600; + background-image: -webkit-gradient(linear, left top, left bottom, from(#FFCB00), to(#FF9A00)); +} +.mblTabButtonImgDiv-styles () { + position: relative; + margin-left: 24px; + height: 40px; +} +.mblTabPanelHeader-styles () { + margin: 0px; + padding: 0px 0px 0px 0px; + height: 64px; + border-top: 1px solid #CDD5DF; + border-bottom: 2px solid #949694; + background-color: #000000; + font-family: Helvetica; + font-size: 20px; + color: white; + text-align: center; +} +.mblTabPanelHeader-TabButton-styles () { + margin-top: 3px; +} +.mblTabPanelHeader-TabButtonSelected-styles () { +} +.mblTabPanelHeader-TabButtonDomButton-styles () { + width: 43px; +} +.mblTabPanelHeader-TabButtonDomButtonClass-styles () { + left: 8px; +} +.mblTabPanelHeader-DomButton-styles () { +} +.mblTabPanelHeader-inHeading-styles () { + height: 25px; +} +.mblTabPanelHeader-TabButton-inHeading-styles () { + margin-top: 0; + margin-right: 0; + height: 22px; + line-height: 23px; + border-width: 1px 1px 1px 0px; + border-style: solid; + border-color: #555555; + background-color: #ADADAD; + background-image: -webkit-gradient(linear, left top, left bottom, from(#e5e5e5), to(#7f7f7f), color-stop(0.5, #adadad), color-stop(0.5, #909090)); +} +.mblTabPanelHeader-TabButton-FirstTabButtom-inHeading-styles () { + border-left-width: 1px; +} +.mblTabPanelHeader-TabButton-LastTabButtom-inHeading-styles () { +} +.mblTabPanelHeader-TabButtonSelected-inHeading-styles () { + background-color: #FFC700; + background-image: -webkit-gradient(linear, left top, left bottom, from(#ad7500), to(#ffaa00), color-stop(0.06, #ffb200), color-stop(0.5, #ffc700)); +} + +// TextArea.less +.mblTextArea-styles () { + padding: 4px 1px; + border-color: #9CACC0; + border-width: 1px; + border-style: inset; + -webkit-border-radius: 3px; + font-family: Helvetica; + font-size: 13px; +} +.mblExpandingTextArea-styles () { + margin: 2px; +} + +// TextBox.less +.mblTextBox-styles () { + height: 22px; + border: #9CACC0 1px inset; + -webkit-border-radius: 3px; + font-family: Helvetica; + font-size: 13px; +} + +// ToggleButton.less +.mblToggleButton-styles () { + padding: 0px 10px 0px 25px; + height: 29px; + border-width: 1px 1px 1px 1px; + border-style: outset; + border-color: #9CACC0; + -webkit-border-radius: 3px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#FDFDFD), to(#CECECE), color-stop(0.5, #F8F8F8), color-stop(0.5, #EEEEEE)); + font-family: Helvetica; + font-size: 13px; + color: black; + line-height: 29px; +} +.mblToggleButtonSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#AD7500), to(#FFAA00), color-stop(0.06, #FFB200), color-stop(0.5, #FFC700)); + color: white; +} +.mblToggleButtonChecked-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#00A200), to(#00D300), color-stop(0.2, #00BA00), color-stop(0.2, #00BA00)); + color: white; +} +.mblToggleButtonChecked-after-styles () { + content: ""; + top: 6px; + left: 7px; + width: 5px; + height: 10px; + border-color: white; + border-width: 2px; + border-style: none solid solid none; + -webkit-transform: rotate(45deg) skew(10deg); + -webkit-transform-origin: 50% 50%; +} +.mblToggleButtonCheckedSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#AD7500), to(#FFAA00), color-stop(0.06, #FFB200), color-stop(0.5, #FFC700)); + color: white; +} +.mblToggleButtonCheckedSelected-after-styles () { + border-color: white; +} +.mblToggleButtonDisabled-styles () { + border-color: grey; + background-image: none; + color: grey; +} + +// Overlay.less +.mblOverlay-styles () { + background-color: #333333; + background-image: none; +} + +// Tooltip.less +.mblTooltip-styles () { + padding: 5px; + border: #ADAAAD 1px solid; + background-color: #8C8A8C; + background-image: -webkit-gradient(linear, left top, left bottom, from(#9C9E9C), to(#848284)); + -webkit-border-radius: 3px; + opacity: .97; +} +.mblTooltipBubble-styles () { + background-color: #FFC700; + background-image: none; + color: black; +} +.mblTooltipInnerArrow-Bubble-Above-styles () { + border-bottom-color: #FFC700; +} +.mblTooltipInnerArrow-Bubble-Below-styles () { + border-top-color: #FFC700; +} +.mblTooltipInnerArrow-Bubble-After-styles () { + border-left-color: #FFC700; +} +.mblTooltipInnerArrow-Bubble-Before-styles () { + border-right-color: #FFC700; +} +.mblTooltipArrow-styles () { + border: 11px solid transparent; +} +.mblTooltipArrow-Before-styles () { + border-left-width: 0; + border-right-color: #ADAAAD; +} +.mblTooltipArrow-After-styles () { + border-right-width: 0; + border-left-color: #ADAAAD; +} +.mblTooltipArrow-Above-styles () { + border-top-width: 0; + border-bottom-color: #ADAAAD; +} +.mblTooltipArrow-Below-styles () { + border-bottom-width: 0; + border-top-color: #ADAAAD; +} +.mblTooltipInnerArrow-Before-styles () { + border-left-width: 0; + border-right-color: #848284; +} +.mblTooltipInnerArrow-After-styles () { + border-right-width: 0; + border-left-color: #848284; +} +.mblTooltipInnerArrow-Above-styles () { + border-top-width: 0; + border-bottom-color: #9C9E9C; +} +.mblTooltipInnerArrow-Below-styles () { + border-bottom-width: 0; + border-top-color: #848284; +} +.mblTooltip-Heading-styles () { + padding-bottom: 3px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + background-color: transparent; + background-image: none; +} +.mblTooltip-Heading-ToolbarButton-styles () { +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Button-compat.css b/js/dojo/dojox/mobile/themes/blackberry/Button-compat.css new file mode 100644 index 0000000..359e510 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Button-compat.css @@ -0,0 +1,33 @@ +/* dojox.mobile.Button */ +.mblButton { + background-color: #cecfd6; + background-image: url(compat/button-bg.png); + background-repeat: repeat-x; + -moz-border-radius: 6px; + -o-border-radius: 6px; + -ms-border-radius: 6px; + border-radius: 6px; +} +.mblButtonSelected { + background-color: #0852ae; + background-image: url(compat/button-sel-bg.png); +} +.mblButtonDisabled { + background-image: none; +} +.mblBlueButton { + background-color: #2261dd; + background-image: url(compat/blue-button-bg.png); +} +.mblBlueButtonSelected { + background-color: #0852ae; + background-image: url(compat/button-sel-bg.png); +} +.mblRedButton { + background-color: #ee4115; + background-image: url(compat/red-button-bg.png); +} +.mblRedButtonSelected { + background-color: #0852ae; + background-image: url(compat/button-sel-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Button.css b/js/dojo/dojox/mobile/themes/blackberry/Button.css new file mode 100644 index 0000000..fa8dc66 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Button.css @@ -0,0 +1,45 @@ +/* dojox.mobile.Button */ +.mblButton { + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + padding: 0px 10px; + height: 29px; + border: #9CACC0 1px outset; + -webkit-border-radius: 6px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7fbf7), to(#cecfd6), color-stop(0.5, #ced3ce)); + color: black; + font-family: Helvetica; + font-size: 16px; + line-height: 29px; +} +.mblButton.mblBlueButton { + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7a9de9), to(#2362dd), color-stop(0.5, #366edf), color-stop(0.5, #215fdc)); + color: white; +} +.mblButton.mblBlueButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); + color: white; +} +.mblButton.mblRedButton { + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fa9d58), to(#ee4115), color-stop(0.5, #ff4d25), color-stop(0.5, #ed4d15)); + color: white; +} +.mblButton.mblRedButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); + color: white; +} +.mblButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); + color: white; +} +.mblButtonDisabled, .mblButton:disabled { + cursor: default; + border-color: grey; + color: grey; + background-image: none; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Button.less b/js/dojo/dojox/mobile/themes/blackberry/Button.less new file mode 100644 index 0000000..ab3a96c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Button.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Button.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/Carousel.css b/js/dojo/dojox/mobile/themes/blackberry/Carousel.css new file mode 100644 index 0000000..a415950 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Carousel.css @@ -0,0 +1,60 @@ +/* dojox.mobile.Carousel */ +.mblCarousel { + overflow: hidden; +} +.mblCarouselBox { + position: relative; + float: left; +} +.mblCarouselImg { + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5); + vertical-align: bottom; +} +.mblCarouselImgSelected { + border: 1px dashed #C0C0C0; + -webkit-box-shadow: none; +} +.mblCarouselImgHeaderText { + color: white; + font: 14px arial, helvetica, clean, sans-serif; +} +.mblCarouselImgFooterText { + color: white; + font: 14px arial, helvetica, clean, sans-serif; +} +.mblCarouselHeaderBar { + background-color: #3A3A3B; + color: #B1B1B1; + font: bold 16px arial, helvetica, clean, sans-serif; + padding: 1px; +} +.mblCarouselBtnContainer { + float: right; +} +.mblCarouselBtn { + height: 18px; + width: 46px; + font: bold 14px arial, helvetica, clean, sans-serif; + color: gray; + padding-top: 0px; + margin: 0px 2px; + border-width: 1px; + /* workaround for android problem */ + +} +.mblCarouselTitle { + margin: 2px 0px 2px 4px; +} +.mblCarouselHeaderBar .mblPageIndicator { + float: right; + width: auto; + padding: 0px 20px; +} +.mblCarouselHeaderBar .mblPageIndicatorContainer { + margin-left: 0px; + margin-right: 0px; +} +.mblCarouselPages { + position: relative; + text-align: center; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Carousel.less b/js/dojo/dojox/mobile/themes/blackberry/Carousel.less new file mode 100644 index 0000000..d717397 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Carousel.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Carousel.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/CheckBox-compat.css b/js/dojo/dojox/mobile/themes/blackberry/CheckBox-compat.css new file mode 100644 index 0000000..f926ffa --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/CheckBox-compat.css @@ -0,0 +1,34 @@ +/* dojox.mobile.CheckBox */ +.mblCheckBox { + background-image: url(compat/button-bg.png); + -moz-border-radius: 3px; + -o-border-radius: 3px; + -ms-border-radius: 3px; + border-radius: 3px; + -moz-appearance: none; + -o-appearance: none; + -ms-appearance: none; + appearance: none; + -o-transform: translateY(0.4em); + -ms-transform: translateY(0.4em); + transform: translateY(0.4em); +} +.mblCheckBoxChecked, +.mblCheckBox:checked { + background-image: url(compat/button-bg.png); +} +.mblCheckBoxChecked::after, +.mblCheckBox:checked::after { + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; +} +.mblCheckBoxSelected, +.mblCheckBoxChecked.mblCheckBoxSelected { + background-image: url(compat/button-sel-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/CheckBox.css b/js/dojo/dojox/mobile/themes/blackberry/CheckBox.css new file mode 100644 index 0000000..89f618c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/CheckBox.css @@ -0,0 +1,44 @@ +/* dojox.mobile.CheckBox */ +.mblCheckBox { + position: relative; + cursor: pointer; + outline: none; + -webkit-appearance: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + border: #9CACC0 1px outset; + -webkit-border-radius: 3px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7fbf7), to(#cecfd6), color-stop(0.5, #ced3ce)); + font: inherit; + -webkit-transform: translatey(0.4em); +} +.mblCheckBoxSelected { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); +} +.mblCheckBoxChecked, .mblCheckBox:checked { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7fbf7), to(#cecfd6), color-stop(0.5, #ced3ce)); +} +.mblCheckBoxChecked::after, .mblCheckBox:checked::after { + position: absolute; + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.3em; + border-color: #0851AD; + border-width: 0.15em; + border-style: none solid solid none; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblCheckBoxChecked.mblCheckBoxSelected, .mblCheckBox:checked.mblCheckBoxSelected { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); +} +.mblCheckBoxChecked.mblCheckBoxSelected::after, .mblCheckBox:checked.mblCheckBoxSelected::after { + border-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/CheckBox.less b/js/dojo/dojox/mobile/themes/blackberry/CheckBox.less new file mode 100644 index 0000000..09f93b2 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/CheckBox.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/CheckBox.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/ComboBox-compat.css b/js/dojo/dojox/mobile/themes/blackberry/ComboBox-compat.css new file mode 100644 index 0000000..b0504e4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ComboBox-compat.css @@ -0,0 +1,17 @@ +/* dojox.mobile.ComboBox */ +.dijitPopup { + -moz-box-shadow: none; + -o-box-shadow: none; + -ms-box-shadow: none; + box-shadow: none; + -moz-border-radius: 12px; + -o-border-radius: 12px; + -ms-border-radius: 12px; + border-radius: 12px; +} +.mblComboBoxMenu { + -moz-border-radius: 12px; + -o-border-radius: 12px; + -ms-border-radius: 12px; + border-radius: 12px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/ComboBox.css b/js/dojo/dojox/mobile/themes/blackberry/ComboBox.css new file mode 100644 index 0000000..45dd699 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ComboBox.css @@ -0,0 +1,44 @@ +/* dojox.mobile.ComboBox */ +.dijitPopup { + margin: 0; + padding: 0; + position: absolute; + border: 0; + background-color: transparent; + -webkit-box-shadow: none; + -webkit-border-radius: 12px; +} +.mblReset { + margin: 0; + padding: 0; + border: 0; + line-height: normal; + font: inherit; + color: inherit; +} +.mblComboBoxMenu { + overflow-y: hidden !important; + position: relative; + overflow: hidden; + border: 1px solid black; + -webkit-border-radius: 12px; + background-color: black; +} +.mblComboBoxMenuItem { + white-space: nowrap; + padding: .1em .2em; + border-width: 1px 0 1px 0; + border-style: solid; + border-color: black; + color: white; + text-align: left; +} +.mblComboBoxMenuItemSelected { + color: white; + background-color: black; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); +} +.mblComboBoxMenuPreviousButton, .mblComboBoxMenuNextButton { + font-style: italic; + overflow: hidden; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/ComboBox.less b/js/dojo/dojox/mobile/themes/blackberry/ComboBox.less new file mode 100644 index 0000000..ab9458c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ComboBox.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ComboBox.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/EdgeToEdgeCategory.css b/js/dojo/dojox/mobile/themes/blackberry/EdgeToEdgeCategory.css new file mode 100644 index 0000000..5951a20 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/EdgeToEdgeCategory.css @@ -0,0 +1,18 @@ +/* dojox.mobile.EdgeToEdgeCategory */ +.mblEdgeToEdgeCategory { + position: relative; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin: 0px; + padding: 0px 10px; + height: 29px; + border-top: 1px solid #313439; + border-bottom: 1px solid #ADAAAD; + background-color: white; + font-family: Helvetica; + font-size: 16px; + font-weight: bold; + color: #7B7D84; + line-height: 29px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/EdgeToEdgeCategory.less b/js/dojo/dojox/mobile/themes/blackberry/EdgeToEdgeCategory.less new file mode 100644 index 0000000..3bb63da --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/EdgeToEdgeCategory.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/EdgeToEdgeCategory.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/EdgeToEdgeList.css b/js/dojo/dojox/mobile/themes/blackberry/EdgeToEdgeList.css new file mode 100644 index 0000000..baac042 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/EdgeToEdgeList.css @@ -0,0 +1,12 @@ +/* dojox.mobile.EdgeToEdgeList */ +.mblEdgeToEdgeList { + position: relative; + /* IE needs this */ + + margin: 0px; + padding: 0px; + background-color: white; +} +.mblEdgeToEdgeList .mblListItem:last-child { + border-bottom-width: 0px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/EdgeToEdgeList.less b/js/dojo/dojox/mobile/themes/blackberry/EdgeToEdgeList.less new file mode 100644 index 0000000..227627c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/EdgeToEdgeList.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/EdgeToEdgeList.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/Heading-compat.css b/js/dojo/dojox/mobile/themes/blackberry/Heading-compat.css new file mode 100644 index 0000000..8c7dd88 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Heading-compat.css @@ -0,0 +1,25 @@ +/* mbl.widget.Heading */ +.mblHeading { + background-image: url(compat/heading-bg.png); +} +.mblHeadingSpanTitle { + white-space: normal; +} + +/* Heading Arrow Button */ +.mblArrowButtonHead { + position: absolute; + top: 0px; + left: 2px; + width: 19px; + height: 30px; + border-style: none; + background-image: url(compat/arrow-button-head.gif); +} +.mblArrowButtonBody { + padding: 0px 10px 0px 5px; + line-height: 28px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; + background-image: url(compat/arrow-button-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Heading.css b/js/dojo/dojox/mobile/themes/blackberry/Heading.css new file mode 100644 index 0000000..d5267eb --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Heading.css @@ -0,0 +1,83 @@ +/* dojox.mobile.Heading */ +.mblHeading { + position: relative; + margin: 0px; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + z-index: 1; + padding: 0px; + height: 38px; + background-color: #424142; + background-image: -webkit-gradient(linear, left top, left bottom, from(#4a4d52), to(#292c31)); + border-top: 1px solid #63696B; + border-bottom: 1px solid #292C31; + color: white; + font-family: Helvetica; + font-size: 18px; + font-weight: normal; + text-align: center; + line-height: 40px; +} +.mblHeading * { + z-index: 2; +} +.mblHeadingDivTitle { + position: absolute; + width: 100%; + display: none; + left: 0px; + z-index: 1; +} +.mblHeadingCenterTitle .mblHeadingDivTitle { + display: block; +} +.mblHeadingCenterTitle .mblHeadingSpanTitle { + display: none; +} +/* Heading Arrow Button */ +.mblArrowButton { + position: relative; + float: left; + height: 28px; + margin: 4px 3px 0px 0px; +} +.mblArrowButtonHead { + position: absolute; + top: 4px; + left: 4px; + width: 19px; + height: 19px; + border: 1px solid #39454A; + -webkit-transform: scale(0.8, 1) rotate(45deg); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7fbf7), to(#cecfd6), color-stop(0.5, #ced3ce)); +} +.dj_chrome .mblArrowButtonHead { + height: 20px; + border: 1px inset #39454A; + -webkit-transform: scale(0.7, 1) rotate(45deg); +} +.mblArrowButtonBody { + position: absolute; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + top: 1px; + left: 15px; + padding: 0px 10px 0px 5px; + height: 28px; + border: none; + font-family: Helvetica; + font-size: 14px; + font-weight: bold; + color: black; + line-height: 30px; + -webkit-border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + background-color: #CED3CE; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7fbf7), to(#cecfd6), color-stop(0.5, #ced3ce)); +} +.mblArrowButtonSelected .mblArrowButtonHead, .mblArrowButtonSelected .mblArrowButtonBody { + color: white; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Heading.less b/js/dojo/dojox/mobile/themes/blackberry/Heading.less new file mode 100644 index 0000000..cfc8580 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Heading.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Heading.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/IconContainer-compat.css b/js/dojo/dojox/mobile/themes/blackberry/IconContainer-compat.css new file mode 100644 index 0000000..adf6d49 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/IconContainer-compat.css @@ -0,0 +1,11 @@ +@import url("../common/domButtons/DomButtonColorButtons-compat.css"); + +/* dojox.mobile.IconItem */ +.mblIconArea div { + *font-size: 60px; /* IE 7 quirks */ +} + +/* Icon Content Heading */ +.mblIconContentHeading { + background-image: url(compat/icon-content-heading-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/IconContainer.css b/js/dojo/dojox/mobile/themes/blackberry/IconContainer.css new file mode 100644 index 0000000..73fa041 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/IconContainer.css @@ -0,0 +1,97 @@ +@import url("../common/domButtons/DomButtonColorButtons.css"); + +@import url("../common/IconContainer_keyframes.css"); +/* dojox.mobile.IconContainer */ +.mblIconContainer { + margin: 0px; + padding: 0px; +} +/* dojox.mobile.IconItem */ +.mblIconItem { + list-style-type: none; + float: left; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} +.mblIconItemTerminator { + list-style-type: none; + clear: both; + height: 0px; +} +.mblIconItemSub { + list-style-type: none; + background-color: white; + color: black; +} +.mblIconArea { + margin-bottom: 5px; + height: 78px; + width: 88px; + text-align: center; + font-family: Helvetica; + font-size: 12px; +} +.mblIconArea div { + position: relative; + height: 65px; + line-height: 65px; + text-align: center; +} +.mblIconArea img { + vertical-align: middle; +} +.mblIconItemSpriteIcon { + position: absolute; +} +.mblContent { + clear: both; + padding-bottom: 20px; +} +table.mblClose { + clear: both; + cursor: pointer; +} +.mblVibrate { + position: relative; + -webkit-animation-duration: .5s; + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-iteration-count: 20; + -webkit-animation-name: mblVibrate; + -webkit-transform: rotate(0deg); +} +.mblCloseContent { + -webkit-animation-duration: .3s; + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-name: mblShrink; + -webkit-transform: scale(0.01); +} +.mblCloseContent.mblShrink0 { + -webkit-animation-name: mblShrink0; +} +.mblCloseContent.mblShrink1 { + -webkit-animation-name: mblShrink1; +} +.mblCloseContent.mblShrink2 { + -webkit-animation-name: mblShrink2; +} +.mblCloseContent.mblShrink3 { + -webkit-animation-name: mblShrink3; +} +/* Icon Content Heading */ +.mblIconContentHeading { + position: relative; + clear: both; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin-top: 0px; + padding-left: 40px; + height: 25px; + border-top: 1px solid #F1F3F4; + border-bottom: 1px solid #717D85; + background-image: -webkit-gradient(linear, left top, left bottom, from(#e0e4e7), to(#b4bec6), color-stop(0.5, #c4ccd2), color-stop(0.5, #bfc8ce)); + font-family: Helvetica; + font-size: 16px; + color: white; + line-height: 26px; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/IconContainer.less b/js/dojo/dojox/mobile/themes/blackberry/IconContainer.less new file mode 100644 index 0000000..963eae6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/IconContainer.less @@ -0,0 +1,5 @@ +@import url("../common/domButtons/DomButtonColorButtons.css"); +@import url("../common/IconContainer_keyframes.css"); + +@import "variables.less"; +@import "../common/IconContainer.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/ListItem-compat.css b/js/dojo/dojox/mobile/themes/blackberry/ListItem-compat.css new file mode 100644 index 0000000..a44214e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ListItem-compat.css @@ -0,0 +1,26 @@ +@import url("../common/domButtons/DomButtonGrayArrow-compat.css"); +@import url("../common/domButtons/DomButtonDarkBlueCheck-compat.css"); + +/* mbl.widget.ListItem */ +*html li.mblListItem.mblVariableHeight { /* IE6 hack */ + height: 0; +} + +.mblListItemIcon { + top: 13px; +} +.mblListItem .mblArrow { + border-style: none; + width: 9px; + height: 13px; + background-image: url(compat/gray-arrow.png); +} +.mblItemSelected .mblArrow { + background-image: url(compat/white-arrow.png); +} +*html .mblListItemTextBox { /* IE6 hack */ + height: 100%; +} +*html li.mblListItem.mblVariableHeight .mblListItemTextBox { /* IE6 hack */ + height: auto; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/ListItem.css b/js/dojo/dojox/mobile/themes/blackberry/ListItem.css new file mode 100644 index 0000000..b8f9f9d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ListItem.css @@ -0,0 +1,86 @@ +@import url("../common/domButtons/DomButtonGrayArrow.css"); + +@import url("../common/domButtons/DomButtonDarkBlueCheck.css"); +/* dojox.mobile.ListItem */ +.mblListItem { + position: relative; + list-style-type: none; + vertical-align: bottom; + /* To avoid IE6 LI bug */ + + padding: 6px; + height: 43px; + border-bottom: solid 1px #DEDFDE; + font-size: 18px; + color: black; + line-height: 43px; +} +.mblListItem.mblVariableHeight { + height: auto; + padding: 11px 0px 10px 6px; + line-height: normal; +} +.mblListItem .mblListItemAnchor { + display: block; + height: 100%; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + background-position: 14px 17px; + text-decoration: none; + padding-right: 7px; +} +.mblListItem .mblListItemAnchor * { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0.2); +} +.mblItemSelected { + background-color: #0869C6; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); +} +.mblItemSelected .mblListItemSubText { + color: white; +} +.mblItemSelected .mblListItemAnchor { + color: white; +} +.mblItemSelected .mblDomButton div { + border-color: white; +} +.mblListItemTextBoxSelected { + background-color: #0869C6; +} +.mblListItemIcon { + float: left; + line-height: normal; + margin-top: 7px; + margin-right: 11px; +} +.mblListItemSpriteIcon { + position: absolute; + margin-top: 7px; + margin-left: 8px; +} +.mblListItemRightIcon, .mblListItemRightIcon2 { + position: relative; + float: right; + line-height: normal; + margin-top: 7px; + margin-bottom: -7px; +} +.mblListItemRightText { + position: relative; + float: right; + line-height: normal; + color: black; + margin: 11px 4px 0 0; +} +.mblListItemTextBox { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.mblVariableHeight .mblListItemTextBox { + white-space: normal; +} +.mblListItemSubText { + font-size: 14px; + color: #7B7D48; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/ListItem.less b/js/dojo/dojox/mobile/themes/blackberry/ListItem.less new file mode 100644 index 0000000..f9f9d21 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ListItem.less @@ -0,0 +1,5 @@ +@import url("../common/domButtons/DomButtonGrayArrow.css"); +@import url("../common/domButtons/DomButtonDarkBlueCheck.css"); + +@import "variables.less"; +@import "../common/ListItem.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/Opener-compat.css b/js/dojo/dojox/mobile/themes/blackberry/Opener-compat.css new file mode 100644 index 0000000..68cb1a8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Opener-compat.css @@ -0,0 +1,3 @@ +/* dojox.mobile.Opener */ +@import url("Overlay-compat.css"); +@import url("Tooltip-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/blackberry/Opener.css b/js/dojo/dojox/mobile/themes/blackberry/Opener.css new file mode 100644 index 0000000..141c72e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Opener.css @@ -0,0 +1,3 @@ +/* dojox.mobile.Opener */ +@import url("Overlay.css"); +@import url("Tooltip.css"); diff --git a/js/dojo/dojox/mobile/themes/blackberry/Overlay-compat.css b/js/dojo/dojox/mobile/themes/blackberry/Overlay-compat.css new file mode 100644 index 0000000..3bc72a3 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Overlay-compat.css @@ -0,0 +1,13 @@ +/* dojox.mobile.Overlay */ +.mblOverlay { + _position: absolute; + text-align: center; +} +.dj_gecko .mblOverlay { + text-align: -moz-center; +} +.dj_ie9 .mblOverlay > *, +.dj_ie8 .mblOverlay > * +{ + margin: 0 auto; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Overlay.css b/js/dojo/dojox/mobile/themes/blackberry/Overlay.css new file mode 100644 index 0000000..0073339 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Overlay.css @@ -0,0 +1,18 @@ +@import url("../common/transitions/coverv.css"); + +@import url("../common/transitions/revealv.css"); +/* dojox.mobile.Overlay */ +.mblOverlay { + position: fixed; + z-index: 2000; + left: 0; + bottom: 0; + margin: 0; + width: 100%; + text-align: -webkit-center; + background-color: #000000; + background-image: none; +} +.mblOverlayHidden *, .mblOverlayHidden { + visibility: hidden !important; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Overlay.less b/js/dojo/dojox/mobile/themes/blackberry/Overlay.less new file mode 100644 index 0000000..e49ea9e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Overlay.less @@ -0,0 +1,5 @@ +@import url("../common/transitions/coverv.css"); +@import url("../common/transitions/revealv.css"); + +@import "variables.less"; +@import "../common/Overlay.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/PageIndicator.css b/js/dojo/dojox/mobile/themes/blackberry/PageIndicator.css new file mode 100644 index 0000000..a175ad6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/PageIndicator.css @@ -0,0 +1,24 @@ +/* dojox.mobile.PageIndicator */ +.mblPageIndicator { + position: relative; + width: 100%; + height: 20px; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} +.mblPageIndicatorContainer { + margin-top: 4px; + margin-left: auto; + margin-right: auto; +} +.mblPageIndicatorDot { + margin: 0px 3px; + width: 6px; + height: 6px; + font-size: 1px; + background-color: #949294; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; +} +.mblPageIndicatorDotSelected { + background-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/PageIndicator.less b/js/dojo/dojox/mobile/themes/blackberry/PageIndicator.less new file mode 100644 index 0000000..9bb6c49 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/PageIndicator.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/PageIndicator.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/ProgressIndicator-compat.css b/js/dojo/dojox/mobile/themes/blackberry/ProgressIndicator-compat.css new file mode 100644 index 0000000..4ee0810 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ProgressIndicator-compat.css @@ -0,0 +1,46 @@ +/* Progress Indicator */ +.mblProg { + position: absolute; + top: 0px; + width: 4px; + font-size: 1px; + height: 36px; + overflow: hidden; + background-color: #C0C0C0; +} +.mblProg0 { + left: 0px; +} +.mblProg1 { + left: 8px; +} +.mblProg2 { + left: 16px; +} +.mblProg3 { + left: 24px; +} +.mblProg4 { + left: 32px; +} +.mblProg5 { + left: 40px; +} +.mblProg6 { + left: 48px; +} +.mblProg7 { + left: 56px; +} +.mblProg8 { + left: 64px; +} +.mblProg9 { + left: 72px; +} +.mblProg10 { + left: 80px; +} +.mblProg11 { + left: 80px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/ProgressIndicator.css b/js/dojo/dojox/mobile/themes/blackberry/ProgressIndicator.css new file mode 100644 index 0000000..2340637 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ProgressIndicator.css @@ -0,0 +1,58 @@ +/* Progress Indicator */ +.mblProgContainer { + position: absolute; + width: 40px; + height: 40px; + top: 180px; + left: 50%; + margin: -18px 0px 0px -18px; +} +.mblProg { + position: absolute; + left: 2px; + top: 0px; + width: 11px; + font-size: 1px; + height: 4px; + overflow: hidden; + -webkit-transform-origin: 0 2px; + background-color: #C0C0C0; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} +.mblProg0 { + -webkit-transform: translate(18px, 10px) rotate(-90.1deg); +} +.mblProg1 { + -webkit-transform: translate(22px, 11px) rotate(-60deg); +} +.mblProg2 { + -webkit-transform: translate(25px, 14px) rotate(-30deg); +} +.mblProg3 { + -webkit-transform: translate(26px, 18px) rotate(0deg); +} +.mblProg4 { + -webkit-transform: translate(25px, 22px) rotate(30deg); +} +.mblProg5 { + -webkit-transform: translate(22px, 25px) rotate(60deg); +} +.mblProg6 { + -webkit-transform: translate(18px, 26px) rotate(90.1deg); +} +.mblProg7 { + -webkit-transform: translate(14px, 25px) rotate(120deg); +} +.mblProg8 { + -webkit-transform: translate(11px, 22px) rotate(150deg); +} +.mblProg9 { + -webkit-transform: translate(10px, 18px) rotate(180deg); +} +.mblProg10 { + -webkit-transform: translate(11px, 14px) rotate(210deg); +} +.mblProg11 { + -webkit-transform: translate(14px, 11px) rotate(240deg); +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/ProgressIndicator.less b/js/dojo/dojox/mobile/themes/blackberry/ProgressIndicator.less new file mode 100644 index 0000000..2ab2a2d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ProgressIndicator.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ProgressIndicator.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/RadioButton-compat.css b/js/dojo/dojox/mobile/themes/blackberry/RadioButton-compat.css new file mode 100644 index 0000000..6f85871 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/RadioButton-compat.css @@ -0,0 +1,33 @@ +/* dojox.mobile.RadioButton */ +.mblRadioButton { + background-image: url(compat/button-bg.png); + -moz-border-radius: 0.5em; + -o-border-radius: 0.5em; + -ms-border-radius: 0.5em; + border-radius: 0.5em; + -moz-appearance: none; + -o-appearance: none; + -ms-appearance: none; + appearance: none; + -o-transform: translateY(0.4em); + -ms-transform: translateY(0.4em); + transform: translateY(0.4em); +} +.mblRadioButtonChecked, +.mblRadioButton:checked { + background-image: url(compat/button-bg.png); +} +.mblRadioButtonChecked::after, +.mblRadioButton:checked::after { + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; +} +.mblRadioButtonChecked.mblRadioButtonSelected { + background-image: url(compat/button-sel-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/RadioButton.css b/js/dojo/dojox/mobile/themes/blackberry/RadioButton.css new file mode 100644 index 0000000..f2a88c2 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/RadioButton.css @@ -0,0 +1,41 @@ +/* dojox.mobile.RadioButton */ +.mblRadioButton { + position: relative; + cursor: pointer; + outline: none; + -webkit-appearance: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + border: #9CACC0 1px outset; + -webkit-border-radius: 0.5em; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7fbf7), to(#cecfd6), color-stop(0.5, #ced3ce)); + font: inherit; + -webkit-transform: translatey(0.4em); +} +.mblRadioButtonChecked, .mblRadioButton:checked { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7fbf7), to(#cecfd6), color-stop(0.5, #ced3ce)); +} +.mblRadioButtonChecked::after, .mblRadioButton:checked::after { + position: absolute; + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.25em; + border-color: white; + border-width: 0.15em; + border-style: none solid solid none; + border-color: #0851AD; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblRadioButtonChecked.mblRadioButtonSelected, .mblRadioButton:checked.mblRadioButtonSelected { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); +} +.mblRadioButtonChecked.mblRadioButtonSelected::after, .mblRadioButton:checked.mblRadioButtonSelected::after { + border-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/RadioButton.less b/js/dojo/dojox/mobile/themes/blackberry/RadioButton.less new file mode 100644 index 0000000..0793ca6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/RadioButton.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RadioButton.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/RoundRect-compat.css b/js/dojo/dojox/mobile/themes/blackberry/RoundRect-compat.css new file mode 100644 index 0000000..0643874 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/RoundRect-compat.css @@ -0,0 +1,64 @@ +/* Round Corner */ +.mblRoundCorner { + background-color: white; + height: 1px; + font-size: 1px; + overflow: hidden; + border-style: solid; + border-color: #C6C7C6; + border-width: 0px 1px; +} +.mblRoundRectContainer { + padding: 3px 8px; + background-color: white; + border-style: solid; + border-color: #C6C7C6; + border-width: 0px 1px; +} +.mblRoundRectList .mblRoundRectContainer { + margin: 0px; + padding: 0px; +} +.mblRoundCorner0T { + height: 0px; +} +.mblRoundCorner1T { + background-color: #ADAAAD; + margin: 0px 5px; +} +.mblRoundCorner2T { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner3T { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4T { + margin: 0px 1px; +} +.mblRoundCorner5T { + margin: 0px 1px; +} + +.mblRoundCorner0B { + height: 0px; +} +.mblRoundCorner1B { + margin: 0px 1px; +} +.mblRoundCorner2B { + margin: 0px 1px; +} +.mblRoundCorner3B { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4B { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner5B { + background-color: #ADAAAD; + margin: 0px 5px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/RoundRect.css b/js/dojo/dojox/mobile/themes/blackberry/RoundRect.css new file mode 100644 index 0000000..a1f9991 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/RoundRect.css @@ -0,0 +1,13 @@ +/* dojox.mobile.RoundRect */ +.mblRoundRect { + margin: 2px 3px 4px; + padding: 8px; + border: 1px solid #C6C7C6; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + color: black; + background-color: white; +} +.mblRoundRect.mblShadow { + -webkit-box-shadow: 1px 2px 1px rgba(0, 0, 0, 0.35); +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/RoundRect.less b/js/dojo/dojox/mobile/themes/blackberry/RoundRect.less new file mode 100644 index 0000000..efec816 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/RoundRect.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RoundRect.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/RoundRectCategory.css b/js/dojo/dojox/mobile/themes/blackberry/RoundRectCategory.css new file mode 100644 index 0000000..bc46c98 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/RoundRectCategory.css @@ -0,0 +1,20 @@ +/* dojox.mobile.RoundRectCategory */ +.mblRoundRectCategory { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + padding: 0px 6px; + margin: 3px 9px 0px; + height: 29px; + font-family: Helvetica; + font-size: 16px; + color: #7B7D84; + line-height: 29px; + background-color: white; + border: 1px solid #ADAAAD; + border-bottom-width: 0px; + -webkit-border-top-left-radius: 6px; + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topleft: 6px; + -moz-border-radius-topright: 6px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/RoundRectCategory.less b/js/dojo/dojox/mobile/themes/blackberry/RoundRectCategory.less new file mode 100644 index 0000000..e9148cc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/RoundRectCategory.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RoundRectCategory.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/RoundRectList-compat.css b/js/dojo/dojox/mobile/themes/blackberry/RoundRectList-compat.css new file mode 100644 index 0000000..0643874 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/RoundRectList-compat.css @@ -0,0 +1,64 @@ +/* Round Corner */ +.mblRoundCorner { + background-color: white; + height: 1px; + font-size: 1px; + overflow: hidden; + border-style: solid; + border-color: #C6C7C6; + border-width: 0px 1px; +} +.mblRoundRectContainer { + padding: 3px 8px; + background-color: white; + border-style: solid; + border-color: #C6C7C6; + border-width: 0px 1px; +} +.mblRoundRectList .mblRoundRectContainer { + margin: 0px; + padding: 0px; +} +.mblRoundCorner0T { + height: 0px; +} +.mblRoundCorner1T { + background-color: #ADAAAD; + margin: 0px 5px; +} +.mblRoundCorner2T { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner3T { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4T { + margin: 0px 1px; +} +.mblRoundCorner5T { + margin: 0px 1px; +} + +.mblRoundCorner0B { + height: 0px; +} +.mblRoundCorner1B { + margin: 0px 1px; +} +.mblRoundCorner2B { + margin: 0px 1px; +} +.mblRoundCorner3B { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4B { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner5B { + background-color: #ADAAAD; + margin: 0px 5px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/RoundRectList.css b/js/dojo/dojox/mobile/themes/blackberry/RoundRectList.css new file mode 100644 index 0000000..2830ad3 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/RoundRectList.css @@ -0,0 +1,39 @@ +/* dojox.mobile.RoundRectList */ +.mblRoundRectList { + position: relative; + /* IE needs this */ + + margin: 3px 9px; + padding: 0px; + border: 1px solid #ADAAAD; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + background-color: white; +} +.mblRoundRectList .mblListItem:first-child { + border-top-width: 0px; + -webkit-border-top-left-radius: 6px; + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topleft: 6px; + -moz-border-radius-topright: 6px; +} +.mblRoundRectList .mblListItem:last-child { + border-bottom-width: 0px; + -webkit-border-bottom-left-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-bottomright: 6px; +} +.mblRoundRectCategory + .mblRoundRectList { + margin-top: 0; + -webkit-border-top-left-radius: 0px; + -webkit-border-top-right-radius: 0px; + -moz-border-radius-topleft: 0px; + -moz-border-radius-topright: 0px; +} +.mblRoundRectCategory + .mblRoundRectList .mblListItem:first-child { + -webkit-border-top-left-radius: 0px; + -webkit-border-top-right-radius: 0px; + -moz-border-radius-topleft: 0px; + -moz-border-radius-topright: 0px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/RoundRectList.less b/js/dojo/dojox/mobile/themes/blackberry/RoundRectList.less new file mode 100644 index 0000000..52e1164 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/RoundRectList.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RoundRectList.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/Slider-compat.css b/js/dojo/dojox/mobile/themes/blackberry/Slider-compat.css new file mode 100644 index 0000000..d3ae9b6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Slider-compat.css @@ -0,0 +1,43 @@ +/* dojox.mobile.Slider */ +.mblSlider { + background-image: url(compat/slider-h-bg.png); + -moz-border-radius: 6px; + -o-border-radius: 6px; + -ms-border-radius: 6px; + border-radius: 6px; + -moz-user-select: none; /* prevent selection */ + -o-user-select: none; + -ms-user-select: none; + user-select: none; + -moz-box-sizing: content-box; /* make width and height consistent with a DIV */ + -o-box-sizing: content-box; + -ms-box-sizing: content-box; + box-sizing: content-box; +} +.mblSlider.mblSliderV { + background: #F7F3F7; +} +.mblSliderProgressBar { + background-image: url(compat/slider-h-bar-bg.png); + background-repeat: repeat-x; + -moz-border-radius: 6px; + -o-border-radius: 6px; + -ms-border-radius: 6px; + border-radius: 6px; +} +.mblSliderV .mblSliderProgressBar { + background: #088EEF; +} +.mblSliderHandle { + background-image: url(compat/slider-handle-bg.png); + -moz-border-radius: 6px; + -o-border-radius: 6px; + -ms-border-radius: 6px; + border-radius: 6px; +} +.mblSliderTransition { + -moz-transition-duration: 400ms; + -o-transition-duration: 400ms; + -ms-transition-duration: 400ms; + transition-duration: 400ms; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Slider.css b/js/dojo/dojox/mobile/themes/blackberry/Slider.css new file mode 100644 index 0000000..5e3c183 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Slider.css @@ -0,0 +1,62 @@ +/* dojox.mobile.Slider */ +.mblSlider { + outline: none; + -webkit-user-select: none; + /* prevent selection */ + + -webkit-box-sizing: content-box; + /* make width and height consistent with a DIV */ + + margin: 15px; + /* 1/2 handle width for hanging off the ends of the bar */ + + border: #B0B0B0 1px inset; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7f3f7), to(#cec5d6), color-stop(0.5, #ced3ce)); + -webkit-border-radius: 6px; +} +.mblSliderH { + width: 200px; + height: 8px; +} +.mblSliderH .mblSliderProgressBar { + height: 100%; +} +.mblSliderH .mblSliderHandle { + top: 50%; +} +.mblSliderV { + height: 200px; + width: 8px; +} +.mblSliderV .mblSliderProgressBar { + width: 100%; +} +.mblSliderV .mblSliderHandle { + left: 50%; +} +.mblSliderProgressBar { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); + -webkit-border-radius: 6px; +} +.mblSliderHandle { + margin: -10px 0 0 -10px; + width: 18px; + height: 18px; + border: #9D9D9D 1px outset; + -webkit-border-radius: 6px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fafafa), to(#999999), color-stop(0.5, #bbbbbb)); +} +.mblSliderTransition { + -webkit-transition-duration: 400ms; +} +.mblSliderTouchBox { + margin: 0; + padding: 12pt; + left: -12pt; + top: -12pt; + border: none; + width: 100%; + height: 100%; + background-color: transparent; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Slider.less b/js/dojo/dojox/mobile/themes/blackberry/Slider.less new file mode 100644 index 0000000..928972f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Slider.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Slider.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/Switch-compat.css b/js/dojo/dojox/mobile/themes/blackberry/Switch-compat.css new file mode 100644 index 0000000..3756d95 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Switch-compat.css @@ -0,0 +1,70 @@ +/* Switch - default */ +.mblSwitchBg { + border: none; +} +.mblSwitchBgLeft { + background: none; + background-image: url(compat/switch-default-l.gif); + background-repeat: no-repeat; +} +.mblSwitchBgRight { + background: none; + background-image: url(compat/switch-default-r.gif); + background-repeat: no-repeat; +} +.mblSwitchKnob { + top: 0px; + height: 27px; + background: none; + background-image: url(compat/switch-default-k.gif); + background-repeat: no-repeat; + border: none; +} +/* Switch - Round Shape1 */ +.mblSwRoundShape1 .mblSwitchBgLeft { + background-image: url(compat/switch-round-l.gif); +} +.mblSwRoundShape1 .mblSwitchBgRight { + background-image: url(compat/switch-round-r.gif); +} +.mblSwRoundShape1 .mblSwitchKnob { + top: 1px; + height: 26px; + background-image: url(compat/switch-round1-k.gif); +} +/* Switch - Round Shape2 */ +.mblSwRoundShape2 .mblSwitchBgLeft { + background-image: url(compat/switch-round-l.gif); +} +.mblSwRoundShape2 .mblSwitchBgRight { + background-image: url(compat/switch-round-r.gif); +} +.mblSwRoundShape2 .mblSwitchKnob { + top: 1px; + height: 26px; + background-image: url(compat/switch-round2-k.gif); +} +/* Switch - Arc Shape1 */ +.mblSwArcShape1 .mblSwitchBgLeft { + background-image: url(compat/switch-arc-l.gif); +} +.mblSwArcShape1 .mblSwitchBgRight { + background-image: url(compat/switch-arc-r.gif); +} +.mblSwArcShape1 .mblSwitchKnob { + top: 1px; + height: 26px; + background-image: url(compat/switch-arc1-k.gif); +} +/* Switch - Arc Shape2 */ +.mblSwArcShape2 .mblSwitchBgLeft { + background-image: url(compat/switch-arc-l.gif); +} +.mblSwArcShape2 .mblSwitchBgRight { + background-image: url(compat/switch-arc-r.gif); +} +.mblSwArcShape2 .mblSwitchKnob { + top: 1px; + height: 26px; + background-image: url(compat/switch-arc2-k.gif); +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Switch.css b/js/dojo/dojox/mobile/themes/blackberry/Switch.css new file mode 100644 index 0000000..b8d62c7 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Switch.css @@ -0,0 +1,18 @@ +@import url("../common/Switch.css"); +/* dojox.mobile.Switch */ +.mblItemSwitch { + top: 14px; +} +.mblSwitchBg { + -webkit-border-radius: 6px; +} +.mblSwitchBgLeft { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); +} +.mblSwitchBgRight { + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7f3f7), to(#cec5d6), color-stop(0.5, #ced3ce)); +} +.mblSwitchKnob { + background-image: -webkit-gradient(linear, left top, left bottom, from(#fafafa), to(#999999), color-stop(0.5, #bbbbbb)); + -webkit-border-radius: 6px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Switch.less b/js/dojo/dojox/mobile/themes/blackberry/Switch.less new file mode 100644 index 0000000..84a1146 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Switch.less @@ -0,0 +1,4 @@ +@import url("../common/Switch.css"); + +@import "variables.less"; +@import "../common/Switch.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/TabBar-compat.css b/js/dojo/dojox/mobile/themes/blackberry/TabBar-compat.css new file mode 100644 index 0000000..c1944a5 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/TabBar-compat.css @@ -0,0 +1,49 @@ +/* dojox.mobile.TabBarButton */ +.dj_ie6 .mblTabBarButtonDiv, .dj_ie7 .mblTabBarButtonDiv { + left: auto; +} +.dj_ie6 .mblTabBar .mblTabBarButton { + display: inline; /* IE bug*/ +} +.mblTabBarButtonIcon { + position: absolute; + top: 2px; + left: 0px; +} +.dj_gecko .mblTabBar .mblTabBarButton.mblTabButtonSelected { + -moz-border-radius: 3px; +} +.dj_gecko .mblTabPanelHeader .mblTabButton { + -moz-border-radius-topleft: 6px; + -moz-border-radius-topright: 6px; +} +*html .mblTabButton { /* IE6 hack */ + behavior: expression( + (function(el){ + if(!el.previousSibling) + el.style.borderWidth = "1px"; + el.style.behavior = "none"; + })(this) + ); +} +.dj_ie6 .mblTabPanelHeader .mblDomButton { + left: 0px; +} +.mblTabButton img { + position: absolute; + left: 0px; + top: 0px; + margin-top: 8px; +} +.dj_gecko .mblHeading .mblTabPanelHeader .mblTabButton { + -moz-border-radius-topleft: 0px; + -moz-border-radius-topright: 0px; +} +.dj_gecko .mblHeading .mblTabPanelHeader .mblTabButton:first-child { + -moz-border-radius-topleft: 6px; + -moz-border-radius-bottomleft: 6px; +} +.dj_gecko .mblHeading .mblTabPanelHeader .mblTabButton:last-child { + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/TabBar.css b/js/dojo/dojox/mobile/themes/blackberry/TabBar.css new file mode 100644 index 0000000..06bc550 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/TabBar.css @@ -0,0 +1,164 @@ +/* dojox.mobile.TabBar */ +.mblTabBar { + position: relative; + overflow: hidden; + white-space: nowrap; + margin: 0px; + padding: 0px; + height: 48px; + border-top: 1px solid #000000; + background-color: #212421; + background-image: -webkit-gradient(linear, left top, left bottom, from(#181818), to(#100c10)); + color: white; + text-align: center; +} +.mblTabBarNoIcons { + height: 34px; +} +.mblTabBarNoText { + height: 34px; +} +/* dojox.mobile.TabBarButton */ +.mblTabBarButton { + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} +.mblTabBar .mblTabBarButton { + position: relative; + list-style-type: none; + float: left; +} +.mblTabBar .mblTabBarButton.mblTabButtonSelected { + background-color: #404040; + background-image: -webkit-gradient(linear, left top, left bottom, from(#484848), to(#242424), color-stop(0.5, #353535)); + -webkit-border-radius: 3px; +} +.mblTabBarButtonAnchor { + display: block; + text-decoration: none; +} +.mblTabBarButtonDiv { + position: relative; + margin-left: auto; + margin-right: auto; + height: 34px; + width: 29px; +} +.mblTabBarButtonIcon { + position: absolute; + left: 0; + top: 0; +} +.mblTabBarButtonSpriteIcon { + position: absolute; +} +.mblTabBarButtonTextBox { + color: #979797; + font-family: "Helvetica Neue", Helvetica; + font-size: 11px; +} +.mblTabBarNoIcons .mblTabBarButtonDiv { + display: none; +} +.mblTabBarNoIcons .mblTabBarButtonTextBox { + line-height: 34px; + font-size: 20px; +} +.mblTabBarTop .mblTabButton .mblTabBarButtonDiv { + height: 40px; +} +.mblTabButton { + position: relative; + float: left; + list-style-type: none; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + width: 78px; + height: 61px; + border-width: 1px 1px 0px 1px; + border-style: solid; + border-color: #7B7D84 #182018 black #393C39; + background-color: #212421; + background-image: -webkit-gradient(linear, left top, left bottom, from(#181818), to(#100c10), color-stop(0.1, #313031)); + font-family: Helvetica; + font-size: 13px; + color: #979797; + text-align: center; +} +.mblTabButton img { + position: absolute; + left: 0px; + margin-top: 8px; +} +.mblTabButtonSelected .mblTabBarButtonTextBox { + color: white; +} +.mblTabButtonImgDiv { + position: relative; + margin-left: 24px; + height: 40px; +} +.mblTabPanelHeader { + position: relative; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin: 0px; + padding: 0px 0px 0px 0px; + height: 64px; + border-top: 1px solid #CDD5DF; + border-bottom: 2px solid #949694; + background-color: #000000; + font-family: Helvetica; + font-size: 20px; + color: white; + text-align: center; +} +.mblTabPanelHeader .mblTabButton { + margin-top: 3px; + -webkit-border-top-left-radius: 6px; + -webkit-border-top-right-radius: 6px; +} +.mblTabPanelHeader .mblTabButton.mblTabButtonSelected { + background-color: #404040; + background-image: -webkit-gradient(linear, left top, left bottom, from(#484848), to(#242424), color-stop(0.5, #353535)); + color: white; +} +.mblTabPanelHeader .mblTabButtonDomButton { + width: 43px; +} +.mblTabPanelHeader .mblTabButtonDomButtonClass { + left: 8px; +} +.mblHeading .mblTabPanelHeader { + height: 38px; +} +.mblHeading .mblTabPanelHeader .mblTabButton { + margin: 5px 0; + height: 28px; + border-width: 0px 1px 0px 0px; + border-style: solid; + border-color: #39454A; + -webkit-border-top-left-radius: 0; + -webkit-border-top-right-radius: 0; + background-color: #CED3CE; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7fbf7), to(#cecfd6), color-stop(0.5, #ced3ce)); + font-size: 14px; + font-weight: bold; + line-height: 30px; + color: black; +} +.mblHeading .mblTabPanelHeader .mblTabButton:first-child { + -webkit-border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; +} +.mblHeading .mblTabPanelHeader .mblTabButton:last-child { + -webkit-border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-right: none; +} +.mblHeading .mblTabPanelHeader .mblTabButtonSelected { + background-color: #0869C6; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); + color: white; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/TabBar.less b/js/dojo/dojox/mobile/themes/blackberry/TabBar.less new file mode 100644 index 0000000..4875c40 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/TabBar.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/TabBar.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/TextArea-compat.css b/js/dojo/dojox/mobile/themes/blackberry/TextArea-compat.css new file mode 100644 index 0000000..c68fb12 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/TextArea-compat.css @@ -0,0 +1,7 @@ +/* dojox.mobile.TextArea */ +.mblTextArea { + -moz-border-radius: 6px; + -o-border-radius: 6px; + -ms-border-radius: 6px; + border-radius: 6px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/TextArea.css b/js/dojo/dojox/mobile/themes/blackberry/TextArea.css new file mode 100644 index 0000000..a39e681 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/TextArea.css @@ -0,0 +1,14 @@ +/* dojox.mobile.TextArea */ +.mblTextArea { + padding: 4px 1px; + border-color: #9CACC0; + border-width: 1px; + border-style: inset; + -webkit-border-radius: 6px; + font-family: Helvetica; + font-size: 13px; +} +/* dojox.mobile.ExpandingTextArea */ +.mblExpandingTextArea { + margin: 2px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/TextArea.less b/js/dojo/dojox/mobile/themes/blackberry/TextArea.less new file mode 100644 index 0000000..c16ffe0 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/TextArea.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/TextArea.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/TextBox-compat.css b/js/dojo/dojox/mobile/themes/blackberry/TextBox-compat.css new file mode 100644 index 0000000..8672e5f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/TextBox-compat.css @@ -0,0 +1,7 @@ +/* dojox.mobile.TextBox */ +.mblTextBox { + -moz-border-radius: 6px; + -o-border-radius: 6px; + -ms-border-radius: 6px; + border-radius: 6px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/TextBox.css b/js/dojo/dojox/mobile/themes/blackberry/TextBox.css new file mode 100644 index 0000000..126bae9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/TextBox.css @@ -0,0 +1,8 @@ +/* dojox.mobile.TextBox */ +.mblTextBox { + height: 22px; + border: #9CACC0 1px inset; + -webkit-border-radius: 6px; + font-family: Helvetica; + font-size: 13px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/TextBox.less b/js/dojo/dojox/mobile/themes/blackberry/TextBox.less new file mode 100644 index 0000000..c83890a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/TextBox.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/TextBox.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/ToggleButton-compat.css b/js/dojo/dojox/mobile/themes/blackberry/ToggleButton-compat.css new file mode 100644 index 0000000..2f5214b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ToggleButton-compat.css @@ -0,0 +1,31 @@ +/* dojox.mobile.ToggleButton */ +.mblToggleButton { + background-image: url(compat/button-bg.png); + -moz-border-radius: 6px; + -o-border-radius: 6px; + -ms-border-radius: 6px; + border-radius: 6px; +} +.mblToggleButtonSelected { + background-image: url(compat/button-sel-bg.png); +} +.mblToggleButtonChecked { + background-image: url(compat/button-bg.png); +} +.mblToggleButton.mblToggleButtonChecked::after { + -moz-transform: translate(-25px,0px) rotate(45deg) skew(10deg); + -o-transform: rotate(45deg) skew(10deg); + -ms-transform: rotate(45deg) skew(10deg); + transform: rotate(45deg) skew(10deg); + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + +} +.dj_ff3 .mblToggleButton.mblToggleButtonChecked::after { + -moz-transform: translate(-25px,-6px) rotate(45deg) skew(10deg); +} +.mblToggleButtonChecked.mblToggleButtonSelected { + background-image: url(compat/button-sel-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/ToggleButton.css b/js/dojo/dojox/mobile/themes/blackberry/ToggleButton.css new file mode 100644 index 0000000..0658f5f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ToggleButton.css @@ -0,0 +1,52 @@ +/* dojox.mobile.ToggleButton */ +.mblToggleButton { + position: relative; + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + padding: 0px 10px 0px 25px; + height: 29px; + border-width: 1px 1px 1px 1px; + border-style: outset; + border-color: #9CACC0; + -webkit-border-radius: 6px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7fbf7), to(#cecfd6), color-stop(0.5, #ced3ce)); + font-family: Helvetica; + font-size: 16px; + color: black; + line-height: 29px; +} +.mblToggleButton.mblToggleButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); + color: white; +} +.mblToggleButton.mblToggleButtonChecked { + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7fbf7), to(#cecfd6), color-stop(0.5, #ced3ce)); + color: black; +} +.mblToggleButton.mblToggleButtonChecked::after { + position: absolute; + content: ""; + top: 6px; + left: 7px; + width: 5px; + height: 10px; + border-color: #0851AD; + border-width: 2px; + border-style: none solid solid none; + -webkit-transform: rotate(45deg) skew(10deg); + -webkit-transform-origin: 50% 50%; +} +.mblToggleButton.mblToggleButtonChecked.mblToggleButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); + color: white; +} +.mblToggleButton.mblToggleButtonChecked.mblToggleButtonSelected::after { + border-color: white; +} +.mblToggleButton:disabled { + cursor: default; + border-color: grey; + background-image: none; + color: grey; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/ToggleButton.less b/js/dojo/dojox/mobile/themes/blackberry/ToggleButton.less new file mode 100644 index 0000000..bdce40f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ToggleButton.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ToggleButton.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/ToolBarButton.css b/js/dojo/dojox/mobile/themes/blackberry/ToolBarButton.css new file mode 100644 index 0000000..29c8284 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ToolBarButton.css @@ -0,0 +1,27 @@ +/* dojox.mobile.ToolBarButton */ +.mblToolBarButton { + float: left; + position: relative; + overflow: hidden; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + margin: 4px 3px; + height: 29px; + font-family: Helvetica; + font-size: 14px; + font-weight: bold; + line-height: 29px; + text-align: center; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; +} +.mblToolBarButtonIcon { + position: relative; + top: 1px; +} +.mblToolBarButtonSpriteIcon { + position: absolute; +} +.mblToolBarButtonText { + padding: 0px 10px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/ToolBarButton.less b/js/dojo/dojox/mobile/themes/blackberry/ToolBarButton.less new file mode 100644 index 0000000..3b67bdc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/ToolBarButton.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ToolBarButton.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/Tooltip-compat.css b/js/dojo/dojox/mobile/themes/blackberry/Tooltip-compat.css new file mode 100644 index 0000000..bb5900d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Tooltip-compat.css @@ -0,0 +1,47 @@ +/* dojox.mobile.Tooltip */ +.mblTooltip { + -moz-border-radius: 8px; + -o-border-radius: 8px; + -ms-border-radius: 8px; + border-radius: 8px; + background-image: none; +} +.mblTooltipBefore .mblTooltipArrow { + *right: 0; /* IE 7 quirks */ +} +.mblTooltipAbove .mblTooltipArrow { + *bottom: 0px; /* IE 7 quirks */ +} +.mblTooltipBefore .mblTooltipInnerArrow { + *right: -1px; /* IE 7 quirks */ +} +.mblTooltipAbove .mblTooltipInnerArrow { + *bottom: -1px; /* IE 7 quirks */ +} +.mblTooltipBefore .mblTooltipInnerArrow { + border-right-color: #424142; +} +.mblTooltipAfter .mblTooltipInnerArrow { + border-left-color: #424142; +} +.mblTooltipAbove .mblTooltipInnerArrow { + border-bottom-color: #424142; +} +.mblTooltipBelow .mblTooltipInnerArrow { + border-top-color: #424142; +} +.mblTooltip .mblHeading { + *padding: 0 9px 12px; + *border-top: 1px solid #424142; + *border-bottom: 1px solid #424142; + *width: auto; + *height: auto; + *overflow: visible; + *line-height: normal; +} +.dj_ie9 .mblTooltip .mblHeading { + width: auto; +} +.mblTooltip .mblHeading .mblToolBarButton { + *margin: auto 6px; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Tooltip.css b/js/dojo/dojox/mobile/themes/blackberry/Tooltip.css new file mode 100644 index 0000000..e94715c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Tooltip.css @@ -0,0 +1,143 @@ +/* dojox.mobile.Tooltip */ +.mblTooltip { + position: absolute; + z-index: 2000; + display: block; + margin: 0; + padding: 5px; + border: #ADAAAD 1px solid; + background-color: #424142; + background-image: -webkit-gradient(linear, left top, left bottom, from(#4a4d52), to(#292c31)); + -webkit-border-radius: 6px; + opacity: .97; +} +.mblTooltipBubble { + overflow: visible; + padding: 3px; + background-color: #000000; + background-image: none; + color: #ffffff; +} +.mblTooltipBubble.mblTooltipAbove .mblTooltipInnerArrow { + border-bottom-color: #000000; +} +.mblTooltipBubble.mblTooltipBelow .mblTooltipInnerArrow { + border-top-color: #000000; +} +.mblTooltipBubble.mblTooltipAfter .mblTooltipInnerArrow { + border-left-color: #000000; +} +.mblTooltipBubble.mblTooltipBefore .mblTooltipInnerArrow { + border-right-color: #000000; +} +.mblTooltip.mblTooltipAfter { + margin-left: -11px; +} +.mblTooltip.mblTooltipBefore { + margin-left: 11px; +} +.mblTooltip.mblTooltipAbove { + margin-top: 11px; +} +.mblTooltip.mblTooltipBelow { + margin-top: -11px; +} +.mblTooltipAnchor { + position: absolute; + width: 1px; + height: 1px; + background-color: transparent; + line-height: 0; + font-size: 0; +} +.mblTooltipBefore .mblTooltipAnchor { + left: -1px; +} +.mblTooltipAfter .mblTooltipAnchor { + right: -1px; +} +.mblTooltipAbove .mblTooltipAnchor { + top: -1px; +} +.mblTooltipBelow .mblTooltipAnchor { + bottom: -1px; +} +.mblTooltipArrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + border: 11px solid transparent; +} +.mblTooltipBefore .mblTooltipArrow { + left: auto; + right: 1px; + top: 0; + bottom: auto; + border-left-width: 0; + border-right-color: #ADAAAD; +} +.mblTooltipAfter .mblTooltipArrow { + left: 1px; + right: auto; + top: 0; + bottom: auto; + border-right-width: 0; + border-left-color: #ADAAAD; +} +.mblTooltipAbove .mblTooltipArrow { + top: auto; + bottom: 1px; + left: auto; + right: auto; + border-top-width: 0; + border-bottom-color: #ADAAAD; +} +.mblTooltipBelow .mblTooltipArrow { + top: 1px; + bottom: auto; + left: auto; + right: auto; + border-bottom-width: 0; + border-top-color: #ADAAAD; +} +.mblTooltipInnerArrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + border: 10px solid transparent; +} +.mblTooltipBefore .mblTooltipInnerArrow { + right: 0; + top: 0; + border-left-width: 0; + border-right-color: #4A4D52; +} +.mblTooltipAfter .mblTooltipInnerArrow { + left: 0; + top: 0; + border-right-width: 0; + border-left-color: #4A4D52; +} +.mblTooltipAbove .mblTooltipInnerArrow { + bottom: 0; + left: 0; + border-top-width: 0; + border-bottom-color: #4A4D52; +} +.mblTooltipBelow .mblTooltipInnerArrow { + top: 0; + left: 0; + border-bottom-width: 0; + border-top-color: #292C31; +} +.mblTooltipHidden, .mblTooltipHidden * { + visibility: hidden !important; +} +.mblTooltip .mblHeading { + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + background-color: transparent; + background-image: none; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/Tooltip.less b/js/dojo/dojox/mobile/themes/blackberry/Tooltip.less new file mode 100644 index 0000000..60af6d1 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/Tooltip.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Tooltip.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/View.css b/js/dojo/dojox/mobile/themes/blackberry/View.css new file mode 100644 index 0000000..363c9bd --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/View.css @@ -0,0 +1,24 @@ +@import url("../common/transitions/slide.css"); + +@import url("../common/transitions/flip.css"); + +@import url("../common/transitions/fade.css"); +/* dojox.mobile.View */ +.mblView { + position: relative; + top: 0px; + left: 0px; + width: 100%; + color: black; +} +.mblView.mblIn { + position: absolute; +} +.mblFixedHeaderBar { + z-index: 1; +} +.mblFixedBottomBar { + position: absolute !important; + width: 100%; + z-index: 1; +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/View.less b/js/dojo/dojox/mobile/themes/blackberry/View.less new file mode 100644 index 0000000..910651f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/View.less @@ -0,0 +1,6 @@ +@import url("../common/transitions/slide.css"); +@import url("../common/transitions/flip.css"); +@import url("../common/transitions/fade.css"); + +@import "variables.less"; +@import "../common/View.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/base-compat.css b/js/dojo/dojox/mobile/themes/blackberry/base-compat.css new file mode 100644 index 0000000..d12cf2b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/base-compat.css @@ -0,0 +1,7 @@ +@import url("Heading-compat.css"); +@import url("RoundRect-compat.css"); +@import url("RoundRectList-compat.css"); +@import url("EdgeToEdgeCategory-compat.css"); +@import url("ListItem-compat.css"); +@import url("Switch-compat.css"); +@import url("ProgressIndicator-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/blackberry/base.css b/js/dojo/dojox/mobile/themes/blackberry/base.css new file mode 100644 index 0000000..2409467 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/base.css @@ -0,0 +1,12 @@ +@import url("common.css"); +@import url("Heading.css"); +@import url("View.css"); +@import url("ToolBarButton.css"); +@import url("RoundRect.css"); +@import url("EdgeToEdgeCategory.css"); +@import url("RoundRectCategory.css"); +@import url("RoundRectList.css"); +@import url("EdgeToEdgeList.css"); +@import url("ListItem.css"); +@import url("Switch.css"); +@import url("ProgressIndicator.css"); diff --git a/js/dojo/dojox/mobile/themes/blackberry/blackberry-compat.css b/js/dojo/dojox/mobile/themes/blackberry/blackberry-compat.css new file mode 100644 index 0000000..f5a0140 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/blackberry-compat.css @@ -0,0 +1,18 @@ +@import url("base-compat.css"); + +/* common styles */ +@import url("../common/domButtons-compat.css"); +@import url("../common/SpinWheel-compat.css"); + +/* widget styles */ +@import url("Button-compat.css"); +@import url("CheckBox-compat.css"); +@import url("ComboBox-compat.css"); +@import url("IconContainer-compat.css"); +@import url("Opener-compat.css"); +@import url("RadioButton-compat.css"); +@import url("Slider-compat.css"); +@import url("TabBar-compat.css"); +@import url("TextArea-compat.css"); +@import url("TextBox-compat.css"); +@import url("ToggleButton-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/blackberry/blackberry.css b/js/dojo/dojox/mobile/themes/blackberry/blackberry.css new file mode 100644 index 0000000..a50e0ce --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/blackberry.css @@ -0,0 +1,22 @@ +@import url("base.css"); + +/* common styles */ +@import url("../common/domButtons.css"); +@import url("../common/FixedSplitter.css"); +@import url("../common/SpinWheel.css"); +@import url("../common/transitions.css"); + +/* widget styles */ +@import url("Button.css"); +@import url("Carousel.css"); +@import url("CheckBox.css"); +@import url("ComboBox.css"); +@import url("IconContainer.css"); +@import url("Opener.css"); +@import url("PageIndicator.css"); +@import url("RadioButton.css"); +@import url("Slider.css"); +@import url("TabBar.css"); +@import url("TextArea.css"); +@import url("TextBox.css"); +@import url("ToggleButton.css"); diff --git a/js/dojo/dojox/mobile/themes/blackberry/common.css b/js/dojo/dojox/mobile/themes/blackberry/common.css new file mode 100644 index 0000000..489bccb --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/common.css @@ -0,0 +1,29 @@ +html.mobile, .mobile body { + width: 100%; + margin: 0px; + padding: 0px; +} +.mobile body { + overflow-x: hidden; + -webkit-text-size-adjust: none; + background-color: #DEDFDE; + font-family: Helvetica; + font-size: 18px; +} +/* Button Colors */ +.mblColorBlue { + color: white; + background-color: #215fdc; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7a9de9), to(#2362dd), color-stop(0.5, #366edf), color-stop(0.5, #215fdc)); +} +/* Default Button Colors */ +.mblColorDefault { + color: black; + background-color: #CED3CE; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7fbf7), to(#cecfd6), color-stop(0.5, #ced3ce)); +} +.mblColorDefaultSel { + color: white; + background-color: #0869C6; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); +} diff --git a/js/dojo/dojox/mobile/themes/blackberry/common.less b/js/dojo/dojox/mobile/themes/blackberry/common.less new file mode 100644 index 0000000..4e57a5c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/common.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/common.less"; diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/arrow-button-bg.png b/js/dojo/dojox/mobile/themes/blackberry/compat/arrow-button-bg.png Binary files differnew file mode 100644 index 0000000..55a6e27 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/arrow-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/arrow-button-head.gif b/js/dojo/dojox/mobile/themes/blackberry/compat/arrow-button-head.gif Binary files differnew file mode 100644 index 0000000..3572fbf --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/arrow-button-head.gif diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/blue-button-bg.png b/js/dojo/dojox/mobile/themes/blackberry/compat/blue-button-bg.png Binary files differnew file mode 100644 index 0000000..3bd558b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/blue-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/button-bg.png b/js/dojo/dojox/mobile/themes/blackberry/compat/button-bg.png Binary files differnew file mode 100644 index 0000000..ba69969 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/button-bg.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/button-sel-bg.png b/js/dojo/dojox/mobile/themes/blackberry/compat/button-sel-bg.png Binary files differnew file mode 100644 index 0000000..4e7384a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/button-sel-bg.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/gray-arrow.png b/js/dojo/dojox/mobile/themes/blackberry/compat/gray-arrow.png Binary files differnew file mode 100644 index 0000000..c93d17f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/gray-arrow.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/heading-bg.png b/js/dojo/dojox/mobile/themes/blackberry/compat/heading-bg.png Binary files differnew file mode 100644 index 0000000..f0546b4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/heading-bg.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/icon-content-heading-bg.png b/js/dojo/dojox/mobile/themes/blackberry/compat/icon-content-heading-bg.png Binary files differnew file mode 100644 index 0000000..3daa1a8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/icon-content-heading-bg.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/red-button-bg.png b/js/dojo/dojox/mobile/themes/blackberry/compat/red-button-bg.png Binary files differnew file mode 100644 index 0000000..799870f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/red-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/slider-h-bar-bg.png b/js/dojo/dojox/mobile/themes/blackberry/compat/slider-h-bar-bg.png Binary files differnew file mode 100644 index 0000000..e130b9c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/slider-h-bar-bg.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/slider-h-bg.png b/js/dojo/dojox/mobile/themes/blackberry/compat/slider-h-bg.png Binary files differnew file mode 100644 index 0000000..955dc11 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/slider-h-bg.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/slider-handle-bg.png b/js/dojo/dojox/mobile/themes/blackberry/compat/slider-handle-bg.png Binary files differnew file mode 100644 index 0000000..d06d0dd --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/slider-handle-bg.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/switch-arc-l.gif b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-arc-l.gif Binary files differnew file mode 100644 index 0000000..9abb5fb --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-arc-l.gif diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/switch-arc-r.gif b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-arc-r.gif Binary files differnew file mode 100644 index 0000000..a787840 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-arc-r.gif diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/switch-arc1-k.gif b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-arc1-k.gif Binary files differnew file mode 100644 index 0000000..6a4e89d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-arc1-k.gif diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/switch-arc2-k.gif b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-arc2-k.gif Binary files differnew file mode 100644 index 0000000..5193586 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-arc2-k.gif diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/switch-default-k.gif b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-default-k.gif Binary files differnew file mode 100644 index 0000000..193cb73 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-default-k.gif diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/switch-default-l.gif b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-default-l.gif Binary files differnew file mode 100644 index 0000000..1fb3013 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-default-l.gif diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/switch-default-r.gif b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-default-r.gif Binary files differnew file mode 100644 index 0000000..6511b8b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-default-r.gif diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/switch-round-l.gif b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-round-l.gif Binary files differnew file mode 100644 index 0000000..ed34d5d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-round-l.gif diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/switch-round-r.gif b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-round-r.gif Binary files differnew file mode 100644 index 0000000..3825e83 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-round-r.gif diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/switch-round1-k.gif b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-round1-k.gif Binary files differnew file mode 100644 index 0000000..8d00c11 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-round1-k.gif diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/switch-round2-k.gif b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-round2-k.gif Binary files differnew file mode 100644 index 0000000..c4c7969 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/switch-round2-k.gif diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/tab-button-bg.png b/js/dojo/dojox/mobile/themes/blackberry/compat/tab-button-bg.png Binary files differnew file mode 100644 index 0000000..548ef73 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/tab-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/tab-orange-button-bg.png b/js/dojo/dojox/mobile/themes/blackberry/compat/tab-orange-button-bg.png Binary files differnew file mode 100644 index 0000000..56f555b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/tab-orange-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/compat/tab-sel-button-bg.png b/js/dojo/dojox/mobile/themes/blackberry/compat/tab-sel-button-bg.png Binary files differnew file mode 100644 index 0000000..c454088 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/compat/tab-sel-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/images/thumb-overlay-large.png b/js/dojo/dojox/mobile/themes/blackberry/images/thumb-overlay-large.png Binary files differnew file mode 100644 index 0000000..dfac370 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/images/thumb-overlay-large.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/images/thumb-overlay-small.png b/js/dojo/dojox/mobile/themes/blackberry/images/thumb-overlay-small.png Binary files differnew file mode 100644 index 0000000..b6836d9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/images/thumb-overlay-small.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/images/thumb-overlay.png b/js/dojo/dojox/mobile/themes/blackberry/images/thumb-overlay.png Binary files differnew file mode 100644 index 0000000..b16efec --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/images/thumb-overlay.png diff --git a/js/dojo/dojox/mobile/themes/blackberry/variables.less b/js/dojo/dojox/mobile/themes/blackberry/variables.less new file mode 100644 index 0000000..90d6e4b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/blackberry/variables.less @@ -0,0 +1,763 @@ +// common.less +.mobile-body-styles () { + background-color: #DEDFDE; + font-family: Helvetica; + font-size: 18px; +} + +.mblView-styles () { + color: black; +} + +.mblColorBlue-styles () { + color: white; + background-color: #215fdc; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7a9de9), to(#2362dd), color-stop(0.5, #366edf), color-stop(0.5, #215fdc)); +} +.mblColorDefault-styles () { + color: black; + background-color: #CED3CE; + background-image: -webkit-gradient(linear, left top, left bottom, from(#F7FBF7), to(#CECFD6), color-stop(0.5, #CED3CE)); +} +.mblColorDefaultSel-styles () { + color: white; + background-color: #0869C6; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); +} + +// Heading.less +.mblHeading-styles () { + padding: 0px; + height: 38px; + background-color: #424142; + background-image: -webkit-gradient(linear, left top, left bottom, from(#4A4D52), to(#292C31)); + border-top: 1px solid #63696B; + border-bottom: 1px solid #292C31; + color: white; + font-family: Helvetica; + font-size: 18px; + font-weight: normal; + text-align: center; + line-height: 40px; +} +.mblArrowButton-styles () { + height: 28px; + margin: 4px 3px 0px 0px; +} +.mblArrowButtonHead-styles () { + top: 4px; + left: 4px; + width: 19px; + height: 19px; + border: 1px solid #39454A; + -webkit-transform: scale(.8,1) rotate(45deg); + background-image: -webkit-gradient(linear, left top, left bottom, from(#F7FBF7), to(#CECFD6), color-stop(0.5, #CED3CE)); +} +.mblArrowButtonHeadChrome-styles () { + height: 20px; + border: 1px inset #39454A; + -webkit-transform: scale(0.7, 1) rotate(45deg); +} +.mblArrowButtonBody-styles () { + top: 1px; + left: 15px; + padding: 0px 10px 0px 5px; + height: 28px; + border: none; + font-family: Helvetica; + font-size: 14px; + font-weight: bold; + color: black; + line-height: 30px; + -webkit-border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + background-color: #CED3CE; + background-image: -webkit-gradient(linear, left top, left bottom, from(#F7FBF7), to(#CECFD6), color-stop(0.5, #CED3CE)); +} +.mblArrowButtonSelected-styles () { + color: white; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); +} +.mblArrowButtonHeadSelected-styles () { +} +.mblArrowButtonBodySelected-styles () { +} + +// ToolBarButton.less +.mblToolBarButton-styles () { + margin: 4px 3px; + height: 29px; + font-family: Helvetica; + font-size: 14px; + font-weight: bold; + line-height: 29px; + text-align: center; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; +} +.mblToolBarButtonDomButton-styles () { +} +.mblToolBarButtonIcon-styles () { + top: 1px; +} + +// RoundRect.less +.mblRoundRect-styles () { + margin: 2px 3px 4px; + padding: 8px; + border: 1px solid #C6C7C6; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + color: black; + background-color: white; +} +.mblRoundRectShadowBox-styles () { + -webkit-box-shadow: 1px 2px 1px rgba(0, 0, 0, 0.35); +} + +// EdgeToEdgeCategory.less +.mblEdgeToEdgeCategory-styles () { + margin: 0px; + padding: 0px 10px; + height: 29px; + border-top: 1px solid #313439; + border-bottom: 1px solid #ADAAAD; + background-color: white; + font-family: Helvetica; + font-size: 16px; + font-weight: bold; + color: #7B7D84; + line-height: 29px; +} + +// RoundRectCategory.less +.mblRoundRectCategory-styles () { + padding: 0px 6px; + margin: 3px 9px 0px; + height: 29px; + font-family: Helvetica; + font-size: 16px; + color: #7B7D84; + line-height: 29px; + background-color: white; + border: 1px solid #ADAAAD; + border-bottom-width: 0px; + -webkit-border-top-left-radius: 6px; + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topleft: 6px; + -moz-border-radius-topright: 6px; +} + +// RoundRectList.less +.mblRoundRectList-styles () { + margin: 3px 9px; + padding: 0px; + border: 1px solid #ADAAAD; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + background-color: white; +} +.mblRoundRectList-withCategory-styles () { + margin-top: 0; + -webkit-border-top-left-radius: 0px; + -webkit-border-top-right-radius: 0px; + -moz-border-radius-topleft: 0px; + -moz-border-radius-topright: 0px; +} +.mblRoundRectList-FirstListItem-styles () { + border-top-width: 0px; + -webkit-border-top-left-radius: 6px; + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topleft: 6px; + -moz-border-radius-topright: 6px; +} +.mblRoundRectList-withCategory-FirstListItem-styles () { + -webkit-border-top-left-radius: 0px; + -webkit-border-top-right-radius: 0px; + -moz-border-radius-topleft: 0px; + -moz-border-radius-topright: 0px; +} +.mblRoundRectList-LastListItem-styles () { + border-bottom-width: 0px; + -webkit-border-bottom-left-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-bottomright: 6px; +} + +// EdgeToEdgeList.less +.mblEdgeToEdgeList-styles () { + margin: 0px; + padding: 0px; + background-color: white; +} +.mblEdgeToEdgeList-LastListItem-styles () { + border-bottom-width: 0px; +} + +// ListItem.less +.mblListItem-styles () { + padding: 6px; + height: 43px; + border-bottom: solid 1px #DEDFDE; + font-size: 18px; + color: black; + line-height: 43px; +} +.mblListItem-mblVariableHeight-styles () { + padding: 11px 0px 10px 6px; + line-height: normal; +} +.mblListItem-mblListItemAnchor-styles () { + background-position: 14px 17px; + text-decoration: none; + padding-right: 7px; +} +.mblItemSelected-styles () { + background-color: #0869C6; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); +} +.mblItemSelected-mblListItemAnchor-styles () { + color: white; +} +.mblItemSelected-mblDomButton-Div-styles () { + border-color: white; +} +.mblItemSelected-mblListItemSubText-styles () { + color: white; +} +.mblListItemTextBoxSelected-styles () { + background-color: #0869C6; +} +.mblListItemChecked-styles () { +} +.mblListItemIcon-styles () { + margin-top: 7px; + margin-right: 11px; +} +.mblListItemSpriteIcon-styles () { + margin-top: 7px; + margin-left: 8px; +} +.mblListItemRightIcon-styles () { + margin-top: 7px; + margin-bottom: -7px; +} +.mblListItemRightText-styles () { + color: black; + margin: 11px 4px 0 0; +} +.mblListItemTextBox-styles () { +} +.mblListItemAnchorNoIcon-mblListItemTextBox-styles () { +} +.mblListItemSubText-styles () { + font-size: 14px; + color: #7B7D48; +} + +// Switch.less +.mblItemSwitch-styles () { + top: 14px; +} +.mblSwitchBg-styles () { + -webkit-border-radius: 6px; +} +.mblSwitchBgLeft-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); +} +.mblSwitchBgRight-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#F7F3F7), to(#CEC5D6), color-stop(0.5, #CED3CE)); +} +.mblSwitchKnob-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#FAFAFA), to(#999999), color-stop(0.5, #BBBBBB)); + -webkit-border-radius: 6px; +} + +// Button.less +.mblButton-styles () { + padding: 0px 10px; + height: 29px; + border: #9CACC0 1px outset; + -webkit-border-radius: 6px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#F7FBF7), to(#CECFD6), color-stop(0.5, #CED3CE)); + color: black; + font-family: Helvetica; + font-size: 16px; + line-height: 29px; +} +.mblButton-mblBlueButton-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7A9DE9), to(#2362DD), color-stop(0.5, #366EDF), color-stop(0.5, #215FDC)); + color: white; +} +.mblButton-mblBlueButtonSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); + color: white; +} +.mblButton-mblRedButton-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#FA9D58), to(#EE4115), color-stop(0.5, #FF4D25), color-stop(0.5, #ED4D15)); + color: white; +} +.mblButton-mblRedButtonSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); + color: white; +} +.mblButtonSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); + color: white; +} +.mblButtonDisabled-styles () { + border-color: grey; + color: grey; + background-image: none; +} + +// CheckBox.less +.mblCheckBox-styles () { + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + border: #9CACC0 1px outset; + -webkit-border-radius: 3px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#F7FBF7), to(#CECFD6), color-stop(0.5, #CED3CE)); + font: inherit; + -webkit-transform: translateY(0.4em); +} +.mblCheckBoxSelected-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); +} +.mblCheckBoxChecked-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#F7FBF7), to(#CECFD6), color-stop(0.5, #CED3CE)); +} +.mblCheckBoxChecked-after-styles () { + position: absolute; + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.3em; + border-color: #0851AD; + border-width: 0.15em; + border-style: none solid solid none; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblCheckBoxChecked-mblCheckBoxSelected-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); +} +.mblCheckBoxChecked-mblCheckBoxSelected-after-styles () { + border-color: white; +} + +// ComboBox.less +.dijitPopup-styles () { + -webkit-box-shadow: none; + -webkit-border-radius: 12px; +} +.mblComboBoxMenu-styles () { + border: 1px solid black; + -webkit-border-radius: 12px; + background-color: black; +} +.mblComboBoxMenuItemSelected-styles () { + color: white; + background-color: black; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); +} +.mblComboBoxMenuItem-styles () { + padding: .1em .2em; + border-width: 1px 0 1px 0; + border-style: solid; + border-color: black; + color: white; + text-align: left; +} +.mblComboBoxMenuPreviousButton-styles () { + font-style: italic; + overflow: hidden; +} + +// IconContainer.less +.mblIconContainer-styles () { + margin: 0px; + padding: 0px; +} + +// IconItem.less +.mblIconItemTerminator-styles () { + height: 0px; +} +.mblIconItemSub-styles () { + background-color: white; + color: black; +} +.mblIconArea-styles () { + margin-bottom: 5px; + height: 78px; + width: 88px; + text-align: center; + font-family: Helvetica; + font-size: 12px; +} +.mblContent-styles () { + padding-bottom: 20px; +} +.mblIconContentHeading-styles () { + margin-top: 0px; + padding-left: 40px; + height: 25px; + border-top: 1px solid #F1F3F4; + border-bottom: 1px solid #717D85; + background-image: -webkit-gradient(linear, left top, left bottom, from(#E0E4E7), to(#B4BEC6), color-stop(0.5, #C4CCD2), color-stop(0.5, #BFC8CE)); + font-family: Helvetica; + font-size: 16px; + color: white; + line-height: 26px; + text-shadow: rgba(0,0,0,0.6) 0px -1px 0px; +} + +// RadioButton.less +.mblRadioButton-styles () { + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + border: #9CACC0 1px outset; + -webkit-border-radius: 0.5em; + background-image: -webkit-gradient(linear, left top, left bottom, from(#F7FBF7), to(#CECFD6), color-stop(0.5, #CED3CE)); + font: inherit; + -webkit-transform: translateY(0.4em); +} +.mblRadioButtonChecked-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#F7FBF7), to(#CECFD6), color-stop(0.5, #CED3CE)); +} +.mblRadioButtonChecked-after-styles () { + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.25em; + border-color: white; + border-width: 0.15em; + border-style: none solid solid none; + border-color: #0851AD; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblRadioButtonChecked-Selected-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); +} +.mblRadioButtonChecked-Selected-after-styles () { + border-color: white; +} + +// Slider.less +.mblSlider-styles () { + margin: 15px; /* 1/2 handle width for hanging off the ends of the bar */ + border: #B0B0B0 1px inset; + background-image: -webkit-gradient(linear, left top, left bottom, from(#F7F3F7), to(#CEC5D6), color-stop(0.5, #CED3CE)); + -webkit-border-radius: 6px; +} +.mblSliderProgressBar-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); + -webkit-border-radius: 6px; +} +.mblSliderHandle-styles () { + margin: -10px 0 0 -10px; + width: 18px; + height: 18px; + border: #9D9D9D 1px outset; + -webkit-border-radius: 6px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#FAFAFA), to(#999999), color-stop(0.5, #BBBBBB)); +} + +// TabBar.less +.mblTabBar-styles () { + margin: 0px; + padding: 0px; + height: 48px; + border-top: 1px solid #000000; + background-color: #212421; + background-image: -webkit-gradient(linear, left top, left bottom, from(#181818), to(#100C10)); + color: white; + text-align: center; +} +.mblTabBar-TabBarButton-styles () { +} +.mblTabBar-TabBarButton-Selected-styles () { + background-color: #404040; + background-image: -webkit-gradient(linear, left top, left bottom, from(#484848), to(#242424), color-stop(0.5, #353535)); + -webkit-border-radius: 3px; +} +.mblTabBarButtonDiv-styles () { + height: 34px; + width: 29px; +} +.mblTabBarButtonIcon-styles () { + left: 0; + top: 0; +} +.mblTabBarButtonTextBox-styles () { + color: #979797; + font-family: "Helvetica Neue", Helvetica; + font-size: 11px; +} +.mblTabBarNoIcons-TabBarButtonTextBox-styles () { + line-height: 34px; + font-size: 20px; +} +.mblTabButton-styles () { + width: 78px; + height: 61px; + border-width: 1px 1px 0px 1px; + border-style: solid; + border-color: #7B7D84 #182018 black #393C39; + background-color: #212421; + background-image: -webkit-gradient(linear, left top, left bottom, from(#181818), to(#100C10), color-stop(0.1, #313031)); + font-family: Helvetica; + font-size: 13px; + color: #979797; + text-align: center; +} +.mblTabButton-TabBarButtonAnchor-styles () { +} +.mblTabBarTop-TabButton-TabBarButtonDiv-styles () { + height: 40px; +} +.mblTabBarHead-TabButton-TabBarButtonDiv-styles () { +} +.mblTabButton-FirstTabButtom-styles () { +} +.mblTabButton-LastTabButton-styles () { +} +.mblTabButton-img-styles () { + position: absolute; + left: 0px; + margin-top: 8px; +} +.mblTabBarButtonTextBoxSelected-styles () { + color: white; +} +.mblTabButtonSelected-styles () { +} +.mblTabButtonHighlighted-styles () { +} +.mblTabButtonImgDiv-styles () { + position: relative; + margin-left: 24px; + height: 40px; +} +.mblTabPanelHeader-styles () { + margin: 0px; + padding: 0px 0px 0px 0px; + height: 64px; + border-top: 1px solid #CDD5DF; + border-bottom: 2px solid #949694; + background-color: #000000; + font-family: Helvetica; + font-size: 20px; + color: white; + text-align: center; +} +.mblTabPanelHeader-TabButton-styles () { + margin-top: 3px; + -webkit-border-top-left-radius: 6px; + -webkit-border-top-right-radius: 6px; +} +.mblTabPanelHeader-TabButtonSelected-styles () { + background-color: #404040; + background-image: -webkit-gradient(linear, left top, left bottom, from(#484848), to(#242424), color-stop(0.5, #353535)); + color: white; +} +.mblTabPanelHeader-TabButtonDomButton-styles () { + width: 43px; +} +.mblTabPanelHeader-TabButtonDomButtonClass-styles () { + left: 8px; +} +.mblTabPanelHeader-DomButton-styles () { +} +.mblTabPanelHeader-inHeading-styles () { + height: 38px; +} +.mblTabPanelHeader-TabButton-inHeading-styles () { + margin: 5px 0; + height: 28px; + border-width: 0px 1px 0px 0px; + border-style: solid; + border-color: #39454A; + -webkit-border-top-left-radius: 0; + -webkit-border-top-right-radius: 0; + background-color: #CED3CE; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7fbf7), to(#cecfd6), color-stop(0.5, #ced3ce)); + font-size: 14px; + font-weight: bold; + line-height: 30px; + color: black; +} +.mblTabPanelHeader-TabButton-FirstTabButtom-inHeading-styles () { + -webkit-border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; +} +.mblTabPanelHeader-TabButton-LastTabButtom-inHeading-styles () { + -webkit-border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-right: none; +} +.mblTabPanelHeader-TabButtonSelected-inHeading-styles () { + background-color: #0869C6; + background-image: -webkit-gradient(linear, left top, left bottom, from(#088eef), to(#0851ad), color-stop(0.5, #0869c6)); + color: white; +} + +// TextArea.less +.mblTextArea-styles () { + padding: 4px 1px; + border-color: #9CACC0; + border-width: 1px; + border-style: inset; + -webkit-border-radius: 6px; + font-family: Helvetica; + font-size: 13px; +} +.mblExpandingTextArea-styles () { + margin: 2px; +} + +// TextBox.less +.mblTextBox-styles () { + height: 22px; + border: #9CACC0 1px inset; + -webkit-border-radius: 6px; + font-family: Helvetica; + font-size: 13px; +} + +// ToggleButton.less +.mblToggleButton-styles () { + padding: 0px 10px 0px 25px; + height: 29px; + border-width: 1px 1px 1px 1px; + border-style: outset; + border-color: #9CACC0; + -webkit-border-radius: 6px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#F7FBF7), to(#CECFD6), color-stop(0.5, #CED3CE)); + font-family: Helvetica; + font-size: 16px; + color: black; + line-height: 29px; +} +.mblToggleButtonSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); + color: white; +} +.mblToggleButtonChecked-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#F7FBF7), to(#CECFD6), color-stop(0.5, #CED3CE)); + color: black; +} +.mblToggleButtonChecked-after-styles () { + content: ""; + top: 6px; + left: 7px; + width: 5px; + height: 10px; + border-color: #0851AD; + border-width: 2px; + border-style: none solid solid none; + -webkit-transform: rotate(45deg) skew(10deg); + -webkit-transform-origin: 50% 50%; +} +.mblToggleButtonCheckedSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#088EEF), to(#0851AD), color-stop(0.5, #0869C6)); + color: white; +} +.mblToggleButtonCheckedSelected-after-styles () { + border-color: white; +} +.mblToggleButtonDisabled-styles () { + border-color: grey; + background-image: none; + color: grey; +} + +// Overlay.less +.mblOverlay-styles () { + background-color: #000000; + background-image: none; +} + +// Tooltip.less +.mblTooltip-styles () { + padding: 5px; + border: #ADAAAD 1px solid; + background-color: #424142; + background-image: -webkit-gradient(linear, left top, left bottom, from(#4A4D52), to(#292C31)); + -webkit-border-radius: 6px; + opacity: .97; +} +.mblTooltipBubble-styles () { + background-color: #000000; + background-image: none; + color: #ffffff; +} +.mblTooltipInnerArrow-Bubble-Above-styles () { + border-bottom-color: #000000; +} +.mblTooltipInnerArrow-Bubble-Below-styles () { + border-top-color: #000000; +} +.mblTooltipInnerArrow-Bubble-After-styles () { + border-left-color: #000000; +} +.mblTooltipInnerArrow-Bubble-Before-styles () { + border-right-color: #000000; +} +.mblTooltipArrow-styles () { + border: 11px solid transparent; +} +.mblTooltipArrow-Before-styles () { + border-left-width: 0; + border-right-color: #ADAAAD; +} +.mblTooltipArrow-After-styles () { + border-right-width: 0; + border-left-color: #ADAAAD; +} +.mblTooltipArrow-Above-styles () { + border-top-width: 0; + border-bottom-color: #ADAAAD; +} +.mblTooltipArrow-Below-styles () { + border-bottom-width: 0; + border-top-color: #ADAAAD; +} +.mblTooltipInnerArrow-Before-styles () { + border-left-width: 0; + border-right-color: #4A4D52; +} +.mblTooltipInnerArrow-After-styles () { + border-right-width: 0; + border-left-color: #4A4D52; +} +.mblTooltipInnerArrow-Above-styles () { + border-top-width: 0; + border-bottom-color: #4A4D52; +} +.mblTooltipInnerArrow-Below-styles () { + border-bottom-width: 0; + border-top-color: #292C31; +} +.mblTooltip-Heading-styles () { + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + background-color: transparent; + background-image: none; +} +.mblTooltip-Heading-ToolbarButton-styles () { +} diff --git a/js/dojo/dojox/mobile/themes/common/Button.less b/js/dojo/dojox/mobile/themes/common/Button.less new file mode 100644 index 0000000..d84460f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/Button.less @@ -0,0 +1,29 @@ +/* dojox.mobile.Button */ +.mblButton { + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: rgba(255,255,255,0); + .mblButton-styles; + &.mblBlueButton { + -webkit-tap-highlight-color: rgba(255,255,255,0); + .mblButton-mblBlueButton-styles; + } + &.mblBlueButtonSelected { + .mblButton-mblBlueButtonSelected-styles; + } + &.mblRedButton { + -webkit-tap-highlight-color: rgba(255,255,255,0); + .mblButton-mblRedButton-styles; + } + &.mblRedButtonSelected { + .mblButton-mblRedButtonSelected-styles; + } +} +.mblButtonSelected { + .mblButtonSelected-styles; +} +.mblButtonDisabled, +.mblButton:disabled { + cursor: default; + .mblButtonDisabled-styles; +} diff --git a/js/dojo/dojox/mobile/themes/common/Carousel.less b/js/dojo/dojox/mobile/themes/common/Carousel.less new file mode 100644 index 0000000..dd16627 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/Carousel.less @@ -0,0 +1,58 @@ +/* dojox.mobile.Carousel */ +.mblCarousel { + overflow: hidden; +} +.mblCarouselBox { + position: relative; + float: left; +} +.mblCarouselImg { + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5); + vertical-align: bottom; +} +.mblCarouselImgSelected { + border: 1px dashed #C0C0C0; + -webkit-box-shadow: none; +} +.mblCarouselImgHeaderText { + color: white; + font: 14px arial,helvetica,clean,sans-serif; +} +.mblCarouselImgFooterText { + color: white; + font: 14px arial,helvetica,clean,sans-serif; +} +.mblCarouselHeaderBar { + background-color: #3A3A3B; + color: #B1B1B1; + font: bold 16px arial,helvetica,clean,sans-serif; + padding: 1px; +} +.mblCarouselBtnContainer { + float: right; +} +.mblCarouselBtn { + height: 18px; + width: 46px; + font: bold 14px arial,helvetica,clean,sans-serif; + color: gray; + padding-top: 0px; + margin: 0px 2px; + border-width: 1px; /* workaround for android problem */ +} +.mblCarouselTitle { + margin: 2px 0px 2px 4px; +} +.mblCarouselHeaderBar .mblPageIndicator { + float: right; + width: auto; + padding: 0px 20px; +} +.mblCarouselHeaderBar .mblPageIndicatorContainer { + margin-left: 0px; + margin-right: 0px; +} +.mblCarouselPages { + position: relative; + text-align: center; +} diff --git a/js/dojo/dojox/mobile/themes/common/CheckBox.less b/js/dojo/dojox/mobile/themes/common/CheckBox.less new file mode 100644 index 0000000..49e56f3 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/CheckBox.less @@ -0,0 +1,25 @@ +/* dojox.mobile.CheckBox */ +.mblCheckBox { + position: relative; + cursor: pointer; + outline: none; + -webkit-appearance: none; + -webkit-tap-highlight-color: rgba(255,255,255,0); + .mblCheckBox-styles; +} +.mblCheckBoxSelected { + .mblCheckBoxSelected-styles; +} +.mblCheckBoxChecked, +.mblCheckBox:checked { + .mblCheckBoxChecked-styles; + &::after { + .mblCheckBoxChecked-after-styles; + } + &.mblCheckBoxSelected { + .mblCheckBoxChecked-mblCheckBoxSelected-styles; + &::after { + .mblCheckBoxChecked-mblCheckBoxSelected-after-styles; + } + } +} diff --git a/js/dojo/dojox/mobile/themes/common/ComboBox.less b/js/dojo/dojox/mobile/themes/common/ComboBox.less new file mode 100644 index 0000000..4358887 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/ComboBox.less @@ -0,0 +1,40 @@ +/* dojox.mobile.ComboBox */ +.dijitPopup { + // Popup items have a wrapper div (dijitPopup) + // with the real popup inside, and maybe an iframe too + margin: 0; + padding: 0; + position: absolute; + border: 0; + background-color: transparent; + .dijitPopup-styles; +} +.mblReset { + margin: 0; + padding: 0; + border: 0; + line-height: normal; + font: inherit; + color: inherit; +} +.mblComboBoxMenu { + overflow-y: hidden !important; + position: relative; + overflow: hidden; + .mblComboBoxMenu-styles; +} +.mblComboBoxMenuItem { + white-space: nowrap; + .mblComboBoxMenuItem-styles; +} +.mblComboBoxMenuItemSelected { + // dijitMenuItemHover refers to actual mouse over + // dijitMenuItemSelected is used after a menu has been "activated" by + // clicking it, tabbing into it, or being opened from a parent menu, + // and denotes that the menu item has focus or that focus is on a child menu + .mblComboBoxMenuItemSelected-styles; +} +.mblComboBoxMenuPreviousButton, +.mblComboBoxMenuNextButton { + .mblComboBoxMenuPreviousButton-styles; +} diff --git a/js/dojo/dojox/mobile/themes/common/EdgeToEdgeCategory.less b/js/dojo/dojox/mobile/themes/common/EdgeToEdgeCategory.less new file mode 100644 index 0000000..13d78e4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/EdgeToEdgeCategory.less @@ -0,0 +1,8 @@ +/* dojox.mobile.EdgeToEdgeCategory */ +.mblEdgeToEdgeCategory { + position: relative; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + .mblEdgeToEdgeCategory-styles; +} diff --git a/js/dojo/dojox/mobile/themes/common/EdgeToEdgeList.less b/js/dojo/dojox/mobile/themes/common/EdgeToEdgeList.less new file mode 100644 index 0000000..9fbed0e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/EdgeToEdgeList.less @@ -0,0 +1,8 @@ +/* dojox.mobile.EdgeToEdgeList */ +.mblEdgeToEdgeList { + position: relative; /* IE needs this */ + .mblEdgeToEdgeList-styles; + .mblListItem:last-child { + .mblEdgeToEdgeList-LastListItem-styles; + } +} diff --git a/js/dojo/dojox/mobile/themes/common/FixedSplitter.css b/js/dojo/dojox/mobile/themes/common/FixedSplitter.css new file mode 100644 index 0000000..6788969 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/FixedSplitter.css @@ -0,0 +1,22 @@ +.mblFixedSpliter { + width: 100%; + height: 100%; +} + +.mblFixedSplitterPane { + position: absolute; + overflow-x: hidden; + overflow-y: auto; +} + +.mblFixedSplitterPaneH { + position: absolute; + height: 100%; + top: 0px; +} + +.mblFixedSplitterPaneV { + position: absolute; + width: 100%; + left: 0px; +} diff --git a/js/dojo/dojox/mobile/themes/common/Heading.less b/js/dojo/dojox/mobile/themes/common/Heading.less new file mode 100644 index 0000000..38083f9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/Heading.less @@ -0,0 +1,58 @@ +/* dojox.mobile.Heading */ +.mblHeading { + position: relative; + margin: 0px; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + z-index: 1; + .mblHeading-styles; +} +.mblHeading * { + z-index: 2; +} +.mblHeadingDivTitle { + position: absolute; + width: 100%; + display: none; + left: 0px; + z-index: 1; +} +.mblHeadingCenterTitle .mblHeadingDivTitle { + display: block; +} +.mblHeadingCenterTitle .mblHeadingSpanTitle { + display: none; +} + +/* Heading Arrow Button */ +.mblArrowButton { + position: relative; + float: left; + .mblArrowButton-styles; +} +.mblArrowButtonHead { + position: absolute; + .mblArrowButtonHead-styles; +} +.dj_chrome .mblArrowButtonHead { + .mblArrowButtonHeadChrome-styles; +} +.mblArrowButtonBody { + position: absolute; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255,255,255,0); + .mblArrowButtonBody-styles; +} +.mblArrowButtonSelected { + .mblArrowButtonHead, .mblArrowButtonBody { + .mblArrowButtonSelected-styles; + } + .mblArrowButtonHead { + .mblArrowButtonHeadSelected-styles; + } + .mblArrowButtonBody { + .mblArrowButtonBodySelected-styles; + } +} diff --git a/js/dojo/dojox/mobile/themes/common/IconContainer.less b/js/dojo/dojox/mobile/themes/common/IconContainer.less new file mode 100644 index 0000000..0f47a0f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/IconContainer.less @@ -0,0 +1,79 @@ +/* dojox.mobile.IconContainer */ +.mblIconContainer { + .mblIconContainer-styles; +} + +/* dojox.mobile.IconItem */ +.mblIconItem { + list-style-type: none; + float: left; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} +.mblIconItemTerminator { + list-style-type: none; + clear: both; + .mblIconItemTerminator-styles; +} +.mblIconItemSub { + list-style-type: none; + .mblIconItemSub-styles; +} +.mblIconArea { + .mblIconArea-styles; + div { + position: relative; + height: 65px; + line-height: 65px; + text-align: center; + } + img { + vertical-align: middle; + } +} +.mblIconItemSpriteIcon { + position: absolute; +} +.mblContent { + clear: both; + .mblContent-styles; +} +table.mblClose { + clear: both; + cursor: pointer; +} +.mblVibrate{ + position: relative; + -webkit-animation-duration: .5s; + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-iteration-count: 20; + -webkit-animation-name: mblVibrate; + -webkit-transform: rotate(0deg); +} +.mblCloseContent{ + -webkit-animation-duration: .3s; + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-name: mblShrink; + -webkit-transform: scale(0.01); + &.mblShrink0{ + -webkit-animation-name: mblShrink0; + } + &.mblShrink1{ + -webkit-animation-name: mblShrink1; + } + &.mblShrink2{ + -webkit-animation-name: mblShrink2; + } + &.mblShrink3{ + -webkit-animation-name: mblShrink3; + } +} + +/* Icon Content Heading */ +.mblIconContentHeading { + position: relative; + clear: both; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + .mblIconContentHeading-styles; +} diff --git a/js/dojo/dojox/mobile/themes/common/IconContainer_keyframes.css b/js/dojo/dojox/mobile/themes/common/IconContainer_keyframes.css new file mode 100644 index 0000000..b96c6a6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/IconContainer_keyframes.css @@ -0,0 +1,48 @@ +/* Icon Container */ +@-webkit-keyframes mblVibrate{ + 0%{ + -webkit-transform: rotate(-2deg); + bottom: -1px; + left: -1px; + } + 25% { + -webkit-transform: rotate(1deg); + bottom: 2px; + left: 1px; + } + 50% { + -webkit-transform: rotate(-1deg); + bottom: -2px; + left: -1px; + } + 75% { + -webkit-transform: rotate(2deg); + bottom: 2px; + left: 1px; + } + 100% { + -webkit-transform: rotate(-2deg); + bottom: -1px; + left: -1px; + } +} +@-webkit-keyframes mblShrink{ + from { -webkit-transform: scale(1); } + to { -webkit-transform: scale(0.01); } +} +@-webkit-keyframes mblShrink0{ + from { -webkit-transform: scale(1); } + to { -webkit-transform: translate(-40%,-70%) scale(0.01); } +} +@-webkit-keyframes mblShrink1{ + from { -webkit-transform: scale(1); } + to { -webkit-transform: translate(-14%,-70%) scale(0.01); } +} +@-webkit-keyframes mblShrink2{ + from { -webkit-transform: scale(1); } + to { -webkit-transform: translate(14%,-70%) scale(0.01); } +} +@-webkit-keyframes mblShrink3{ + from { -webkit-transform: scale(1); } + to { -webkit-transform: translate(40%,-70%) scale(0.01); } +} diff --git a/js/dojo/dojox/mobile/themes/common/ListItem.less b/js/dojo/dojox/mobile/themes/common/ListItem.less new file mode 100644 index 0000000..2b49a2a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/ListItem.less @@ -0,0 +1,78 @@ +/* dojox.mobile.ListItem */ +.mblListItem { + position: relative; + list-style-type: none; + vertical-align: bottom; /* To avoid IE6 LI bug */ + .mblListItem-styles; + &.mblVariableHeight { + height: auto; + .mblListItem-mblVariableHeight-styles; + } + .mblListItemAnchor { + display: block; + height: 100%; + -webkit-tap-highlight-color: rgba(255,255,255,0); + .mblListItem-mblListItemAnchor-styles; + * { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0.2); + } + } +} +.mblItemSelected { + .mblItemSelected-styles; + .mblListItemSubText { + .mblItemSelected-mblListItemSubText-styles; + } + .mblListItemAnchor { + .mblItemSelected-mblListItemAnchor-styles; + } + .mblDomButton { + div { + .mblItemSelected-mblDomButton-Div-styles; + } + } +} +.mblListItemTextBoxSelected { + .mblListItemTextBoxSelected-styles; +} +.mblListItemChecked { + .mblListItemChecked-styles; +} +.mblListItemIcon { + float: left; + line-height: normal; + .mblListItemIcon-styles; +} +.mblListItemSpriteIcon { + position: absolute; + .mblListItemSpriteIcon-styles; + +} +.mblListItemRightIcon, +.mblListItemRightIcon2 { + position: relative; + float: right; + line-height: normal; + .mblListItemRightIcon-styles; +} +.mblListItemRightText { + position: relative; + float: right; + line-height: normal; + .mblListItemRightText-styles; +} +.mblListItemTextBox { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + .mblListItemTextBox-styles; +} +.mblVariableHeight .mblListItemTextBox { + white-space: normal; +} +.mblListItemAnchorNoIcon .mblListItemTextBox { + .mblListItemAnchorNoIcon-mblListItemTextBox-styles; +} +.mblListItemSubText { + .mblListItemSubText-styles; +} diff --git a/js/dojo/dojox/mobile/themes/common/Overlay.less b/js/dojo/dojox/mobile/themes/common/Overlay.less new file mode 100644 index 0000000..076928c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/Overlay.less @@ -0,0 +1,15 @@ +/* dojox.mobile.Overlay */ +.mblOverlay { + position: fixed; + z-index: 2000; + left: 0; + bottom: 0; + margin: 0; + width: 100%; + text-align: -webkit-center; + .mblOverlay-styles; +} +.mblOverlayHidden *, +.mblOverlayHidden { + visibility: hidden !important; +} diff --git a/js/dojo/dojox/mobile/themes/common/PageIndicator.less b/js/dojo/dojox/mobile/themes/common/PageIndicator.less new file mode 100644 index 0000000..6678f9e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/PageIndicator.less @@ -0,0 +1,24 @@ +/* dojox.mobile.PageIndicator */ +.mblPageIndicator { + position: relative; + width: 100%; + height: 20px; + -webkit-tap-highlight-color: rgba(255,255,255,0); +} +.mblPageIndicatorContainer { + margin-top: 4px; + margin-left: auto; + margin-right: auto; +} +.mblPageIndicatorDot { + margin: 0px 3px; + width: 6px; + height: 6px; + font-size: 1px; + background-color: #949294; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; +} +.mblPageIndicatorDotSelected { + background-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/common/ProgressIndicator.less b/js/dojo/dojox/mobile/themes/common/ProgressIndicator.less new file mode 100644 index 0000000..8d8b9ab --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/ProgressIndicator.less @@ -0,0 +1,58 @@ +/* Progress Indicator */ +.mblProgContainer { + position: absolute; + width: 40px; + height: 40px; + top: 180px; + left: 50%; + margin: -18px 0px 0px -18px; +} +.mblProg { + position: absolute; + left: 2px; + top: 0px; + width: 11px; + font-size: 1px; + height: 4px; + overflow: hidden; + -webkit-transform-origin: 0 2px; + background-color: #C0C0C0; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} +.mblProg0 { + -webkit-transform: translate(18px,10px) rotate(-90.1deg); +} +.mblProg1 { + -webkit-transform: translate(22px,11px) rotate(-60deg); +} +.mblProg2 { + -webkit-transform: translate(25px,14px) rotate(-30deg); +} +.mblProg3 { + -webkit-transform: translate(26px,18px) rotate(0deg); +} +.mblProg4 { + -webkit-transform: translate(25px,22px) rotate(30deg); +} +.mblProg5 { + -webkit-transform: translate(22px,25px) rotate(60deg); +} +.mblProg6 { + -webkit-transform: translate(18px,26px) rotate(90.1deg); +} +.mblProg7 { + -webkit-transform: translate(14px,25px) rotate(120deg); +} +.mblProg8 { + -webkit-transform: translate(11px,22px) rotate(150deg); +} +.mblProg9 { + -webkit-transform: translate(10px,18px) rotate(180deg); +} +.mblProg10 { + -webkit-transform: translate(11px,14px) rotate(210deg); +} +.mblProg11 { + -webkit-transform: translate(14px,11px) rotate(240deg); +} diff --git a/js/dojo/dojox/mobile/themes/common/RadioButton.less b/js/dojo/dojox/mobile/themes/common/RadioButton.less new file mode 100644 index 0000000..0874ac8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/RadioButton.less @@ -0,0 +1,23 @@ +/* dojox.mobile.RadioButton */ +.mblRadioButton { + position: relative; + cursor: pointer; + outline: none; + -webkit-appearance: none; + -webkit-tap-highlight-color: rgba(255,255,255,0); + .mblRadioButton-styles; +} +.mblRadioButtonChecked, +.mblRadioButton:checked { + .mblRadioButtonChecked-styles; + &::after { + position: absolute; + .mblRadioButtonChecked-after-styles; + } + &.mblRadioButtonSelected { + .mblRadioButtonChecked-Selected-styles; + &::after { + .mblRadioButtonChecked-Selected-after-styles; + } + } +} diff --git a/js/dojo/dojox/mobile/themes/common/RoundRect.less b/js/dojo/dojox/mobile/themes/common/RoundRect.less new file mode 100644 index 0000000..0cd6361 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/RoundRect.less @@ -0,0 +1,7 @@ +/* dojox.mobile.RoundRect */ +.mblRoundRect { + .mblRoundRect-styles; + &.mblShadow { + .mblRoundRectShadowBox-styles; + } +} diff --git a/js/dojo/dojox/mobile/themes/common/RoundRectCategory.less b/js/dojo/dojox/mobile/themes/common/RoundRectCategory.less new file mode 100644 index 0000000..cd4b311 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/RoundRectCategory.less @@ -0,0 +1,7 @@ +/* dojox.mobile.RoundRectCategory */ +.mblRoundRectCategory { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + .mblRoundRectCategory-styles; +} diff --git a/js/dojo/dojox/mobile/themes/common/RoundRectList.less b/js/dojo/dojox/mobile/themes/common/RoundRectList.less new file mode 100644 index 0000000..b756d15 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/RoundRectList.less @@ -0,0 +1,17 @@ +/* dojox.mobile.RoundRectList */ +.mblRoundRectList { + position: relative; /* IE needs this */ + .mblRoundRectList-styles; + .mblListItem:first-child { + .mblRoundRectList-FirstListItem-styles; + } + .mblListItem:last-child { + .mblRoundRectList-LastListItem-styles; + } +} +.mblRoundRectCategory + .mblRoundRectList { + .mblRoundRectList-withCategory-styles; + .mblListItem:first-child { + .mblRoundRectList-withCategory-FirstListItem-styles; + } +} diff --git a/js/dojo/dojox/mobile/themes/common/Slider.less b/js/dojo/dojox/mobile/themes/common/Slider.less new file mode 100644 index 0000000..ec57a17 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/Slider.less @@ -0,0 +1,47 @@ +/* dojox.mobile.Slider */ +.mblSlider { + outline: none; + -webkit-user-select: none; /* prevent selection */ + -webkit-box-sizing: content-box; /* make width and height consistent with a DIV */ + .mblSlider-styles; +} +.mblSliderH { + width: 200px; + height: 8px; + .mblSliderProgressBar { + height: 100%; + } + .mblSliderHandle { + top: 50%; + } +} +.mblSliderV { + height: 200px; + width: 8px; + .mblSliderProgressBar { + width: 100%; + } + .mblSliderHandle { + left: 50%; + } +} +.mblSliderProgressBar { + .mblSliderProgressBar-styles; +} +.mblSliderHandle { + .mblSliderHandle-styles; +} +.mblSliderTransition { + -webkit-transition-duration: 400ms; +} +.mblSliderTouchBox { + margin: 0; + padding: 12pt; + left: -12pt; + top: -12pt; + border: none; + width: 100%; + height: 100%; + background-color: transparent; + -webkit-tap-highlight-color: rgba(255,255,255,0); +} diff --git a/js/dojo/dojox/mobile/themes/common/SpinWheel-compat.css b/js/dojo/dojox/mobile/themes/common/SpinWheel-compat.css new file mode 100644 index 0000000..36865f2 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/SpinWheel-compat.css @@ -0,0 +1,36 @@ +.mblSpinWheel { + background-color: #D6D7DC; + background-image: -moz-linear-gradient(top, #313137 0%, #73747D 5%, #92939B 7%, #ABABB5 9%, #C5C6CE 12%, #DFE0E4 16%, #F4F5F6 22%, #FBFCFC 35%, #FBFCFC 50%, #FBFCFC 61%, #B4C1C7 61%, #FBFCFC 65%, #F4F5F6 78%, #DFE0E4 84%, #C5C6CE 88%, #ABABB5 91%, #92939B 93%, #73747D 95%, #313137 100%); + -moz-border-radius: 3px; +} +.dj_ie .mblSpinWheel { + background-image: url(compat/spinwheel-bg.png); +} + +.mblSpinWheelBar { + background-color: #C4CADC; + background-image: -moz-linear-gradient(top, #EDEEF2 0%, #C8CADD 25%, #BBBFD4 49%, #9FA8C6 51%, #A2A9C7 81%, #A6ABC9 82%, #A7ADCA 1%); + -khtml-opacity: 0.6; + -moz-opacity: 0.6; + opacity: 0.6; + filter: progid:DXImageTransform.Microsoft.alpha(opacity=60); +} +.dj_ie .mblSpinWheelBar { + background-image: url(compat/spinwheel-bar.png); +} +.dj_ie6 .mblSpinWheelBar, .dj_ie7 .mblSpinWheelBar { + z-index: -1; +} +*:first-child+html .mblSpinWheelSlotTouch { /* IE7 hack */ + background: white; + filter: alpha(opacity=0); + height: 200px; +} +*html .mblSpinWheelSlotTouch { /* IE6 hack */ + background: white; + filter: alpha(opacity=0); + height: 200px; +} +.mblSpinWheelSlotTouch, .mblSpinWheelSlotPanel { + left: 0px; +} diff --git a/js/dojo/dojox/mobile/themes/common/SpinWheel.css b/js/dojo/dojox/mobile/themes/common/SpinWheel.css new file mode 100644 index 0000000..e5eff56 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/SpinWheel.css @@ -0,0 +1,77 @@ +.mblSpinWheel { + position: relative; + overflow: hidden; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #313137), color-stop(0.05, #73747D), color-stop(0.07, #92939B), color-stop(0.09, #ABABB5), color-stop(0.12, #C5C6CE), color-stop(0.16, #DFE0E4), color-stop(0.22, #F4F5F6), color-stop(0.35, #FBFCFC), color-stop(0.5, #FBFCFC), color-stop(0.61, #FBFCFC), color-stop(0.61, #B4C1C7), color-stop(0.65, #FBFCFC), color-stop(0.78, #F4F5F6), color-stop(0.84, #DFE0E4), color-stop(0.88, #C5C6CE), color-stop(0.91, #ABABB5), color-stop(0.93, #92939B), color-stop(0.95, #73747D), color-stop(1, #313137)); + height: 200px; + border-left: solid 3px #000000; + border-right: solid 3px #000000; + color: #000000; + -webkit-border-radius: 3px; +} + +.mblSpinWheelBar { + position: absolute; + top: 79px; + background: -webkit-gradient(linear, left top, left bottom, from(#EDEEF2), to(#A7ADCA), color-stop(0, #EDEEF2), color-stop(0.25, #C8CADD), color-stop(0.49, #BBBFD4), color-stop(0.51, #9FA8C6), color-stop(0.81, #A2A9C7), color-stop(0.82, #A6ABC9), color-stop(1, #A7ADCA)); + border: solid 1px #7B8497; + height: 42px; + width: 100%; + clear: both; + -webkit-opacity: 0.6; +} + +.mblSpinWheelDatePicker { + width: 312px; +} + +.mblSpinWheelTimePicker { + width: 208px; +} + +.mblSpinWheelSlot { + position: relative; + top: 0px; + float: left; + width: 100px; + height: 100%; + border-left: solid 2px #000000; + border-right: solid 2px #000000; +} + +.mblSpinWheelSlotLabel { + padding: 0 8px; + height: 44px; + overflow: hidden; + font: bold 24px/44px Helvetica,sans-serif; +} + +.mblSpinWheelSlotLabel img{ + vertical-align: middle; + opacity: 0.7; +} + +.mblSpinWheelSlotLabelGray { + color: #CCCCCC; +} + +.mblSpinWheelSlotLabelBlue { + color: #0959D2; +} + +.mblSpinWheelSlotContainer { + position: relative; +} + +.mblSpinWheelSlotPanel { + position: absolute; + top: 0px; + width: 100%; +} + +.mblSpinWheelSlotTouch { + position: absolute; + top: 0px; + width: 100%; + height: 100%; + z-index: 1; +} diff --git a/js/dojo/dojox/mobile/themes/common/Switch.css b/js/dojo/dojox/mobile/themes/common/Switch.css new file mode 100644 index 0000000..3aed56d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/Switch.css @@ -0,0 +1,224 @@ +/* Switch - default */ +.mblSwitch { + margin: 0; + position: relative; + width: 94px; + height: 27px; + line-height: 29px; + overflow: hidden; + text-align: left; + -webkit-tap-highlight-color: rgba(255,255,255,0); +} +.mblItemSwitch { + position: absolute; + right: 12px; +} +.mblSwitchInner { + position: absolute; + top: 0px; + height: 27px; +} +.mblSwitchAnimation .mblSwitchInner { + -webkit-transition-property: left; + -webkit-transition-duration: .3s; +} +.mblSwitchOn .mblSwitchInner { + left: 0px; +} +.mblSwitchOff .mblSwitchInner { + left: -53px; +} +.mblSwitchBg { + position: absolute; + top: 0px; + height: 27px; + border-width: 1px; + border-style: inset; + border-color: #9CACC0; + font-family: Helvetica; + font-size: 16px; + font-weight: bold; + line-height: 29px; + -webkit-box-sizing: border-box; +} +.mblSwitchBgLeft { + left: 0px; + width: 94px; + color: white; + background-color: #3F84EB; +} +.mblSwitchBgRight { + left: 53px; + width: 94px; + color: #7F7F7F; +} +.mblSwitchKnob { + position: absolute; + top: 1px; + left: 53px; + width: 41px; + height: 26px; + font-size: 1px; + border-width: 1px; + border-style: solid; + border-color: #EFEFEF #A5A5A5 #969696 #325E9E; + -webkit-box-sizing: border-box; +} +.mblSwitchText { + position: relative; + top: 0px; + width: 53px; + height: 27px; + padding: 0px; + line-height: 28px; + text-align: center; +} +.mblSwitchTextLeft { + left: 0px; +} +.mblSwitchTextRight { + left: 40px; +} + +/* Round Shape1 */ +.mblSwRoundShape1 { + height: 28px; + -webkit-mask-image: -webkit-canvas(mblSwRoundShape1Mask); +} +.mblSwRoundShape1.mblItemSwitch { + top: 8px; +} +.mblSwRoundShape1 .mblSwitchInner { + height: 28px; +} +.mblSwRoundShape1.mblSwitchOff .mblSwitchInner { + left: -67px; +} +.mblSwRoundShape1 .mblSwitchBg { + height: 28px; + -webkit-border-radius: 14px; +} +.mblSwRoundShape1 .mblSwitchBgLeft { +} +.mblSwRoundShape1 .mblSwitchBgRight { + left: 67px; +} +.mblSwRoundShape1 .mblSwitchKnob { + left: 67px; + width: 26px; + height: 26px; + -webkit-border-radius: 13px; +} +.mblSwRoundShape1 .mblSwitchText { + width: 67px; + height: 26px; +} +.mblSwRoundShape1 .mblSwitchTextRight { + left: 26px; +} + +/* Round Shape2 */ +.mblSwRoundShape2 { + height: 28px; + -webkit-mask-image: -webkit-canvas(mblSwRoundShape2Mask); +} +.mblSwRoundShape2.mblItemSwitch { + top: 8px; +} +.mblSwRoundShape2 .mblSwitchInner { + height: 28px; +} +.mblSwRoundShape2.mblSwitchOff .mblSwitchInner { + left: -51px; +} +.mblSwRoundShape2 .mblSwitchBg { + height: 28px; + -webkit-border-radius: 14px; +} +.mblSwRoundShape2 .mblSwitchBgRight { + left: 51px; +} +.mblSwRoundShape2 .mblSwitchKnob { + left: 51px; + width: 42px; + height: 26px; + -webkit-border-radius: 13px; +} +.mblSwRoundShape2 .mblSwitchText { + width: 51px; + height: 28px; +} +.mblSwRoundShape2 .mblSwitchTextRight { + left: 42px; +} + +/* Arc Shape1 */ +.mblSwArcShape1 { + height: 28px; + -webkit-border-radius: 6px/14px; +} +.mblSwArcShape1.mblItemSwitch { + top: 8px; +} +.mblSwArcShape1 .mblSwitchInner { + height: 28px; +} +.mblSwArcShape1.mblSwitchOff .mblSwitchInner { + left: -67px; +} +.mblSwArcShape1 .mblSwitchBg { + height: 28px; + -webkit-border-radius: 6px/14px; +} +.mblSwArcShape1 .mblSwitchBgRight { + left: 67px; +} +.mblSwArcShape1 .mblSwitchKnob { + left: 67px; + width: 26px; + height: 26px; + -webkit-border-radius: 5px/13px; +} +.mblSwArcShape1 .mblSwitchText { + width: 67px; + height: 26px; +} +.mblSwArcShape1 .mblSwitchTextRight { + left: 26px; +} + +/* Arc Shape2 */ +.mblSwArcShape2 { + height: 28px; + -webkit-border-radius: 6px/14px; +} +.mblSwArcShape2.mblItemSwitch { + top: 8px; +} +.mblSwArcShape2 .mblSwitchInner { + height: 28px; +} +.mblSwArcShape2.mblSwitchOff .mblSwitchInner { + left: -51px; +} +.mblSwArcShape2 .mblSwitchBg { + height: 28px; + -webkit-border-radius: 6px/14px; +} +.mblSwArcShape2 .mblSwitchBgRight { + left: 51px; +} +.mblSwArcShape2 .mblSwitchKnob { + left: 51px; + width: 42px; + height: 26px; + -webkit-border-radius: 5px/13px; +} +.mblSwArcShape2 .mblSwitchText { + width: 51px; + height: 26px; +} +.mblSwArcShape2 .mblSwitchTextRight { + left: 42px; +} + diff --git a/js/dojo/dojox/mobile/themes/common/Switch.less b/js/dojo/dojox/mobile/themes/common/Switch.less new file mode 100644 index 0000000..e9868bc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/Switch.less @@ -0,0 +1,16 @@ +/* dojox.mobile.Switch */ +.mblItemSwitch { + .mblItemSwitch-styles; +} +.mblSwitchBg { + .mblSwitchBg-styles; +} +.mblSwitchBgLeft { + .mblSwitchBgLeft-styles; +} +.mblSwitchBgRight { + .mblSwitchBgRight-styles; +} +.mblSwitchKnob { + .mblSwitchKnob-styles; +} diff --git a/js/dojo/dojox/mobile/themes/common/TabBar.less b/js/dojo/dojox/mobile/themes/common/TabBar.less new file mode 100644 index 0000000..a63497a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/TabBar.less @@ -0,0 +1,147 @@ +/* dojox.mobile.TabBar */ +.mblTabBar { + position: relative; + overflow: hidden; + white-space: nowrap; + .mblTabBar-styles; +} +.mblTabBarNoIcons { + height: 34px; +} +.mblTabBarNoText { + height: 34px; +} + +/* dojox.mobile.TabBarButton */ +.mblTabBarButton { + cursor: pointer; + -webkit-tap-highlight-color: rgba(255,255,255,0); +} +.mblTabBar .mblTabBarButton { + position: relative; + list-style-type: none; + float: left; + .mblTabBar-TabBarButton-styles; + &.mblTabButtonSelected { + .mblTabBar-TabBarButton-Selected-styles; + } +} +.mblTabBarButtonAnchor { + display: block; + text-decoration: none; +} +.mblTabBarButtonDiv { + position: relative; + margin-left: auto; + margin-right: auto; + .mblTabBarButtonDiv-styles; +} +.mblTabBarButtonIcon { + position: absolute; + .mblTabBarButtonIcon-styles; +} +.mblTabBarButtonSpriteIcon { + position: absolute; +} +.mblTabBarButtonTextBox { + .mblTabBarButtonTextBox-styles; +} +.mblTabBarNoIcons { + .mblTabBarButtonDiv { + display: none; + } + .mblTabBarButtonTextBox { + .mblTabBarNoIcons-TabBarButtonTextBox-styles; + } +} +.mblTabBarTop { + .mblTabButton { + .mblTabBarButtonDiv { + .mblTabBarTop-TabButton-TabBarButtonDiv-styles; + } + } +} +.mblTabBarHead { + .mblTabButton { + .mblTabBarButtonDiv { + .mblTabBarHead-TabButton-TabBarButtonDiv-styles; + } + } +} +.mblTabButton { + position: relative; + float: left; + list-style-type: none; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255,255,255,0); + .mblTabButton-styles; + .mblTabBarButtonAnchor, .mblTabBarButtonDiv { + .mblTabButton-TabBarButtonAnchor-styles; + } + &:first-child { + .mblTabButton-FirstTabButtom-styles; + } + &:last-child { + .mblTabButton-LastTabButton-styles; + } + img { + .mblTabButton-img-styles; + } +} +.mblTabButtonSelected { + .mblTabBarButtonTextBox { + .mblTabBarButtonTextBoxSelected-styles; + } + &.mblTabButton { + .mblTabButtonSelected-styles; + } +} +.mblTabButtonHighlighted { + &.mblTabButton { + .mblTabButtonHighlighted-styles; + } +} +.mblTabButtonImgDiv { + .mblTabButtonImgDiv-styles; +} + +.mblTabPanelHeader { + position: relative; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + .mblTabPanelHeader-styles; + .mblTabButton { + .mblTabPanelHeader-TabButton-styles; + &.mblTabButtonSelected { + .mblTabPanelHeader-TabButtonSelected-styles; + } + } + .mblTabButtonDomButton { + .mblTabPanelHeader-TabButtonDomButton-styles; + } + .mblTabButtonDomButtonClass { + .mblTabPanelHeader-TabButtonDomButtonClass-styles; + } + .mblDomButton { + .mblTabPanelHeader-DomButton-styles; + } +} + +.mblHeading { + .mblTabPanelHeader { + .mblTabPanelHeader-inHeading-styles; + .mblTabButton { + .mblTabPanelHeader-TabButton-inHeading-styles; + &:first-child { + .mblTabPanelHeader-TabButton-FirstTabButtom-inHeading-styles; + } + &:last-child { + .mblTabPanelHeader-TabButton-LastTabButtom-inHeading-styles; + } + } + .mblTabButtonSelected { + .mblTabPanelHeader-TabButtonSelected-inHeading-styles; + } + } +} diff --git a/js/dojo/dojox/mobile/themes/common/TextArea.less b/js/dojo/dojox/mobile/themes/common/TextArea.less new file mode 100644 index 0000000..57b80f9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/TextArea.less @@ -0,0 +1,9 @@ +/* dojox.mobile.TextArea */ +.mblTextArea { + .mblTextArea-styles; +} + +/* dojox.mobile.ExpandingTextArea */ +.mblExpandingTextArea { + .mblExpandingTextArea-styles; +} diff --git a/js/dojo/dojox/mobile/themes/common/TextBox.less b/js/dojo/dojox/mobile/themes/common/TextBox.less new file mode 100644 index 0000000..bee00c3 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/TextBox.less @@ -0,0 +1,4 @@ +/* dojox.mobile.TextBox */ +.mblTextBox { + .mblTextBox-styles; +} diff --git a/js/dojo/dojox/mobile/themes/common/ToggleButton.less b/js/dojo/dojox/mobile/themes/common/ToggleButton.less new file mode 100644 index 0000000..1796ab3 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/ToggleButton.less @@ -0,0 +1,28 @@ +/* dojox.mobile.ToggleButton */ +.mblToggleButton { + position: relative; + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: rgba(255,255,255,0); + .mblToggleButton-styles; + &.mblToggleButtonSelected { + .mblToggleButtonSelected-styles; + } + &.mblToggleButtonChecked { + .mblToggleButtonChecked-styles; + &::after { + position: absolute; + .mblToggleButtonChecked-after-styles; + } + &.mblToggleButtonSelected { + .mblToggleButtonCheckedSelected-styles; + &::after { + .mblToggleButtonCheckedSelected-after-styles; + } + } + } + &:disabled { + cursor: default; + .mblToggleButtonDisabled-styles; + } +} diff --git a/js/dojo/dojox/mobile/themes/common/ToolBarButton.less b/js/dojo/dojox/mobile/themes/common/ToolBarButton.less new file mode 100644 index 0000000..3d8ee62 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/ToolBarButton.less @@ -0,0 +1,22 @@ +/* dojox.mobile.ToolBarButton */ +.mblToolBarButton { + float: left; + position: relative; + overflow: hidden; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255,255,255,0); + .mblToolBarButton-styles; +} +div.mblToolBarButtonDomButton { + .mblToolBarButtonDomButton-styles; +} +.mblToolBarButtonIcon { + position: relative; + .mblToolBarButtonIcon-styles; +} +.mblToolBarButtonSpriteIcon { + position: absolute; +} +.mblToolBarButtonText { + padding: 0px 10px; +} diff --git a/js/dojo/dojox/mobile/themes/common/Tooltip.less b/js/dojo/dojox/mobile/themes/common/Tooltip.less new file mode 100644 index 0000000..9c66e7d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/Tooltip.less @@ -0,0 +1,131 @@ +/* dojox.mobile.Tooltip */ +.mblTooltip { + position: absolute; + z-index: 2000; + display: block; + margin: 0; + .mblTooltip-styles; +} +.mblTooltipBubble { + overflow: visible; + padding: 3px; + .mblTooltipBubble-styles; +} +.mblTooltipBubble.mblTooltipAbove .mblTooltipInnerArrow { + .mblTooltipInnerArrow-Bubble-Above-styles; +} +.mblTooltipBubble.mblTooltipBelow .mblTooltipInnerArrow { + .mblTooltipInnerArrow-Bubble-Below-styles; +} +.mblTooltipBubble.mblTooltipAfter .mblTooltipInnerArrow { + .mblTooltipInnerArrow-Bubble-After-styles; +} +.mblTooltipBubble.mblTooltipBefore .mblTooltipInnerArrow { + .mblTooltipInnerArrow-Bubble-Before-styles; +} +.mblTooltip.mblTooltipAfter { + margin-left: -11px; +} +.mblTooltip.mblTooltipBefore { + margin-left: 11px; +} +.mblTooltip.mblTooltipAbove { + margin-top: 11px; +} +.mblTooltip.mblTooltipBelow { + margin-top: -11px; +} +.mblTooltipAnchor { + position: absolute; + width: 1px; + height: 1px; + background-color: transparent; + line-height: 0; + font-size: 0; +} +.mblTooltipBefore .mblTooltipAnchor { + left: -1px; +} +.mblTooltipAfter .mblTooltipAnchor { + right: -1px; +} +.mblTooltipAbove .mblTooltipAnchor { + top: -1px; +} +.mblTooltipBelow .mblTooltipAnchor { + bottom: -1px; +} +.mblTooltipArrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + .mblTooltipArrow-styles; +} +.mblTooltipBefore .mblTooltipArrow { + left: auto; + right: 1px; + top: 0; + bottom: auto; + .mblTooltipArrow-Before-styles; +} +.mblTooltipAfter .mblTooltipArrow { + left: 1px; + right: auto; + top: 0; + bottom: auto; + .mblTooltipArrow-After-styles; +} +.mblTooltipAbove .mblTooltipArrow { + top: auto; + bottom: 1px; + left: auto; + right: auto; + .mblTooltipArrow-Above-styles; +} +.mblTooltipBelow .mblTooltipArrow { + top: 1px; + bottom: auto; + left: auto; + right: auto; + .mblTooltipArrow-Below-styles; +} +.mblTooltipInnerArrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + border: 10px solid transparent; +} +.mblTooltipBefore .mblTooltipInnerArrow { + right: 0; + top: 0; + .mblTooltipInnerArrow-Before-styles; +} +.mblTooltipAfter .mblTooltipInnerArrow { + left: 0; + top: 0; + .mblTooltipInnerArrow-After-styles; +} +.mblTooltipAbove .mblTooltipInnerArrow { + bottom: 0; + left: 0; + .mblTooltipInnerArrow-Above-styles; +} +.mblTooltipBelow .mblTooltipInnerArrow { + top: 0; + left: 0; + .mblTooltipInnerArrow-Below-styles; +} +.mblTooltipHidden, +.mblTooltipHidden * { + visibility: hidden !important; +} + +// Headings and Button styles are overridden in Tooltips +.mblTooltip .mblHeading { + .mblTooltip-Heading-styles; +} +.mblTooltip .mblHeading .mblToolBarButton { + .mblTooltip-Heading-ToolbarButton-styles; +} diff --git a/js/dojo/dojox/mobile/themes/common/View.less b/js/dojo/dojox/mobile/themes/common/View.less new file mode 100644 index 0000000..70c43ed --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/View.less @@ -0,0 +1,21 @@ +/* dojox.mobile.View */ +.mblView { + position: relative; + top: 0px; + left: 0px; + width: 100%; + .mblView-styles; + &.mblOut { + } + &.mblIn { + position: absolute; + } +} +.mblFixedHeaderBar { + z-index: 1; +} +.mblFixedBottomBar { + position: absolute !important; + width: 100%; + z-index: 1; +} diff --git a/js/dojo/dojox/mobile/themes/common/common.less b/js/dojo/dojox/mobile/themes/common/common.less new file mode 100644 index 0000000..1c4ecf2 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/common.less @@ -0,0 +1,24 @@ +html.mobile, .mobile body { + width: 100%; + margin: 0px; + padding: 0px; +} +.mobile body { + overflow-x: hidden; + -webkit-text-size-adjust: none; + .mobile-body-styles; +} + +/* Button Colors */ +.mblColorBlue { + .mblColorBlue-styles; +} + +/* Default Button Colors */ +.mblColorDefault { + .mblColorDefault-styles; +} + +.mblColorDefaultSel { + .mblColorDefaultSel-styles; +} diff --git a/js/dojo/dojox/mobile/themes/common/compat/spinwheel-bar.png b/js/dojo/dojox/mobile/themes/common/compat/spinwheel-bar.png Binary files differnew file mode 100644 index 0000000..1aeee2d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/compat/spinwheel-bar.png diff --git a/js/dojo/dojox/mobile/themes/common/compat/spinwheel-bg.png b/js/dojo/dojox/mobile/themes/common/compat/spinwheel-bg.png Binary files differnew file mode 100644 index 0000000..69c3768 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/compat/spinwheel-bg.png diff --git a/js/dojo/dojox/mobile/themes/common/compile.js b/js/dojo/dojox/mobile/themes/common/compile.js new file mode 100644 index 0000000..159d06b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/compile.js @@ -0,0 +1,42 @@ +// load libraries +var fs = require("fs"); +var path = require("path"); +var less = require("less"); + +// collect files +var folders = ["../android", "../blackberry", "../iphone", "../custom"]; +var files = []; +folders.forEach(function(folder){ + files = files.concat(fs.readdirSync(folder).map(function(file){ + return folder + "/" + file; + })); +}); +files = files.filter(function(file){ + return file && /\.less$/.test(file) && !/variables\.less$/.test(file); +}); + +// compile files +files.forEach(function(file){ + console.log("compiling " + file); + fs.readFile(file, "utf-8", function(error, data){ + if(error){ + console.error(error.message); + process.exit(1); + } + var parser = new(less.Parser)({paths: [path.dirname(file)], filename: file, optimization: 1}); + parser.parse(data, function(error, tree){ + if(error){ + less.writeError(error); + process.exit(1); + } + try{ + var css = tree.toCSS({compress: false}); + var fd = fs.openSync(file.replace(".less", ".css"), "w"); + fs.writeSync(fd, css, 0, "utf-8"); + }catch(error){ + less.writeError(error); + process.exit(2); + } + }); + }); +}); diff --git a/js/dojo/dojox/mobile/themes/common/dijit/Calendar-compat.css b/js/dojo/dojox/mobile/themes/common/dijit/Calendar-compat.css new file mode 100644 index 0000000..f180b2f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/dijit/Calendar-compat.css @@ -0,0 +1,9 @@ +.dijitCalendar thead { + background-image: url(compat/calendar-month-bg.png); +} +.dijitCalendarDayLabelTemplate { + background-image: url(compat/calendar-daylabel-bg.png); +} +.dijitCalendarYearLabel { + background-image: url(compat/calendar-year-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/common/dijit/Calendar.css b/js/dojo/dojox/mobile/themes/common/dijit/Calendar.css new file mode 100644 index 0000000..4e27ae1 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/dijit/Calendar.css @@ -0,0 +1,135 @@ +/*if you link this stylesheet directory, mobile/common/dijit/base.css must already be imported*/ + +/* dijit base styles to override (based on claro) */ +@import url("../../../../../dijit/themes/claro/form/Common.css"); +@import url("../../../../../dijit/themes/claro/form/Button.css"); +@import url("../../../../../dijit/themes/claro/Calendar.css"); + +.dijitCalendar { + border: solid 1px #B5BCC7; + background-color: #CFE5FA; + width: 320px; + text-align: center; + padding: 0px 0px 0px 0px; + -moz-border-radius: 0px; + border-radius: 0px; +} +.dijitCalendar thead { + vertical-align: middle; + border-color: inherit; + background-image: -webkit-gradient(linear, left top, left bottom, from(#F6F6F6), to(#CCCCD1)); +} +.dijitCalendarMonthLabel { + color: #545454; + font-size: 22px; + padding: 0 4px; + font-family: Helvetica; + text-shadow: rgba(247,247,247,0.6) 0px 1px 0px; +} + +.dijitCalendar .dijitDropDownButton .dijitButtonNode { + background-color: transparent; + background-image: none; + padding: 0 3px 0 2px; + border: none; + -webkit-box-shadow: 0 0 0 transparent; + -moz-box-shadow: 0 0 0 transparent; + box-shadow: 0 0 0 transparent; + -moz-border-radius: 0px; + border-radius: 0px; +} + +.dijitArrowButtonInner { + display: none; +} + +.dijitCalendarDayLabelTemplate { + text-align: center; + font-size: 9px; + color: #545454; + text-shadow: rgba(247,247,247,0.6) 0px 1px 0px; +} + +.dijitCalendarHoveredDate .dijitCalendarDateLabel { + background-color: #ABD6FF; + border: solid 1px #769DC0; + color: black; + -webkit-transition-duration: 0.2s; + -moz-transition-duration: 0.2s; + transition-duration: 0.2s; +} + +.dijitCalendarDateTemplate { + text-align: center; + background-color: #DDDDE0; + border-bottom: 1px solid lightGrey; + padding-top: 0; +/* color: #545454;*/ + color: #4A5B6E; + text-shadow: rgba(231,231,233,1.0) 0px 1px 0px; + font-size: 22px; + font-weight: normal; + font-family: Helvetica; + text-align: center; +} + +.dijitCalendarDateTemplate .dijitCalendarDateLabel { + text-decoration: none; + display: block; + padding: 3px 5px 3px 4px; + border-top: solid 1px #ECEEEF; + border-bottom: solid 1px #A6AAB3; + border-left: solid 1px #A0A4AD; + border-right: solid 1px #ECECED; + background-color: rgba(171, 212, 251, 0); + -webkit-transition-property: background-color, border; + -moz-transition-property: background-color, border; + transition-property: background-color, border; + -webkit-transition-duration: 0.35s; + -moz-transition-duration: 0.35s; + transition-duration: 0.35s; +} + +.dijitCalendarPreviousMonth .dijitCalendarDateLabel, +.dijitCalendarNextMonth .dijitCalendarDateLabel { + color: #9099A4; +} + +.dijitCalendarSelectedDate .dijitCalendarDateLabel { + background-color: #1A80E5; + border-top: solid 1px #1037B3; + border-bottom: solid 1px #1037B3; + border-left: solid 1px #1037B3; + border-right: solid 1px #1037B3; + color: white; + text-shadow: rgba(0,0,0,0.4) 0px 1px 0px; +} + +.dijitCalendarActiveDate .dijitCalendarDateLabel { + background-color: #1A80E5; + border: solid 1px white; + -webkit-transition-duration: 0.1s; + -moz-transition-duration: 0.1s; + transition-duration: 0.1s; +} + +.dijitCalendarYearLabel { + padding: 2px 0 0 0; + margin: 0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#F6F6F6), to(#CCCCD1)); +} + +.dijitCalendarSelectedYear { + font-size: 1.091em; + color: #545454; + font-family: Helvetica; + text-shadow: rgba(247,247,247,0.6) 0px 1px 0px; +} + +.dijitCalendarNextYear, +.dijitCalendarPreviousYear { + padding: 1px 6px 1px 6px; + color: #545454; + text-shadow: rgba(247,247,247,0.6) 0px 1px 0px; + font-size: 0.909em; +}
\ No newline at end of file diff --git a/js/dojo/dojox/mobile/themes/common/dijit/ColorPalette.css b/js/dojo/dojox/mobile/themes/common/dijit/ColorPalette.css new file mode 100644 index 0000000..6184c9c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/dijit/ColorPalette.css @@ -0,0 +1,18 @@ +/*if you link this stylesheet directory, mobile/common/dijit/base.css must already be imported*/ + +.dijitColorPalette { + border: 0 solid #B5BCC7; + outline: 0; + background: none; +} +.dijitColorPalette .dijitColorPaletteSwatch { + width: 25px; + height: 25px; + border-radius: 4px; + -moz-border-radius: 4px; +} +.dijitColorPalette .dijitPaletteImg { + border: 1px solid lightGrey; + border-radius: 4px; + -moz-border-radius: 4px; +}
\ No newline at end of file diff --git a/js/dojo/dojox/mobile/themes/common/dijit/ColorPicker.css b/js/dojo/dojox/mobile/themes/common/dijit/ColorPicker.css new file mode 100644 index 0000000..b3989b4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/dijit/ColorPicker.css @@ -0,0 +1,12 @@ +/*if you link this stylesheet directory, mobile/common/dijit/base.css must already be imported*/ + +/* import base dijit styles to override below */ +@import url("../../../../../dojox/widget/ColorPicker/ColorPicker.css"); + +.dojoxColorPicker { + padding: 8px; + -moz-border-radius: 4pt; + -webkit-border-radius: 5pt; + -webkit-drop-shadow: 3pt; + background: gray; +} diff --git a/js/dojo/dojox/mobile/themes/common/dijit/base.css b/js/dojo/dojox/mobile/themes/common/dijit/base.css new file mode 100644 index 0000000..53c6ac8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/dijit/base.css @@ -0,0 +1,15 @@ +/* base dijit stylesheets with styles to override. + in future releases, split these out */ +@import url("../../../../../dijit/themes/dijit.css"); +@import url("../../../../../dijit/icons/commonIcons.css");/*sprite containing common icons to be used by all themes*/ +@import url("../../../../../dijit/themes/claro/Common.css"); + +/* needed in IconContainerMulti tests + @import url("../../../../../dijit/themes/claro/ProgressBar.css"); +*/ +@import url("../../../../../dijit/themes/claro/claro_rtl.css"); + +/* mobile styling variants of dijit and dojox desktop widgets */ +@import url("Calendar.css"); +@import url("ColorPalette.css"); +@import url("ColorPicker.css"); diff --git a/js/dojo/dojox/mobile/themes/common/dijit/compat/calendar-daylabel-bg.png b/js/dojo/dojox/mobile/themes/common/dijit/compat/calendar-daylabel-bg.png Binary files differnew file mode 100644 index 0000000..9754278 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/dijit/compat/calendar-daylabel-bg.png diff --git a/js/dojo/dojox/mobile/themes/common/dijit/compat/calendar-month-bg.png b/js/dojo/dojox/mobile/themes/common/dijit/compat/calendar-month-bg.png Binary files differnew file mode 100644 index 0000000..f32e5e3 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/dijit/compat/calendar-month-bg.png diff --git a/js/dojo/dojox/mobile/themes/common/dijit/compat/calendar-year-bg.png b/js/dojo/dojox/mobile/themes/common/dijit/compat/calendar-year-bg.png Binary files differnew file mode 100644 index 0000000..6dcee1e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/dijit/compat/calendar-year-bg.png diff --git a/js/dojo/dojox/mobile/themes/common/dijit/dijit-compat.css b/js/dojo/dojox/mobile/themes/common/dijit/dijit-compat.css new file mode 100644 index 0000000..aea6c3c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/dijit/dijit-compat.css @@ -0,0 +1 @@ +@import url("Calendar-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/common/dijit/dijit.css b/js/dojo/dojox/mobile/themes/common/dijit/dijit.css new file mode 100644 index 0000000..5345028 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/dijit/dijit.css @@ -0,0 +1,4 @@ +@import url("base.css"); +@import url("Calendar.css"); +@import url("ColorPalette.css"); +@import url("ColorPicker.css");
\ No newline at end of file diff --git a/js/dojo/dojox/mobile/themes/common/domButtons-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons-compat.css new file mode 100644 index 0000000..751a376 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons-compat.css @@ -0,0 +1,38 @@ +/* DOM Buttons */ +@import url("domButtons/DomButtonWhitePlus-compat.css"); +@import url("domButtons/DomButtonWhiteUpArrow-compat.css"); +@import url("domButtons/DomButtonWhiteDownArrow-compat.css"); +@import url("domButtons/DomButtonWhiteSearch-compat.css"); +@import url("domButtons/DomButtonColorButtons-compat.css"); +@import url("domButtons/DomButtonCheckboxOn-compat.css"); +@import url("domButtons/DomButtonCheckboxOff-compat.css"); + +@import url("domButtons/DomButtonBlueCircleMinus-compat.css"); +@import url("domButtons/DomButtonBlueCirclePlus-compat.css"); +@import url("domButtons/DomButtonBlueCircleArrow-compat.css"); + +@import url("domButtons/DomButtonRedCircleMinus-compat.css"); +@import url("domButtons/DomButtonRedCirclePlus-compat.css"); +@import url("domButtons/DomButtonRedCircleArrow-compat.css"); + +@import url("domButtons/DomButtonGreenCircleMinus-compat.css"); +@import url("domButtons/DomButtonGreenCirclePlus-compat.css"); +@import url("domButtons/DomButtonGreenCircleArrow-compat.css"); +@import url("domButtons/DomButtonBlackCircleCross-compat.css"); + +@import url("domButtons/DomButtonGrayRoundRect-compat.css"); + +@import url("domButtons/DomButtonSilverCircleDownArrow-compat.css"); +@import url("domButtons/DomButtonSilverCircleGreenButton-compat.css"); +@import url("domButtons/DomButtonSilverCircleGrayButton-compat.css"); +@import url("domButtons/DomButtonSilverCircleOrangeButton-compat.css"); +@import url("domButtons/DomButtonSilverCircleGreenPlus-compat.css"); +@import url("domButtons/DomButtonSilverCircleRedCross-compat.css"); + +@import url("domButtons/DomButtonBlueBall-compat.css"); +@import url("domButtons/DomButtonGreenBall-compat.css"); +@import url("domButtons/DomButtonOrangeBall-compat.css"); +@import url("domButtons/DomButtonRedBall-compat.css"); + +@import url("domButtons/DomButtonYellowStar-compat.css"); +@import url("domButtons/DomButtonGrayStar-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/common/domButtons.css b/js/dojo/dojox/mobile/themes/common/domButtons.css new file mode 100644 index 0000000..9a1bf58 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons.css @@ -0,0 +1,42 @@ +/* DOM Buttons */ +@import url("domButtons/DomButtonWhitePlus.css"); +@import url("domButtons/DomButtonWhiteUpArrow.css"); +@import url("domButtons/DomButtonWhiteDownArrow.css"); +@import url("domButtons/DomButtonWhiteSearch.css"); +@import url("domButtons/DomButtonColorButtons.css"); +@import url("domButtons/DomButtonCheckboxOn.css"); +@import url("domButtons/DomButtonCheckboxOff.css"); + +@import url("domButtons/DomButtonBlueCircleMinus.css"); +@import url("domButtons/DomButtonBlueCirclePlus.css"); +@import url("domButtons/DomButtonBlueCircleArrow.css"); + +@import url("domButtons/DomButtonRedCircleMinus.css"); +@import url("domButtons/DomButtonRedCirclePlus.css"); +@import url("domButtons/DomButtonRedCircleArrow.css"); + +@import url("domButtons/DomButtonGreenCircleMinus.css"); +@import url("domButtons/DomButtonGreenCirclePlus.css"); +@import url("domButtons/DomButtonGreenCircleArrow.css"); +@import url("domButtons/DomButtonBlackCircleCross.css"); + +@import url("domButtons/DomButtonGrayRoundRect.css"); + +@import url("domButtons/DomButtonSilverCircleDownArrow.css"); +@import url("domButtons/DomButtonSilverCircleGreenButton.css"); +@import url("domButtons/DomButtonSilverCircleGrayButton.css"); +@import url("domButtons/DomButtonSilverCircleOrangeButton.css"); +@import url("domButtons/DomButtonSilverCircleGreenPlus.css"); +@import url("domButtons/DomButtonSilverCircleRedCross.css"); + +@import url("domButtons/DomButtonBlueBall.css"); +@import url("domButtons/DomButtonGreenBall.css"); +@import url("domButtons/DomButtonOrangeBall.css"); +@import url("domButtons/DomButtonRedBall.css"); + +@import url("domButtons/DomButtonTransparent19.css"); +@import url("domButtons/DomButtonTransparent29.css"); +@import url("domButtons/DomButtonTransparent30.css"); + +@import url("domButtons/DomButtonYellowStar.css"); +@import url("domButtons/DomButtonGrayStar.css"); diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlackCircleCross-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlackCircleCross-compat.css new file mode 100644 index 0000000..fa4f6ed --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlackCircleCross-compat.css @@ -0,0 +1,8 @@ +/* === Black Circle Cross Button ==*/ +.mblDomButtonBlackCircleCross { + background-image: url(compat/mblDomButtonBlackCircleCross.png); + background-repeat: no-repeat; +} +.mblDomButtonBlackCircleCross > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlackCircleCross.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlackCircleCross.css new file mode 100644 index 0000000..47bbab9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlackCircleCross.css @@ -0,0 +1,49 @@ +/* === Black Circle Cross Button ==*/ +.mblDomButtonBlackCircleCross { + position: relative; + width: 29px; + height: 29px; +} +.mblDomButtonBlackCircleCross > div { + position: relative; + top: 3px; + left: 3px; + width: 23px; + height: 23px; + background-color: white; + -webkit-border-radius: 12px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); +} +.mblDomButtonBlackCircleCross > div > div { + position: relative; + top: 2px; + left: 2px; + width: 19px; + height: 19px; + background-color: black; + -webkit-border-radius: 10px; +} +.mblDomButtonBlackCircleCross > div > div > div { + position: absolute; + top: 8px; + left: 3px; + width: 13px; + height: 3px; + margin: 0px; + font-size: 1px; + border-style: none; + background-color: white; + -webkit-transform: rotate(45deg); + -webkit-border-radius: 1px; +} +.mblDomButtonBlackCircleCross > div > div > div > div { + position: absolute; + top: -5px; + left: 5px; + width: 3px; + height: 13px; + margin: 0px; + font-size: 1px; + background-color: white; + -webkit-border-radius: 1px; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueBall-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueBall-compat.css new file mode 100644 index 0000000..9564a12 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueBall-compat.css @@ -0,0 +1,8 @@ +/* === Blue Ball Button ==*/ +.mblDomButtonBlueBall { + background-image: url(compat/mblDomButtonBlueBall.png); + background-repeat: no-repeat; +} +.mblDomButtonBlueBall > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueBall.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueBall.css new file mode 100644 index 0000000..79eaf75 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueBall.css @@ -0,0 +1,15 @@ +/* === Blue Ball Button ==*/ +.mblDomButtonBlueBall { + position: relative; + width: 19px; + height: 29px; +} +.mblDomButtonBlueBall > div { + position: relative; + top: 8px; + left: 4px; + width: 14px; + height: 14px; + -webkit-border-radius: 7px; + background: -webkit-gradient(linear, left top, left bottom, from(#84AFF4), to(#2758B3)); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleArrow-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleArrow-compat.css new file mode 100644 index 0000000..22397d7 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleArrow-compat.css @@ -0,0 +1,9 @@ +/* === Blue Circle Arrow Buttons ==*/ +.mblDomButtonBlueCircleArrow { + background-image: url(compat/mblDomButtonBlueCircleArrow.png); + background-repeat: no-repeat; +} + +.mblDomButtonBlueCircleArrow > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleArrow.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleArrow.css new file mode 100644 index 0000000..2995fb1 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleArrow.css @@ -0,0 +1,48 @@ +/* === Blue Circle Arrow Buttons ==*/ +.mblDomButtonBlueCircleArrow { + position: relative; + width: 29px; + height: 29px; +} + +.mblDomButtonBlueCircleArrow > div { + position: relative; + top: 2px; + left: 2px; + width: 22px; + height: 22px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 12px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); +} +.mblDomButtonBlueCircleArrow > div > div { + position: relative; + top: 2px; + left: 2px; + width: 18px; + height: 18px; + -webkit-border-radius: 9px; + background: -webkit-gradient(linear, left top, left bottom, from(#6BA2E7), to(#216DD6), color-stop(0.5, #4282DE), color-stop(0.5, #216DD6)); +} +.mblDomButtonBlueCircleArrow > div > div > div { + position: absolute; + top: 5px; + left: 6px; + width: 8px; + height: 3px; + margin: 0px; + font-size: 1px; + border-style: none; + background: white; + -webkit-transform: rotate(45deg); +} +.mblDomButtonBlueCircleArrow > div > div > div > div { + position: absolute; + top: 1px; + left: 6px; + width: 3px; + height: 8px; + margin: 0px; + font-size: 1px; + background-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleMinus-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleMinus-compat.css new file mode 100644 index 0000000..592531d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleMinus-compat.css @@ -0,0 +1,9 @@ +/* === Blue Circle Minus Buttons ==*/ +.mblDomButtonBlueCircleMinus { + background-image: url(compat/mblDomButtonBlueCircleMinus.png); + background-repeat: no-repeat; +} + +.mblDomButtonBlueCircleMinus > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleMinus.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleMinus.css new file mode 100644 index 0000000..24d24c7 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleMinus.css @@ -0,0 +1,37 @@ +/* === Blue Circle Minus Buttons ==*/ +.mblDomButtonBlueCircleMinus { + position: relative; + width: 29px; + height: 29px; +} + +.mblDomButtonBlueCircleMinus > div { + position: relative; + top: 2px; + left: 2px; + width: 22px; + height: 22px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 12px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); +} +.mblDomButtonBlueCircleMinus > div > div { + position: relative; + top: 2px; + left: 2px; + width: 18px; + height: 18px; + -webkit-border-radius: 9px; + background: -webkit-gradient(linear, left top, left bottom, from(#6BA2E7), to(#216DD6), color-stop(0.5, #4282DE), color-stop(0.5, #216DD6)); +} +.mblDomButtonBlueCircleMinus > div > div > div { + position: absolute; + top: 8px; + left: 3px; + width: 12px; + height: 3px; + margin: 0px; + font-size: 1px; + border-style: none; + background: white; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCirclePlus-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCirclePlus-compat.css new file mode 100644 index 0000000..1e36e02 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCirclePlus-compat.css @@ -0,0 +1,9 @@ +/* === Blue Circle Plus Buttons ==*/ +.mblDomButtonBlueCirclePlus { + background-image: url(compat/mblDomButtonBlueCirclePlus.png); + background-repeat: no-repeat; +} + +.mblDomButtonBlueCirclePlus > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCirclePlus.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCirclePlus.css new file mode 100644 index 0000000..af1d6ad --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonBlueCirclePlus.css @@ -0,0 +1,47 @@ +/* === Blue Circle Plus Buttons ==*/ +.mblDomButtonBlueCirclePlus { + position: relative; + width: 29px; + height: 29px; +} + +.mblDomButtonBlueCirclePlus > div { + position: relative; + top: 2px; + left: 2px; + width: 22px; + height: 22px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 12px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); +} +.mblDomButtonBlueCirclePlus > div > div { + position: relative; + top: 2px; + left: 2px; + width: 18px; + height: 18px; + -webkit-border-radius: 9px; + background: -webkit-gradient(linear, left top, left bottom, from(#6BA2E7), to(#216DD6), color-stop(0.5, #4282DE), color-stop(0.5, #216DD6)); +} +.mblDomButtonBlueCirclePlus > div > div > div { + position: absolute; + top: 8px; + left: 3px; + width: 13px; + height: 3px; + margin: 0px; + font-size: 1px; + border-style: none; + background: white; +} +.mblDomButtonBlueCirclePlus > div > div > div > div { + position: absolute; + top: -5px; + left: 5px; + width: 3px; + height: 13px; + margin: 0px; + font-size: 1px; + background-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOff-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOff-compat.css new file mode 100644 index 0000000..49c25bb --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOff-compat.css @@ -0,0 +1,8 @@ +/* === Check Button (OFF) ==*/ +.mblDomButtonCheckboxOff { + background-image: url(compat/mblDomButtonCheckboxOff.png); + background-repeat: no-repeat; +} +.mblDomButtonCheckboxOff div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOff.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOff.css new file mode 100644 index 0000000..66fdd9d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOff.css @@ -0,0 +1,40 @@ +/* === Check Button (OFF) ==*/ +.mblDomButtonCheckboxOff { + position: relative; + width: 30px; + height: 30px; + border-width: 1px; + border-style: outset; + border-color: #A5A2A5; + color: white; + -webkit-border-radius: 3px; + background-color: #D6D3D6; + background: -webkit-gradient(linear, left top, left bottom, from(#EFF3EF), to(#BDBEBD)); +} +.mblDomButtonCheckboxOff > div { + position: absolute; + top: 15px; + left: 3px; + width: 14px; + height: 4px; + margin: 0px; + font-size: 1px; + background-color: #BDBABD; + border-bottom: 1px solid #8C8E8C; + -webkit-border-radius: 2px; + -webkit-transform: rotate(50deg); +} +.mblDomButtonCheckboxOff > div > div { + position: absolute; + top: -10px; + left: 0px; + width: 20px; + height: 4px; + margin: 0px; + font-size: 1px; + background-color: #BDBABD; + border-bottom: none; + border-top: 1px solid #8C8E8C; + -webkit-border-radius: 2px; + -webkit-transform: rotate(-100deg); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOn-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOn-compat.css new file mode 100644 index 0000000..933aece --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOn-compat.css @@ -0,0 +1,8 @@ +/* === Check Button (ON) ==*/ +.mblDomButtonCheckboxOn { + background-image: url(compat/mblDomButtonCheckboxOn.png); + background-repeat: no-repeat; +} +.mblDomButtonCheckboxOn div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOn.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOn.css new file mode 100644 index 0000000..7c25a9e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOn.css @@ -0,0 +1,40 @@ +/* === Check Button (ON) ==*/ +.mblDomButtonCheckboxOn { + position: relative; + width: 30px; + height: 30px; + border-width: 1px; + border-style: outset; + border-color: #A5A2A5; + color: white; + -webkit-border-radius: 3px; + background-color: #D6D3D6; + background: -webkit-gradient(linear, left top, left bottom, from(#EFF3EF), to(#BDBEBD)); +} +.mblDomButtonCheckboxOn > div { + position: absolute; + top: 15px; + left: 3px; + width: 14px; + height: 4px; + margin: 0px; + font-size: 1px; + background-color: #00CF00; + border-top: 1px solid #4A5A71; + -webkit-border-radius: 2px; + -webkit-transform: rotate(50deg); +} +.mblDomButtonCheckboxOn > div > div { + position: absolute; + top: -10px; + left: 0px; + width: 20px; + height: 4px; + margin: 0px; + font-size: 1px; + background-color: #00CF00; + border-top: none; + border-bottom: 1px solid #4A5A71; + -webkit-border-radius: 2px; + -webkit-transform: rotate(-100deg); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonColorButtons-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonColorButtons-compat.css new file mode 100644 index 0000000..8c77494 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonColorButtons-compat.css @@ -0,0 +1,48 @@ +/* === Minus and Plus Buttons ==*/ +.mblDomButtonBlueMinus { + background-image: url(compat/mblDomButtonBlueMinus.png); + background-repeat: no-repeat; +} +.mblDomButtonBlueMinus div { + display: none; +} + +.mblDomButtonBluePlus { + background-image: url(compat/mblDomButtonBluePlus.png); + background-repeat: no-repeat; +} +.mblDomButtonBluePlus div { + display: none; +} + +.mblDomButtonDarkBlueMinus { + background-image: url(compat/mblDomButtonDarkBlueMinus.png); + background-repeat: no-repeat; +} +.mblDomButtonDarkBlueMinus div { + display: none; +} + +.mblDomButtonDarkBluePlus { + background-image: url(compat/mblDomButtonDarkBluePlus.png); + background-repeat: no-repeat; +} +.mblDomButtonDarkBluePlus div { + display: none; +} + +.mblDomButtonRedMinus { + background-image: url(compat/mblDomButtonRedMinus.png); + background-repeat: no-repeat; +} +.mblDomButtonRedMinus div { + display: none; +} + +.mblDomButtonRedPlus { + background-image: url(compat/mblDomButtonRedPlus.png); + background-repeat: no-repeat; +} +.mblDomButtonRedPlus div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonColorButtons.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonColorButtons.css new file mode 100644 index 0000000..8017cf2 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonColorButtons.css @@ -0,0 +1,55 @@ +/* === Minus and Plus Buttons ==*/ +.mblDomButtonBlueMinus, .mblDomButtonBluePlus, .mblDomButtonDarkBlueMinus, .mblDomButtonDarkBluePlus, .mblDomButtonRedMinus, .mblDomButtonRedPlus { + position: relative; + width: 29px; + height: 29px; +} + +.mblDomButtonBlueMinus > div, .mblDomButtonBluePlus > div, .mblDomButtonDarkBlueMinus > div, .mblDomButtonDarkBluePlus > div, .mblDomButtonRedMinus > div, .mblDomButtonRedPlus > div { + position: relative; + top: 4px; + left: 3px; + width: 22px; + height: 18px; + border-width: 1px 1px 1px 0px; + border-style: outset; + color: white; + -webkit-border-radius: 3px; +} +.mblDomButtonBlueMinus > div, .mblDomButtonBluePlus > div { + border-color: #6D89C7; + background-color: #366EDF; + background: -webkit-gradient(linear, left top, left bottom, from(#7A9DE9), to(#2362DD), color-stop(0.5, #366EDF), color-stop(0.5, #215FDC)); +} +.mblDomButtonDarkBlueMinus > div, .mblDomButtonDarkBluePlus > div { + border-color: #6D89C7; + background-color: #5877A2; + background: -webkit-gradient(linear, left top, left bottom, from(#8EA4C1), to(#4A6C9B), color-stop(0.5, #5877A2), color-stop(0.5, #476999)); +} +.mblDomButtonRedMinus > div, .mblDomButtonRedPlus > div { + border-color: #cc1122; + background-color: #C9404B; + background: -webkit-gradient(linear, left top, left bottom, from(#D3656D), to(#BC1320), color-stop(0.5, #C9404B), color-stop(0.5, #BC1421)); +} +.mblDomButtonBlueMinus > div > div, .mblDomButtonBluePlus > div > div, .mblDomButtonDarkBlueMinus > div > div, .mblDomButtonDarkBluePlus > div > div, .mblDomButtonRedMinus > div > div, .mblDomButtonRedPlus > div > div { + position: absolute; + top: 7px; + left: 7px; + width: 8px; + height: 2px; + margin: 0px; + font-size: 1px; + border-style: none; + background: white; + border-top: 1px solid #4A5A71; +} +.mblDomButtonBluePlus > div > div > div, .mblDomButtonDarkBluePlus > div > div > div, .mblDomButtonRedPlus > div > div > div { + position: absolute; + top: -3px; + left: 3px; + width: 2px; + height: 8px; + margin: 0px; + font-size: 1px; + background-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonDarkBlueCheck-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonDarkBlueCheck-compat.css new file mode 100644 index 0000000..1071a54 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonDarkBlueCheck-compat.css @@ -0,0 +1,8 @@ +/* === Check Button ==*/ +.mblDomButtonDarkBlueCheck, .mblDomButtonCheck { + background-image: url(compat/mblDomButtonDarkBlueCheck.png); + background-repeat: no-repeat; +} +.mblDomButtonDarkBlueCheck div, .mblDomButtonCheck div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonDarkBlueCheck.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonDarkBlueCheck.css new file mode 100644 index 0000000..6edc2b2 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonDarkBlueCheck.css @@ -0,0 +1,18 @@ +/* === Check Button ==*/ +.mblDomButtonDarkBlueCheck, .mblDomButtonCheck { + position: relative; + width: 20px; + height: 29px; +} +.mblDomButtonDarkBlueCheck > div, .mblDomButtonCheck > div { + position: absolute; + left: 0px; + top: 8px; + width: 16px; + height: 6px; + font-size: 1px; + -webkit-transform: scaleX(0.7) rotate(135deg); + border-width: 3px 4px 0px 0px; + border-style: solid; + border-color: #314E84; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayArrow-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayArrow-compat.css new file mode 100644 index 0000000..bed275d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayArrow-compat.css @@ -0,0 +1,8 @@ +/* === Arrow Button ==*/ +.mblDomButtonGrayArrow, .mblDomButtonArrow { + background-image: url(compat/mblDomButtonGrayArrow.png); + background-repeat: no-repeat; +} +.mblDomButtonGrayArrow div, .mblDomButtonArrow div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayArrow.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayArrow.css new file mode 100644 index 0000000..bfad471 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayArrow.css @@ -0,0 +1,18 @@ +/* === Arrow ==*/ +.mblDomButtonGrayArrow, .mblDomButtonArrow { + position: relative; + width: 20px; + height: 29px; +} +.mblDomButtonGrayArrow > div, .mblDomButtonArrow > div { + position: absolute; + top: 10px; + left: 6px; + width: 6px; + height: 6px; + font-size: 1px; + -webkit-transform: rotate(45deg); + border-width: 3px 3px 0px 0px; + border-style: solid; + border-color: #808080; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayRoundRect-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayRoundRect-compat.css new file mode 100644 index 0000000..8ee029b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayRoundRect-compat.css @@ -0,0 +1,4 @@ +/* === Gray Round Rectangle Button ==*/ +.mblDomButtonGrayRoundRect > div { + -moz-border-radius: 4px; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayRoundRect.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayRoundRect.css new file mode 100644 index 0000000..5ceb481 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayRoundRect.css @@ -0,0 +1,23 @@ +/* === Gray Round Rectangle Button ==*/ +.mblDomButtonGrayRoundRect { + position: relative; + width: 29px; + height: 29px; + text-align: right; +} +.mblDomButtonGrayRoundRect > div { + position: absolute; + right: 0px; + display: inline; + padding: 0px 5px; + top: 7px; + color: white; + font-family: Helvetica; + font-size: 12px; + -webkit-border-radius: 4px; + background-color: #949BA5; + text-align: center; +} +.mblDomButtonGrayRoundRect > div > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayStar-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayStar-compat.css new file mode 100644 index 0000000..d92ec87 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayStar-compat.css @@ -0,0 +1,8 @@ +/* === Gray Star ==*/ +.mblDomButtonGrayStar { + background-image: url(compat/mblDomButtonGrayStar.png); + background-repeat: no-repeat; +} +.mblDomButtonGrayStar > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayStar.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayStar.css new file mode 100644 index 0000000..605de2c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGrayStar.css @@ -0,0 +1,49 @@ +/* === Gray Star ==*/ +.mblDomButtonGrayStar { + position: relative; + width: 29px; + height: 29px; +} +.mblDomButtonGrayStar > div { + position: absolute; + width: 0px; + height: 0px; + border-style: solid; + border-color: #BDBABD transparent transparent transparent; + top: 12px; + left: 3px; + border-width: 9px 12px 0px 12px; + -webkit-transform: rotate(0deg); +} +.mblDomButtonGrayStar > div > div { + position: absolute; + width: 24px; + height: 0px; + border-style: solid; + border-color: #8C8E8C; + border-width: 1px 0px 0px 0px; + top: -10px; + left: -12px; +} +.mblDomButtonGrayStar > div > div > div { + position: absolute; + width: 0px; + height: 0px; + border-style: solid; + border-color: #BDBABD transparent transparent transparent; + top: 0px; + left: 0px; + border-width: 9px 12px 0px 12px; + -webkit-transform: rotate(72deg); +} +.mblDomButtonGrayStar > div > div > div > div { + position: absolute; + width: 0px; + height: 0px; + border-style: solid; + border-color: #BDBABD transparent transparent transparent; + top: -10px; + left: -12px; + border-width: 9px 12px 0px 12px; + -webkit-transform: rotate(216deg); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenBall-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenBall-compat.css new file mode 100644 index 0000000..b9335bd --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenBall-compat.css @@ -0,0 +1,8 @@ +/* === Green Ball Button ==*/ +.mblDomButtonGreenBall { + background-image: url(compat/mblDomButtonGreenBall.png); + background-repeat: no-repeat; +} +.mblDomButtonGreenBall > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenBall.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenBall.css new file mode 100644 index 0000000..f7e928f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenBall.css @@ -0,0 +1,15 @@ +/* === Green Ball Button ==*/ +.mblDomButtonGreenBall { + position: relative; + width: 19px; + height: 29px; +} +.mblDomButtonGreenBall > div { + position: relative; + top: 8px; + left: 4px; + width: 14px; + height: 14px; + -webkit-border-radius: 7px; + background: -webkit-gradient(linear, left top, left bottom, from(#59E738), to(#0AA908)); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleArrow-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleArrow-compat.css new file mode 100644 index 0000000..a62b1e5 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleArrow-compat.css @@ -0,0 +1,9 @@ +/* === Green Circle Arrow Buttons ==*/ +.mblDomButtonGreenCircleArrow { + background-image: url(compat/mblDomButtonGreenCircleArrow.png); + background-repeat: no-repeat; +} + +.mblDomButtonGreenCircleArrow > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleArrow.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleArrow.css new file mode 100644 index 0000000..53e6523 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleArrow.css @@ -0,0 +1,48 @@ +/* === Green Circle Arrow Buttons ==*/ +.mblDomButtonGreenCircleArrow { + position: relative; + width: 29px; + height: 29px; +} + +.mblDomButtonGreenCircleArrow > div { + position: relative; + top: 2px; + left: 2px; + width: 22px; + height: 22px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 12px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); +} +.mblDomButtonGreenCircleArrow > div > div { + position: relative; + top: 2px; + left: 2px; + width: 18px; + height: 18px; + -webkit-border-radius: 9px; + background: -webkit-gradient(linear, left top, left bottom, from(#7BE75A), to(#398C08), color-stop(0.5, #6BC642), color-stop(0.5, #4AAD21)); +} +.mblDomButtonGreenCircleArrow > div > div > div { + position: absolute; + top: 5px; + left: 6px; + width: 8px; + height: 3px; + margin: 0px; + font-size: 1px; + border-style: none; + background: white; + -webkit-transform: rotate(45deg); +} +.mblDomButtonGreenCircleArrow > div > div > div > div { + position: absolute; + top: 1px; + left: 6px; + width: 3px; + height: 8px; + margin: 0px; + font-size: 1px; + background-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleMinus-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleMinus-compat.css new file mode 100644 index 0000000..a6381c4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleMinus-compat.css @@ -0,0 +1,9 @@ +/* === Green Circle Minus Buttons ==*/ +.mblDomButtonGreenCircleMinus { + background-image: url(compat/mblDomButtonGreenCircleMinus.png); + background-repeat: no-repeat; +} + +.mblDomButtonGreenCircleMinus > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleMinus.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleMinus.css new file mode 100644 index 0000000..b406543 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleMinus.css @@ -0,0 +1,37 @@ +/* === Green Circle Minus Buttons ==*/ +.mblDomButtonGreenCircleMinus { + position: relative; + width: 29px; + height: 29px; +} + +.mblDomButtonGreenCircleMinus > div { + position: relative; + top: 2px; + left: 2px; + width: 22px; + height: 22px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 12px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); +} +.mblDomButtonGreenCircleMinus > div > div { + position: relative; + top: 2px; + left: 2px; + width: 18px; + height: 18px; + -webkit-border-radius: 9px; + background: -webkit-gradient(linear, left top, left bottom, from(#7BE75A), to(#398C08), color-stop(0.5, #6BC642), color-stop(0.5, #4AAD21)); +} +.mblDomButtonGreenCircleMinus > div > div > div { + position: absolute; + top: 8px; + left: 3px; + width: 12px; + height: 3px; + margin: 0px; + font-size: 1px; + border-style: none; + background: white; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCirclePlus-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCirclePlus-compat.css new file mode 100644 index 0000000..053ccd9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCirclePlus-compat.css @@ -0,0 +1,9 @@ +/* === Green Circle Plus Buttons ==*/ +.mblDomButtonGreenCirclePlus { + background-image: url(compat/mblDomButtonGreenCirclePlus.png); + background-repeat: no-repeat; +} + +.mblDomButtonGreenCirclePlus > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCirclePlus.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCirclePlus.css new file mode 100644 index 0000000..148dfa4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonGreenCirclePlus.css @@ -0,0 +1,47 @@ +/* === Green Circle Plus Buttons ==*/ +.mblDomButtonGreenCirclePlus { + position: relative; + width: 29px; + height: 29px; +} + +.mblDomButtonGreenCirclePlus > div { + position: relative; + top: 2px; + left: 2px; + width: 22px; + height: 22px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 12px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); +} +.mblDomButtonGreenCirclePlus > div > div { + position: relative; + top: 2px; + left: 2px; + width: 18px; + height: 18px; + -webkit-border-radius: 9px; + background: -webkit-gradient(linear, left top, left bottom, from(#7BE75A), to(#398C08), color-stop(0.5, #6BC642), color-stop(0.5, #4AAD21)); +} +.mblDomButtonGreenCirclePlus > div > div > div { + position: absolute; + top: 8px; + left: 3px; + width: 13px; + height: 3px; + margin: 0px; + font-size: 1px; + border-style: none; + background: white; +} +.mblDomButtonGreenCirclePlus > div > div > div > div { + position: absolute; + top: -5px; + left: 5px; + width: 3px; + height: 13px; + margin: 0px; + font-size: 1px; + background-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonOrangeBall-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonOrangeBall-compat.css new file mode 100644 index 0000000..5fc2c62 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonOrangeBall-compat.css @@ -0,0 +1,8 @@ +/* === Orange Ball Button ==*/ +.mblDomButtonOrangeBall { + background-image: url(compat/mblDomButtonOrangeBall.png); + background-repeat: no-repeat; +} +.mblDomButtonOrangeBall > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonOrangeBall.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonOrangeBall.css new file mode 100644 index 0000000..32b8659 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonOrangeBall.css @@ -0,0 +1,15 @@ +/* === Orange Ball Button ==*/ +.mblDomButtonOrangeBall { + position: relative; + width: 19px; + height: 29px; +} +.mblDomButtonOrangeBall > div { + position: relative; + top: 8px; + left: 4px; + width: 14px; + height: 14px; + -webkit-border-radius: 7px; + background: -webkit-gradient(linear, left top, left bottom, from(#F9E20A), to(#FF6B0A)); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedBall-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedBall-compat.css new file mode 100644 index 0000000..bb25172 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedBall-compat.css @@ -0,0 +1,8 @@ +/* === Red Ball Button ==*/ +.mblDomButtonRedBall { + background-image: url(compat/mblDomButtonRedBall.png); + background-repeat: no-repeat; +} +.mblDomButtonRedBall > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedBall.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedBall.css new file mode 100644 index 0000000..11a48cd --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedBall.css @@ -0,0 +1,15 @@ +/* === Red Ball Button ==*/ +.mblDomButtonRedBall { + position: relative; + width: 19px; + height: 29px; +} +.mblDomButtonRedBall > div { + position: relative; + top: 8px; + left: 4px; + width: 14px; + height: 14px; + -webkit-border-radius: 7px; + background: -webkit-gradient(linear, left top, left bottom, from(#EC9B9D), to(#D73C3F)); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCircleArrow-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCircleArrow-compat.css new file mode 100644 index 0000000..b00c414 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCircleArrow-compat.css @@ -0,0 +1,9 @@ +/* === Red Circle Arrow Buttons ==*/ +.mblDomButtonRedCircleArrow { + background-image: url(compat/mblDomButtonRedCircleArrow.png); + background-repeat: no-repeat; +} + +.mblDomButtonRedCircleArrow > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCircleArrow.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCircleArrow.css new file mode 100644 index 0000000..c1506e7 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCircleArrow.css @@ -0,0 +1,48 @@ +/* === Red Circle Arrow Buttons ==*/ +.mblDomButtonRedCircleArrow { + position: relative; + width: 29px; + height: 29px; +} + +.mblDomButtonRedCircleArrow > div { + position: relative; + top: 2px; + left: 2px; + width: 22px; + height: 22px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 12px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); +} +.mblDomButtonRedCircleArrow > div > div { + position: relative; + top: 2px; + left: 2px; + width: 18px; + height: 18px; + -webkit-border-radius: 9px; + background: -webkit-gradient(linear, left top, left bottom, from(#D3656D), to(#BC1320), color-stop(0.5, #C9404B), color-stop(0.5, #BC1421)); +} +.mblDomButtonRedCircleArrow > div > div > div { + position: absolute; + top: 5px; + left: 6px; + width: 8px; + height: 3px; + margin: 0px; + font-size: 1px; + border-style: none; + background: white; + -webkit-transform: rotate(45deg); +} +.mblDomButtonRedCircleArrow > div > div > div > div { + position: absolute; + top: 1px; + left: 6px; + width: 3px; + height: 8px; + margin: 0px; + font-size: 1px; + background-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCircleMinus-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCircleMinus-compat.css new file mode 100644 index 0000000..c437120 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCircleMinus-compat.css @@ -0,0 +1,9 @@ +/* === Red Circle Minus Buttons ==*/ +.mblDomButtonRedCircleMinus { + background-image: url(compat/mblDomButtonRedCircleMinus.png); + background-repeat: no-repeat; +} + +.mblDomButtonRedCircleMinus > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCircleMinus.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCircleMinus.css new file mode 100644 index 0000000..bd16b0c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCircleMinus.css @@ -0,0 +1,37 @@ +/* === Red Circle Minus Buttons ==*/ +.mblDomButtonRedCircleMinus { + position: relative; + width: 29px; + height: 29px; +} + +.mblDomButtonRedCircleMinus > div { + position: relative; + top: 2px; + left: 2px; + width: 22px; + height: 22px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 12px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); +} +.mblDomButtonRedCircleMinus > div > div { + position: relative; + top: 2px; + left: 2px; + width: 18px; + height: 18px; + -webkit-border-radius: 9px; + background: -webkit-gradient(linear, left top, left bottom, from(#D3656D), to(#BC1320), color-stop(0.5, #C9404B), color-stop(0.5, #BC1421)); +} +.mblDomButtonRedCircleMinus > div > div > div { + position: absolute; + top: 8px; + left: 3px; + width: 12px; + height: 3px; + margin: 0px; + font-size: 1px; + border-style: none; + background: white; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCirclePlus-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCirclePlus-compat.css new file mode 100644 index 0000000..3f7a33c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCirclePlus-compat.css @@ -0,0 +1,9 @@ +/* === Red Circle Plus Buttons ==*/ +.mblDomButtonRedCirclePlus { + background-image: url(compat/mblDomButtonRedCirclePlus.png); + background-repeat: no-repeat; +} + +.mblDomButtonRedCirclePlus > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCirclePlus.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCirclePlus.css new file mode 100644 index 0000000..a507bdd --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonRedCirclePlus.css @@ -0,0 +1,47 @@ +/* === Red Circle Plus Buttons ==*/ +.mblDomButtonRedCirclePlus { + position: relative; + width: 29px; + height: 29px; +} + +.mblDomButtonRedCirclePlus > div { + position: relative; + top: 2px; + left: 2px; + width: 22px; + height: 22px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 12px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); +} +.mblDomButtonRedCirclePlus > div > div { + position: relative; + top: 2px; + left: 2px; + width: 18px; + height: 18px; + -webkit-border-radius: 9px; + background: -webkit-gradient(linear, left top, left bottom, from(#D3656D), to(#BC1320), color-stop(0.5, #C9404B), color-stop(0.5, #BC1421)); +} +.mblDomButtonRedCirclePlus > div > div > div { + position: absolute; + top: 8px; + left: 3px; + width: 13px; + height: 3px; + margin: 0px; + font-size: 1px; + border-style: none; + background: white; +} +.mblDomButtonRedCirclePlus > div > div > div > div { + position: absolute; + top: -5px; + left: 5px; + width: 3px; + height: 13px; + margin: 0px; + font-size: 1px; + background-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleDownArrow-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleDownArrow-compat.css new file mode 100644 index 0000000..d9191e4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleDownArrow-compat.css @@ -0,0 +1,8 @@ +/* === Silver Circle Down Arrow ==*/ +.mblDomButtonSilverCircleDownArrow { + background-image: url(compat/mblDomButtonSilverCircleDownArrow.png); + background-repeat: no-repeat; +} +.mblDomButtonSilverCircleDownArrow > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleDownArrow.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleDownArrow.css new file mode 100644 index 0000000..3f70ab8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleDownArrow.css @@ -0,0 +1,43 @@ +/* === Silver Circle Down Arrow ==*/ +.mblDomButtonSilverCircleDownArrow { + position: relative; + width: 30px; + height: 30px; +} +.mblDomButtonSilverCircleDownArrow > div { + position: relative; + top: 0px; + left: 0px; + width: 26px; + height: 26px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 13px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); + background: -webkit-gradient(linear, left top, left bottom, from(#EFEFEF), to(#C2C2C2)); +} +.mblDomButtonSilverCircleDownArrow > div > div { + position: relative; + top: 3px; + left: 3px; + width: 20px; + height: 20px; + -webkit-border-radius: 10px; + background: -webkit-gradient(linear, left top, left bottom, from(#979797), to(#616161)); +} +.mblDomButtonSilverCircleDownArrow > div > div > div { + position: absolute; + left: 0px; + clip: rect(6px 50px 40px 0px); +} +.mblDomButtonSilverCircleDownArrow > div > div > div > div { + position: absolute; + top: -5px; + left: 1px; + width: 18px; + height: 18px; + margin: 0px; + font-size: 1px; + background-color: #D1D1D1; + border-top: 1px solid #4A5A71; + -webkit-transform: scaleX(0.7) rotate(45deg); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGrayButton-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGrayButton-compat.css new file mode 100644 index 0000000..dc3c7ca --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGrayButton-compat.css @@ -0,0 +1,8 @@ +/* === Silver Circle Gray Button ==*/ +.mblDomButtonSilverCircleGrayButton { + background-image: url(compat/mblDomButtonSilverCircleGrayButton.png); + background-repeat: no-repeat; +} +.mblDomButtonSilverCircleGrayButton > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGrayButton.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGrayButton.css new file mode 100644 index 0000000..0769c27 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGrayButton.css @@ -0,0 +1,27 @@ +/* === Silver Circle Gray Button ==*/ +.mblDomButtonSilverCircleGrayButton { + position: relative; + width: 30px; + height: 30px; +} +.mblDomButtonSilverCircleGrayButton > div { + position: relative; + top: 0px; + left: 0px; + width: 26px; + height: 26px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 13px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); + background: -webkit-gradient(linear, left top, left bottom, from(#EFEFEF), to(#C2C2C2)); +} +.mblDomButtonSilverCircleGrayButton > div > div { + position: relative; + top: 6px; + left: 6px; + width: 12px; + height: 12px; + border: 1px inset #AEAEAE; + -webkit-border-radius: 7px; + background: -webkit-gradient(linear, left top, left bottom, from(#D4D4D4), to(#BABABA)); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenButton-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenButton-compat.css new file mode 100644 index 0000000..df9e2a5 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenButton-compat.css @@ -0,0 +1,8 @@ +/* === Silver Circle Green Button ==*/ +.mblDomButtonSilverCircleGreenButton { + background-image: url(compat/mblDomButtonSilverCircleGreenButton.png); + background-repeat: no-repeat; +} +.mblDomButtonSilverCircleGreenButton > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenButton.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenButton.css new file mode 100644 index 0000000..2b59042 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenButton.css @@ -0,0 +1,27 @@ +/* === Silver Circle Green Button ==*/ +.mblDomButtonSilverCircleGreenButton { + position: relative; + width: 30px; + height: 30px; +} +.mblDomButtonSilverCircleGreenButton > div { + position: relative; + top: 0px; + left: 0px; + width: 26px; + height: 26px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 13px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); + background: -webkit-gradient(linear, left top, left bottom, from(#EFEFEF), to(#C2C2C2)); +} +.mblDomButtonSilverCircleGreenButton > div > div { + position: relative; + top: 6px; + left: 6px; + width: 12px; + height: 12px; + border: 1px inset #1B991C; + -webkit-border-radius: 7px; + background: -webkit-gradient(radial, center center, 0, center center, 6, from(#17DF25), to(#1BA51C)); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenPlus-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenPlus-compat.css new file mode 100644 index 0000000..d19cc2b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenPlus-compat.css @@ -0,0 +1,8 @@ +/* === Silver Circle Green Plus Button ==*/ +.mblDomButtonSilverCircleGreenPlus { + background-image: url(compat/mblDomButtonSilverCircleGreenPlus.png); + background-repeat: no-repeat; +} +.mblDomButtonSilverCircleGreenPlus > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenPlus.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenPlus.css new file mode 100644 index 0000000..9808e86 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenPlus.css @@ -0,0 +1,37 @@ +/* === Silver Circle Green Plus Button ==*/ +.mblDomButtonSilverCircleGreenPlus { + position: relative; + width: 30px; + height: 30px; +} +.mblDomButtonSilverCircleGreenPlus > div { + position: relative; + top: 0px; + left: 0px; + width: 26px; + height: 26px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 13px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); + background: -webkit-gradient(linear, left top, left bottom, from(#EFEFEF), to(#C2C2C2)); +} +.mblDomButtonSilverCircleGreenPlus > div > div { + position: absolute; + top: 11px; + left: 4px; + width: 18px; + height: 4px; + margin: 0px; + font-size: 1px; + background-color: #17DF25; +} +.mblDomButtonSilverCircleGreenPlus > div > div > div { + position: absolute; + top: -7px; + left: 7px; + width: 4px; + height: 18px; + margin: 0px; + font-size: 1px; + background-color: #17DF25; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleOrangeButton-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleOrangeButton-compat.css new file mode 100644 index 0000000..49eba72 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleOrangeButton-compat.css @@ -0,0 +1,8 @@ +/* === Silver Circle Orange Button ==*/ +.mblDomButtonSilverCircleOrangeButton { + background-image: url(compat/mblDomButtonSilverCircleOrangeButton.png); + background-repeat: no-repeat; +} +.mblDomButtonSilverCircleOrangeButton > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleOrangeButton.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleOrangeButton.css new file mode 100644 index 0000000..160ef4e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleOrangeButton.css @@ -0,0 +1,27 @@ +/* === Silver Circle Orange Button ==*/ +.mblDomButtonSilverCircleOrangeButton { + position: relative; + width: 30px; + height: 30px; +} +.mblDomButtonSilverCircleOrangeButton > div { + position: relative; + top: 0px; + left: 0px; + width: 26px; + height: 26px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 13px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); + background: -webkit-gradient(linear, left top, left bottom, from(#EFEFEF), to(#C2C2C2)); +} +.mblDomButtonSilverCircleOrangeButton > div > div { + position: relative; + top: 6px; + left: 6px; + width: 12px; + height: 12px; + border: 1px inset #CA701A; + -webkit-border-radius: 7px; + background: -webkit-gradient(radial, center center, 0, center center, 6, from(#FF7A07), to(#E66B03)); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleRedCross-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleRedCross-compat.css new file mode 100644 index 0000000..68149e0 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleRedCross-compat.css @@ -0,0 +1,8 @@ +/* === Silver Circle Red Cross Button ==*/ +.mblDomButtonSilverCircleRedCross { + background-image: url(compat/mblDomButtonSilverCircleRedCross.png); + background-repeat: no-repeat; +} +.mblDomButtonSilverCircleRedCross > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleRedCross.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleRedCross.css new file mode 100644 index 0000000..14f4ec3 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleRedCross.css @@ -0,0 +1,38 @@ +/* === Silver Circle Red Cross Button ==*/ +.mblDomButtonSilverCircleRedCross { + position: relative; + width: 30px; + height: 30px; +} +.mblDomButtonSilverCircleRedCross > div { + position: relative; + top: 0px; + left: 0px; + width: 26px; + height: 26px; + border: 1px solid #B5B6B5; + -webkit-border-radius: 13px; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); + background: -webkit-gradient(linear, left top, left bottom, from(#EFEFEF), to(#C2C2C2)); +} +.mblDomButtonSilverCircleRedCross > div > div { + position: absolute; + top: 11px; + left: 4px; + width: 18px; + height: 4px; + margin: 0px; + font-size: 1px; + background-color: #F00E5A; + -webkit-transform: rotate(45deg); +} +.mblDomButtonSilverCircleRedCross > div > div > div { + position: absolute; + top: -7px; + left: 7px; + width: 4px; + height: 18px; + margin: 0px; + font-size: 1px; + background-color: #F00E5A; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonTransparent19.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonTransparent19.css new file mode 100644 index 0000000..3626476 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonTransparent19.css @@ -0,0 +1,6 @@ +/* === Transparent Button ==*/ +.mblDomButtonTransparent19 { + position: relative; + width: 19px; + height: 19px; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonTransparent29.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonTransparent29.css new file mode 100644 index 0000000..3eb4891 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonTransparent29.css @@ -0,0 +1,6 @@ +/* === Transparent Button ==*/ +.mblDomButtonTransparent29 { + position: relative; + width: 29px; + height: 29px; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonTransparent30.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonTransparent30.css new file mode 100644 index 0000000..b95baf7 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonTransparent30.css @@ -0,0 +1,6 @@ +/* === Transparent Button ==*/ +.mblDomButtonTransparent30 { + position: relative; + width: 30px; + height: 30px; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteArrow-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteArrow-compat.css new file mode 100644 index 0000000..39bff59 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteArrow-compat.css @@ -0,0 +1,8 @@ +/* === Arrow Button ==*/ +.mblDomButtonWhiteArrow, .mblDomButtonArrow { + background-image: url(compat/mblDomButtonWhiteArrow.png); + background-repeat: no-repeat; +} +.mblDomButtonWhiteArrow div, .mblDomButtonArrow div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteArrow.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteArrow.css new file mode 100644 index 0000000..9c9e332 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteArrow.css @@ -0,0 +1,18 @@ +/* === Arrow ==*/ +.mblDomButtonWhiteArrow, .mblDomButtonArrow { + position: relative; + width: 20px; + height: 29px; +} +.mblDomButtonWhiteArrow > div, .mblDomButtonArrow > div { + position: absolute; + top: 10px; + left: 6px; + width: 6px; + height: 6px; + font-size: 1px; + -webkit-transform: rotate(45deg); + border-width: 3px 3px 0px 0px; + border-style: solid; + border-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteCheck-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteCheck-compat.css new file mode 100644 index 0000000..892a407 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteCheck-compat.css @@ -0,0 +1,8 @@ +/* === Check Button ==*/ +.mblDomButtonWhiteCheck, .mblDomButtonCheck { + background-image: url(compat/mblDomButtonWhiteCheck.png); + background-repeat: no-repeat; +} +.mblDomButtonWhiteCheck div, .mblDomButtonCheck div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteCheck.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteCheck.css new file mode 100644 index 0000000..1b51a8f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteCheck.css @@ -0,0 +1,18 @@ +/* === Check Button ==*/ +.mblDomButtonWhiteCheck, .mblDomButtonCheck { + position: relative; + width: 20px; + height: 29px; +} +.mblDomButtonWhiteCheck > div, .mblDomButtonCheck > div { + position: absolute; + left: 0px; + top: 8px; + width: 16px; + height: 6px; + font-size: 1px; + -webkit-transform: scaleX(0.7) rotate(135deg); + border-width: 3px 4px 0px 0px; + border-style: solid; + border-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteDownArrow-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteDownArrow-compat.css new file mode 100644 index 0000000..6556323 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteDownArrow-compat.css @@ -0,0 +1,8 @@ +/* === Down Arrow Button ==*/ +.mblDomButtonWhiteDownArrow { + background-image: url(compat/mblDomButtonWhiteDownArrow.png); + background-repeat: no-repeat; +} +.mblDomButtonWhiteDownArrow div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteDownArrow.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteDownArrow.css new file mode 100644 index 0000000..33188b3 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteDownArrow.css @@ -0,0 +1,22 @@ +/* === Down Arrow Button ==*/ +.mblDomButtonWhiteDownArrow { + position: relative; + width: 29px; + height: 29px; +} +.mblDomButtonWhiteDownArrow div { + position: absolute; + left: 0px; + clip: rect(7px 50px 40px 0px); +} +.mblDomButtonWhiteDownArrow > div > div { + top: -10px; + left: 2px; + width: 25px; + height: 25px; + margin: 0px; + font-size: 1px; + background-color: white; + border-top: 1px solid #4A5A71; + -webkit-transform: scaleX(0.6) rotate(45deg); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhitePlus-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhitePlus-compat.css new file mode 100644 index 0000000..24eb9be --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhitePlus-compat.css @@ -0,0 +1,8 @@ +/* === Plus Button ==*/ +.mblDomButtonWhitePlus { + background-image: url(compat/mblDomButtonWhitePlus.png); + background-repeat: no-repeat; +} +.mblDomButtonWhitePlus div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhitePlus.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhitePlus.css new file mode 100644 index 0000000..4de8a89 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhitePlus.css @@ -0,0 +1,28 @@ +/* === Plus Button ==*/ +.mblDomButtonWhitePlus { + position: relative; + width: 29px; + height: 29px; +} +.mblDomButtonWhitePlus > div { /* horiz line */ + position: absolute; + top: 11px; + left: 8px; + width: 13px; + height: 3px; + margin: 0px; + font-size: 1px; + background-color: white; + border-top: 1px solid #4A5A71; +} +.mblDomButtonWhitePlus > div > div { /* vert line */ + position: absolute; + top: -6px; + left: 5px; + width: 3px; + height: 13px; + margin: 0px; + font-size: 1px; + background-color: white; + border-top: 1px solid #4A5A71; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteSearch-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteSearch-compat.css new file mode 100644 index 0000000..b3c927d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteSearch-compat.css @@ -0,0 +1,8 @@ +/* === Search Button ==*/ +.mblDomButtonWhiteSearch { + background-image: url(compat/mblDomButtonWhiteSearch.png); + background-repeat: no-repeat; +} +.mblDomButtonWhiteSearch div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteSearch.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteSearch.css new file mode 100644 index 0000000..d8efeeb --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteSearch.css @@ -0,0 +1,30 @@ +/* === Search Button ==*/ +.mblDomButtonWhiteSearch { + position: relative; + width: 29px; + height: 29px; +} +.mblDomButtonWhiteSearch > div { + position: absolute; + top: 5px; + left: 6px; + width: 10px; + height: 10px; + margin: 0px; + font-size: 1px; + border: 2px solid white; + -webkit-border-radius: 6px; +} +.mblDomButtonWhiteSearch > div > div { + position: absolute; + top: 10px; + left: 7px; + width: 8px; + height: 3px; + margin: 0px; + font-size: 1px; + background-color: white; + border: none; + -webkit-transform: rotate(45deg); + -webkit-border-radius: 0px; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteUpArrow-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteUpArrow-compat.css new file mode 100644 index 0000000..49ecb67 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteUpArrow-compat.css @@ -0,0 +1,8 @@ +/* === Up Arrow Button ==*/ +.mblDomButtonWhiteUpArrow { + background-image: url(compat/mblDomButtonWhiteUpArrow.png); + background-repeat: no-repeat; +} +.mblDomButtonWhiteUpArrow div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteUpArrow.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteUpArrow.css new file mode 100644 index 0000000..7c7d0da --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonWhiteUpArrow.css @@ -0,0 +1,22 @@ +/* === Up Arrow Button ==*/ +.mblDomButtonWhiteUpArrow { + position: relative; + width: 29px; + height: 29px; +} +.mblDomButtonWhiteUpArrow div { + position: absolute; + left: 0px; + clip: rect(0px 30px 20px 0px); +} +.mblDomButtonWhiteUpArrow > div > div { + top: 9px; + left: 4px; + width: 20px; + height: 20px; + margin: 0px; + font-size: 1px; + background-color: white; + border-top: 1px solid #4A5A71; + -webkit-transform: scaleX(0.6) rotate(45deg); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonYellowStar-compat.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonYellowStar-compat.css new file mode 100644 index 0000000..08dd2c4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonYellowStar-compat.css @@ -0,0 +1,8 @@ +/* === Yellow Star ==*/ +.mblDomButtonYellowStar { + background-image: url(compat/mblDomButtonYellowStar.png); + background-repeat: no-repeat; +} +.mblDomButtonYellowStar > div { + display: none; +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonYellowStar.css b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonYellowStar.css new file mode 100644 index 0000000..96c07ce --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/DomButtonYellowStar.css @@ -0,0 +1,49 @@ +/* === Yellow Star ==*/ +.mblDomButtonYellowStar { + position: relative; + width: 29px; + height: 29px; +} +.mblDomButtonYellowStar > div { + position: absolute; + width: 0px; + height: 0px; + border-style: solid; + border-color: #FFFF00 transparent transparent transparent; + top: 12px; + left: 3px; + border-width: 9px 12px 0px 12px; + -webkit-transform: rotate(0deg); +} +.mblDomButtonYellowStar > div > div { + position: absolute; + width: 24px; + height: 0px; + border-style: solid; + border-color: #CD853F; + border-width: 1px 0px 0px 0px; + top: -10px; + left: -12px; +} +.mblDomButtonYellowStar > div > div > div { + position: absolute; + width: 0px; + height: 0px; + border-style: solid; + border-color: #FFFF00 transparent transparent transparent; + top: 0px; + left: 0px; + border-width: 9px 12px 0px 12px; + -webkit-transform: rotate(72deg); +} +.mblDomButtonYellowStar > div > div > div > div { + position: absolute; + width: 0px; + height: 0px; + border-style: solid; + border-color: #FFFF00 transparent transparent transparent; + top: -10px; + left: -12px; + border-width: 9px 12px 0px 12px; + -webkit-transform: rotate(216deg); +} diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonArrow.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonArrow.png Binary files differnew file mode 100644 index 0000000..edc1165 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonArrow.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlackCircleCross.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlackCircleCross.png Binary files differnew file mode 100644 index 0000000..2fde47f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlackCircleCross.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueBall.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueBall.png Binary files differnew file mode 100644 index 0000000..fc4d734 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueBall.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueCircleArrow.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueCircleArrow.png Binary files differnew file mode 100644 index 0000000..04526cc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueCircleArrow.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueCircleMinus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueCircleMinus.png Binary files differnew file mode 100644 index 0000000..2fa7350 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueCircleMinus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueCirclePlus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueCirclePlus.png Binary files differnew file mode 100644 index 0000000..670839f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueCirclePlus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueMinus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueMinus.png Binary files differnew file mode 100644 index 0000000..5479d9a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueMinus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBluePlus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBluePlus.png Binary files differnew file mode 100644 index 0000000..a916f9c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBluePlus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonCheck.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonCheck.png Binary files differnew file mode 100644 index 0000000..0ba6933 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonCheck.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonCheckboxOff.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonCheckboxOff.png Binary files differnew file mode 100644 index 0000000..fa7df3e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonCheckboxOff.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonCheckboxOn.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonCheckboxOn.png Binary files differnew file mode 100644 index 0000000..2cec24f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonCheckboxOn.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonDarkBlueCheck.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonDarkBlueCheck.png Binary files differnew file mode 100644 index 0000000..0ba6933 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonDarkBlueCheck.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonDarkBlueMinus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonDarkBlueMinus.png Binary files differnew file mode 100644 index 0000000..1d7f918 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonDarkBlueMinus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonDarkBluePlus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonDarkBluePlus.png Binary files differnew file mode 100644 index 0000000..465dc1e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonDarkBluePlus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGrayArrow.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGrayArrow.png Binary files differnew file mode 100644 index 0000000..edc1165 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGrayArrow.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGrayStar.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGrayStar.png Binary files differnew file mode 100644 index 0000000..68d62c0 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGrayStar.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenBall.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenBall.png Binary files differnew file mode 100644 index 0000000..5a46c60 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenBall.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenCircleArrow.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenCircleArrow.png Binary files differnew file mode 100644 index 0000000..27dbfb6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenCircleArrow.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenCircleMinus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenCircleMinus.png Binary files differnew file mode 100644 index 0000000..a26de02 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenCircleMinus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenCirclePlus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenCirclePlus.png Binary files differnew file mode 100644 index 0000000..3a5959e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenCirclePlus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonOrangeBall.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonOrangeBall.png Binary files differnew file mode 100644 index 0000000..420428a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonOrangeBall.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedBall.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedBall.png Binary files differnew file mode 100644 index 0000000..aab2da6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedBall.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedCircleArrow.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedCircleArrow.png Binary files differnew file mode 100644 index 0000000..55b0167 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedCircleArrow.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedCircleMinus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedCircleMinus.png Binary files differnew file mode 100644 index 0000000..6171d0f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedCircleMinus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedCirclePlus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedCirclePlus.png Binary files differnew file mode 100644 index 0000000..f68f227 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedCirclePlus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedMinus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedMinus.png Binary files differnew file mode 100644 index 0000000..ab25d93 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedMinus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedPlus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedPlus.png Binary files differnew file mode 100644 index 0000000..61a76fc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedPlus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleDownArrow.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleDownArrow.png Binary files differnew file mode 100644 index 0000000..bb9b377 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleDownArrow.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleGrayButton.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleGrayButton.png Binary files differnew file mode 100644 index 0000000..7081f3f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleGrayButton.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleGreenButton.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleGreenButton.png Binary files differnew file mode 100644 index 0000000..857adac --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleGreenButton.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleGreenPlus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleGreenPlus.png Binary files differnew file mode 100644 index 0000000..a3ef930 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleGreenPlus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleOrangeButton.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleOrangeButton.png Binary files differnew file mode 100644 index 0000000..17d72e0 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleOrangeButton.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleRedCross.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleRedCross.png Binary files differnew file mode 100644 index 0000000..7326243 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleRedCross.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteArrow.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteArrow.png Binary files differnew file mode 100644 index 0000000..484ad60 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteArrow.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteCheck.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteCheck.png Binary files differnew file mode 100644 index 0000000..a18d8b3 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteCheck.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteDownArrow.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteDownArrow.png Binary files differnew file mode 100644 index 0000000..add30b8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteDownArrow.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhitePlus.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhitePlus.png Binary files differnew file mode 100644 index 0000000..4b2a010 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhitePlus.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteSearch.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteSearch.png Binary files differnew file mode 100644 index 0000000..eb806d1 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteSearch.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteUpArrow.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteUpArrow.png Binary files differnew file mode 100644 index 0000000..78c1331 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteUpArrow.png diff --git a/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonYellowStar.png b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonYellowStar.png Binary files differnew file mode 100644 index 0000000..eaa80d9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/domButtons/compat/mblDomButtonYellowStar.png diff --git a/js/dojo/dojox/mobile/themes/common/transitions.css b/js/dojo/dojox/mobile/themes/common/transitions.css new file mode 100644 index 0000000..e3d7a33 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions.css @@ -0,0 +1,11 @@ +@import url("transitions/dissolve.css"); +@import url("transitions/cover.css"); +@import url("transitions/reveal.css"); +@import url("transitions/slidev.css"); +@import url("transitions/coverv.css"); +@import url("transitions/revealv.css"); +@import url("transitions/swirl.css"); +@import url("transitions/scaleOut.css"); +@import url("transitions/scaleIn.css"); +@import url("transitions/zoomOut.css"); +@import url("transitions/zoomIn.css"); diff --git a/js/dojo/dojox/mobile/themes/common/transitions/cover.css b/js/dojo/dojox/mobile/themes/common/transitions/cover.css new file mode 100644 index 0000000..5794f02 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/cover.css @@ -0,0 +1,34 @@ +.mblCover.mblOut { + z-index: -100; + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + -webkit-transform: translate3d(0%,0px,-1px) !important; +} +.mblCover.mblOut.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: .4s; + -webkit-transform: translate3d(0%,0px,0px) !important; +} +.mblCover.mblIn { + z-index: 0; + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + -webkit-transform: translate3d(100%,0px,0px) !important; +} +.mblCover.mblIn.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: .4s; + -webkit-transform: translate3d(0%,0px,0px) !important; +} +.mblCover.mblIn.mblReverse { + -webkit-transform: translate3d(-100%,0px,0px) !important; +} +.mblCover.mblIn.mblReverse.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transform: translate3d(0%,0px,0px) !important; +} +.dj_android.dj_tablet .mblCover.mblOut.mblTransition, +.dj_android.dj_tablet .mblCover.mblIn.mblTransition { + -webkit-transition-duration: .6s; + -webkit-transition-timing-function: linear; +} diff --git a/js/dojo/dojox/mobile/themes/common/transitions/coverv.css b/js/dojo/dojox/mobile/themes/common/transitions/coverv.css new file mode 100644 index 0000000..2c80e16 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/coverv.css @@ -0,0 +1,35 @@ +.mblCoverv.mblOut { + z-index: -100; + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + -webkit-transform: translate3d(0px,0%,-1px) !important; +} +.mblCoverv.mblOut.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: .4s; + -webkit-transform: translate3d(0px,0%,0px) !important; +} +.mblCoverv.mblIn { + z-index: 0; + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + -webkit-transform: translate3d(0px,100%,0px) !important; +} +.mblCoverv.mblIn.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: .4s; + -webkit-transform: translate3d(0px,0%,0px) !important; +} +.mblCoverv.mblIn.mblReverse { + -webkit-transition-property: none; + -webkit-transform: translate3d(0px,-100%,0px) !important; +} +.mblCoverv.mblIn.mblReverse.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transform: translate3d(0px,0%,0px) !important; +} +.dj_android.dj_tablet .mblCoverv.mblOut.mblTransition, +.dj_android.dj_tablet .mblCoverv.mblIn.mblTransition { + -webkit-transition-duration: .6s; + -webkit-transition-timing-function: linear; +} diff --git a/js/dojo/dojox/mobile/themes/common/transitions/dissolve.css b/js/dojo/dojox/mobile/themes/common/transitions/dissolve.css new file mode 100644 index 0000000..4cedc51 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/dissolve.css @@ -0,0 +1,18 @@ +.mblDissolve.mblOut { + -webkit-animation-duration: 1s; + -webkit-animation-name: mblDissolveOut; + -webkit-animation-timing-function: cubic-bezier(.25,1,.75,0); +} +.mblDissolve.mblIn { + -webkit-animation-duration: 1s; + -webkit-animation-name: mblDissolveIn; + -webkit-animation-timing-function: cubic-bezier(.25,1,.75,0); +} +@-webkit-keyframes mblDissolveOut { + from { opacity: 1; } + to { opacity: 0; } +} +@-webkit-keyframes mblDissolveIn { + from { opacity: 0; } + to { opacity: 1; } +}
\ No newline at end of file diff --git a/js/dojo/dojox/mobile/themes/common/transitions/fade.css b/js/dojo/dojox/mobile/themes/common/transitions/fade.css new file mode 100644 index 0000000..889231d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/fade.css @@ -0,0 +1,22 @@ +.mblFade.mblOut { + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + opacity: 1; +} +.mblFade.mblOut.mblTransition { + -webkit-transition-property: opacity; + -webkit-transition-duration: .6s; + -webkit-transition-timing-function: ease-out; + opacity: 0; +} +.mblFade.mblIn { + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + opacity: 0; +} +.mblFade.mblIn.mblTransition { + -webkit-transition-property: opacity; + -webkit-transition-duration: .6s; + -webkit-transition-timing-function: ease-in; + opacity: 1; +}
\ No newline at end of file diff --git a/js/dojo/dojox/mobile/themes/common/transitions/flip.css b/js/dojo/dojox/mobile/themes/common/transitions/flip.css new file mode 100644 index 0000000..0617361 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/flip.css @@ -0,0 +1,35 @@ +.mblFlip.mblOut { + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + opacity: 1; + -webkit-transform: scale(1,1) skew(0,0) !important; +} +.mblFlip.mblOut.mblTransition { + -webkit-transition-property: all; + -webkit-transition-duration: .2s; + -webkit-transition-timing-function: linear; + opacity: 0; + -webkit-transform: scale(0,0.8) skew(0,30deg) !important; +} +.mblFlip.mblIn { + position: absolute; + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + opacity: 0; + -webkit-transform: scale(0,0.8) skew(0,-30deg) !important; +} +.mblFlip.mblIn.mblTransition { + -webkit-transition-property: all; + -webkit-transition-delay: .2s; + -webkit-transition-duration: .2s; + -webkit-transition-timing-function: linear; + opacity: 1; + -webkit-transform: scale(1,1) skew(0,0) !important; +} +.dj_android.dj_tablet .mblFlip.mblOut.mblTransition { + -webkit-transition-duration: .4s; +} +.dj_android.dj_tablet .mblFlip.mblIn.mblTransition { + -webkit-transition-delay: .4s; + -webkit-transition-duration: .4s; +} diff --git a/js/dojo/dojox/mobile/themes/common/transitions/reveal.css b/js/dojo/dojox/mobile/themes/common/transitions/reveal.css new file mode 100644 index 0000000..b711984 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/reveal.css @@ -0,0 +1,35 @@ +.mblReveal.mblOut { + z-index: 0; + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + -webkit-transform: translate3d(0%,0px,0px) !important; +} +.mblReveal.mblOut.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: .4s; + -webkit-transform: translate3d(-100%,0px,0px) !important; +} +.mblReveal.mblIn { + z-index: -100; + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + -webkit-transform: translate3d(0%,0px,-1px) !important; +} +.mblReveal.mblIn.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: .4s; + -webkit-transform: translate3d(0%,0px,0px) !important; +} +.mblReveal.mblOut.mblReverse { + -webkit-transition-property: none; + -webkit-transform: translate3d(0%,0px,0px) !important; +} +.mblReveal.mblOut.mblReverse.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transform: translate3d(100%,0px,0px) !important; +} +.dj_android.dj_tablet .mblReveal.mblOut.mblTransition, +.dj_android.dj_tablet .mblReveal.mblIn.mblTransition { + -webkit-transition-duration: .6s; + -webkit-transition-timing-function: linear; +} diff --git a/js/dojo/dojox/mobile/themes/common/transitions/revealv.css b/js/dojo/dojox/mobile/themes/common/transitions/revealv.css new file mode 100644 index 0000000..3c74d46 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/revealv.css @@ -0,0 +1,31 @@ +.mblRevealv.mblOut { + z-index: 0; + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + -webkit-transform: translate3d(0px,0%,0px) !important; +} +.mblRevealv.mblOut.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: .4s; + -webkit-transform: translate3d(0px,-100%,0px) !important; +} +.mblRevealv.mblIn { + z-index: -100; + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + -webkit-transform: translate3d(0px,0%,-1px) !important; +} +.mblRevealv.mblIn.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: .4s; + -webkit-transform: translate3d(0px,0%,0px) !important; +} +.mblRevealv.mblOut.mblReverse.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transform: translate3d(0px,100%,0px) !important; +} +.dj_android.dj_tablet .mblRevealv.mblOut.mblTransition, +.dj_android.dj_tablet .mblRevealv.mblIn.mblTransition { + -webkit-transition-duration: .6s; + -webkit-transition-timing-function: linear; +} diff --git a/js/dojo/dojox/mobile/themes/common/transitions/scaleIn.css b/js/dojo/dojox/mobile/themes/common/transitions/scaleIn.css new file mode 100644 index 0000000..64e136c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/scaleIn.css @@ -0,0 +1,33 @@ +.mblScaleIn.mblOut { + z-index: -100; + -webkit-animation-duration: .5s; + -webkit-animation-name: mblScaleInOut; + -webkit-animation-timing-function: ease-out; +} +.mblScaleIn.mblIn { + z-index: 0; + -webkit-animation-duration: .5s; + -webkit-animation-name: mblScaleInIn; + -webkit-animation-timing-function: ease-out; +} +.dj_android .mblScaleIn.mblIn { + -webkit-animation-name: mblScaleInInAndroid; +} +@-webkit-keyframes mblScaleInOut { + from { -webkit-transform: scale(1.0); } + to { -webkit-transform: scale(1.0); } +} +@-webkit-keyframes mblScaleInIn { + from { + -webkit-transform: scale(0.0); + opacity: 0; + } + to { + -webkit-transform: scale(1.0); + opacity: 1; + } +} +@-webkit-keyframes mblScaleInInAndroid { + from { -webkit-transform: scale(0.0); } + to { -webkit-transform: scale(1.0); } +} diff --git a/js/dojo/dojox/mobile/themes/common/transitions/scaleOut.css b/js/dojo/dojox/mobile/themes/common/transitions/scaleOut.css new file mode 100644 index 0000000..d2f16e8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/scaleOut.css @@ -0,0 +1,33 @@ +.mblScaleOut.mblOut { + z-index: 0; + -webkit-animation-duration: .5s; + -webkit-animation-name: mblScaleOutOut; + -webkit-animation-timing-function: ease-in; +} +.dj_android .mblScaleOut.mblOut { + -webkit-animation-name: mblScaleOutOutAndroid; +} +.mblScaleOut.mblIn { + z-index: -100; + -webkit-animation-duration: .5s; + -webkit-animation-name: mblScaleOutIn; + -webkit-animation-timing-function: ease-in; +} +@-webkit-keyframes mblScaleOutOut { + from { + -webkit-transform: scale(1.0); + opacity: 1; + } + to { + -webkit-transform: scale(0.0); + opacity: 0; + } +} +@-webkit-keyframes mblScaleOutOutAndroid { + from { -webkit-transform: scale(1.0); } + to { -webkit-transform: scale(0.0); } +} +@-webkit-keyframes mblScaleOutIn { + from { -webkit-transform: scale(1.0); } + to { -webkit-transform: scale(1.0); } +} diff --git a/js/dojo/dojox/mobile/themes/common/transitions/slide.css b/js/dojo/dojox/mobile/themes/common/transitions/slide.css new file mode 100644 index 0000000..cd6b02e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/slide.css @@ -0,0 +1,41 @@ +.mblSlide.mblOut { + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + -webkit-transform: translate3d(0%,0px,0px) !important; +} +.mblSlide.mblOut.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: .3s; + -webkit-transform: translate3d(-100%,0px,0px) !important; +} +.mblSlide.mblIn { + position: absolute !important; + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + -webkit-transform: translate3d(100%,0px,0px) !important; +} +.mblSlide.mblIn.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: .3s; + -webkit-transform: translate3d(0%,0px,0px) !important; +} +.mblSlide.mblOut.mblReverse { + -webkit-transition-property: none; + -webkit-transform: translate3d(0%,0px,0px) !important; +} +.mblSlide.mblOut.mblReverse.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transform: translate3d(100%,0px,0px) !important; +} +.mblSlide.mblIn.mblReverse { + -webkit-transform: translate3d(-100%,0px,0px) !important; +} +.mblSlide.mblIn.mblReverse.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transform: translate3d(0%,0px,0px) !important; +} +.dj_android.dj_tablet .mblSlide.mblOut.mblTransition, +.dj_android.dj_tablet .mblSlide.mblIn.mblTransition { + -webkit-transition-duration: .6s; + -webkit-transition-timing-function: linear; +} diff --git a/js/dojo/dojox/mobile/themes/common/transitions/slidev.css b/js/dojo/dojox/mobile/themes/common/transitions/slidev.css new file mode 100644 index 0000000..0f6a816 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/slidev.css @@ -0,0 +1,42 @@ +.mblSlidev.mblOut { + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + -webkit-transform: translate3d(0px,0%,0px) !important; +} +.mblSlidev.mblOut.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: .3s; + -webkit-transform: translate3d(0px,-100%,0px) !important; +} +.mblSlidev.mblIn { + position: absolute !important; + -webkit-transition-property: none; + -webkit-transition-duration: 0s; + -webkit-transform: translate3d(0px,100%,0px) !important; +} +.mblSlidev.mblIn.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: .3s; + -webkit-transform: translate3d(0px,0%,0px) !important; +} +.mblSlidev.mblOut.mblReverse { + -webkit-transition-property: none; + -webkit-transform: translate3d(0px,0%,0px) !important; +} +.mblSlidev.mblOut.mblReverse.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transform: translate3d(0px,100%,0px) !important; +} +.mblSlidev.mblIn.mblReverse { + -webkit-transform: translate3d(0px,-100%,0px) !important; +} +.mblSlidev.mblIn.mblReverse.mblTransition { + -webkit-transition-property: -webkit-transform; + -webkit-transform: translate3d(0px,0%,0px) !important; +} +.dj_android.dj_tablet .mblSlidev.mblOut.mblTransition, +.dj_android.dj_tablet .mblSlidev.mblIn.mblTransition { + -webkit-transition-duration: .6s; + -webkit-transition-timing-function: linear; +} + diff --git a/js/dojo/dojox/mobile/themes/common/transitions/swirl.css b/js/dojo/dojox/mobile/themes/common/transitions/swirl.css new file mode 100644 index 0000000..529a931 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/swirl.css @@ -0,0 +1,27 @@ +.mblSwirl.mblOut { + z-index: 0; + -webkit-animation-duration: .5s; + -webkit-animation-name: mblSwirlOut; + -webkit-animation-timing-function: ease-in; +} +.mblSwirl.mblIn { + z-index: -100; + -webkit-animation-duration: .5s; + -webkit-animation-name: mblSwirlIn; + -webkit-animation-timing-function: ease-in; +} +.mblSwirl.mblOut.mblReverse { + -webkit-animation-name: mblSwirlOutReverse; +} +@-webkit-keyframes mblSwirlOut { + from { -webkit-transform: rotate(0deg) scale(1.0); } + to { -webkit-transform: rotate(-360deg) scale(0.0); } +} +@-webkit-keyframes mblSwirlOutReverse { + from { -webkit-transform: rotate(0deg) scale(1.0); } + to { -webkit-transform: rotate(360deg) scale(0.0); } +} +@-webkit-keyframes mblSwirlIn { + from { -webkit-transform: scale(1.0); } + to { -webkit-transform: scale(1.0); } +} diff --git a/js/dojo/dojox/mobile/themes/common/transitions/zoomIn.css b/js/dojo/dojox/mobile/themes/common/transitions/zoomIn.css new file mode 100644 index 0000000..4ed7eca --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/zoomIn.css @@ -0,0 +1,33 @@ +.mblZoomIn.mblOut { + z-index: -100; + -webkit-animation-duration: .5s; + -webkit-animation-name: mblZoomInOut; + -webkit-animation-timing-function: ease-out; +} +.mblZoomIn.mblIn { + z-index: 0; + -webkit-animation-duration: .5s; + -webkit-animation-name: mblZoomInIn; + -webkit-animation-timing-function: ease-out; +} +.dj_android .mblZoomIn.mblIn { + -webkit-animation-name: mblZoomInInAndroid; +} +@-webkit-keyframes mblZoomInOut { + from { -webkit-transform: scale(1.0); } + to { -webkit-transform: scale(1.0); } +} +@-webkit-keyframes mblZoomInIn { + from { + -webkit-transform: scale(0.0); + opacity: 0; + } + to { + -webkit-transform: scale(1.0); + opacity: 1; + } +} +@-webkit-keyframes mblZoomInInAndroid { + from { -webkit-transform: scale(0.0); } + to { -webkit-transform: scale(1.0); } +} diff --git a/js/dojo/dojox/mobile/themes/common/transitions/zoomOut.css b/js/dojo/dojox/mobile/themes/common/transitions/zoomOut.css new file mode 100644 index 0000000..8a292d4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/common/transitions/zoomOut.css @@ -0,0 +1,33 @@ +.mblZoomOut.mblOut { + z-index: 0; + -webkit-animation-duration: .5s; + -webkit-animation-name: mblZoomOutOut; + -webkit-animation-timing-function: ease-in; +} +.dj_android .mblZoomOut.mblOut { + -webkit-animation-name: mblZoomOutOutAndroid; +} +.mblZoomOut.mblIn { + z-index: -100; + -webkit-animation-duration: .5s; + -webkit-animation-name: mblZoomOutIn; + -webkit-animation-timing-function: ease-in; +} +@-webkit-keyframes mblZoomOutOut { + from { + -webkit-transform: scale(1.0); + opacity: 1; + } + to { + -webkit-transform: scale(0.0); + opacity: 0; + } +} +@-webkit-keyframes mblZoomOutOutAndroid { + from { -webkit-transform: scale(1.0); } + to { -webkit-transform: scale(0.0); } +} +@-webkit-keyframes mblZoomOutIn { + from { -webkit-transform: scale(1.0); } + to { -webkit-transform: scale(1.0); } +} diff --git a/js/dojo/dojox/mobile/themes/custom/Button-compat.css b/js/dojo/dojox/mobile/themes/custom/Button-compat.css new file mode 100644 index 0000000..32cc119 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Button-compat.css @@ -0,0 +1,8 @@ +/* dojox.mobile.Button */ +.mblButton { + background-image: url(compat/ui-widget-bg.png); + -moz-border-radius: 5px; + -o-border-radius: 5px; + -ms-border-radius: 5px; + border-radius: 5px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/Button.css b/js/dojo/dojox/mobile/themes/custom/Button.css new file mode 100644 index 0000000..92d7b63 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Button.css @@ -0,0 +1,48 @@ +/* dojox.mobile.Button */ +.mblButton { + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + padding: 0 8px; + height: 30px; + border: 1px outset #b5bcc7; + color: #131313; + font-size: 14px; + font-family: Helvetica; + font-weight: normal; + line-height: 30px; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); + -webkit-border-radius: 2px; +} +.mblButton.mblBlueButton { + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + color: #131313; + background-color: #0000FF; +} +.mblButton.mblBlueButtonSelected { + color: #000000; + border-color: #769dc0; + background-color: #000066; +} +.mblButton.mblRedButton { + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + color: #131313; + background-color: #FF0000; +} +.mblButton.mblRedButtonSelected { + color: #000000; + border-color: #769dc0; + background-color: #660000; +} +.mblButtonSelected { + color: #000000; + border-color: #769dc0; + background-color: #0064c2; +} +.mblButtonDisabled, .mblButton:disabled { + cursor: default; + color: grey; + border-color: grey; + background-color: #8fc9ff; +} diff --git a/js/dojo/dojox/mobile/themes/custom/Button.less b/js/dojo/dojox/mobile/themes/custom/Button.less new file mode 100644 index 0000000..ab3a96c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Button.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Button.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/Carousel.css b/js/dojo/dojox/mobile/themes/custom/Carousel.css new file mode 100644 index 0000000..a415950 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Carousel.css @@ -0,0 +1,60 @@ +/* dojox.mobile.Carousel */ +.mblCarousel { + overflow: hidden; +} +.mblCarouselBox { + position: relative; + float: left; +} +.mblCarouselImg { + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5); + vertical-align: bottom; +} +.mblCarouselImgSelected { + border: 1px dashed #C0C0C0; + -webkit-box-shadow: none; +} +.mblCarouselImgHeaderText { + color: white; + font: 14px arial, helvetica, clean, sans-serif; +} +.mblCarouselImgFooterText { + color: white; + font: 14px arial, helvetica, clean, sans-serif; +} +.mblCarouselHeaderBar { + background-color: #3A3A3B; + color: #B1B1B1; + font: bold 16px arial, helvetica, clean, sans-serif; + padding: 1px; +} +.mblCarouselBtnContainer { + float: right; +} +.mblCarouselBtn { + height: 18px; + width: 46px; + font: bold 14px arial, helvetica, clean, sans-serif; + color: gray; + padding-top: 0px; + margin: 0px 2px; + border-width: 1px; + /* workaround for android problem */ + +} +.mblCarouselTitle { + margin: 2px 0px 2px 4px; +} +.mblCarouselHeaderBar .mblPageIndicator { + float: right; + width: auto; + padding: 0px 20px; +} +.mblCarouselHeaderBar .mblPageIndicatorContainer { + margin-left: 0px; + margin-right: 0px; +} +.mblCarouselPages { + position: relative; + text-align: center; +} diff --git a/js/dojo/dojox/mobile/themes/custom/Carousel.less b/js/dojo/dojox/mobile/themes/custom/Carousel.less new file mode 100644 index 0000000..d717397 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Carousel.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Carousel.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/CheckBox-compat.css b/js/dojo/dojox/mobile/themes/custom/CheckBox-compat.css new file mode 100644 index 0000000..7545638 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/CheckBox-compat.css @@ -0,0 +1,26 @@ +/* dojox.mobile.CheckBox */ +.mblCheckBox { + background-image: url(compat/ui-widget-bg.png); + -moz-border-radius: 5px; + -o-border-radius: 5px; + -ms-border-radius: 5px; + border-radius: 5px; + -moz-appearance: none; + -o-appearance: none; + -ms-appearance: none; + appearance: none; + -o-transform: translateY(0.45em); + -ms-transform: translateY(0.45em); + transform: translateY(0.45em); +} +.mblCheckBoxChecked::after, +.mblCheckBox:checked::after { + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; +} diff --git a/js/dojo/dojox/mobile/themes/custom/CheckBox.css b/js/dojo/dojox/mobile/themes/custom/CheckBox.css new file mode 100644 index 0000000..1891ba5 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/CheckBox.css @@ -0,0 +1,45 @@ +/* dojox.mobile.CheckBox */ +.mblCheckBox { + position: relative; + cursor: pointer; + outline: none; + -webkit-appearance: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + font-size: 18px; + border: 1px outset #b5bcc7; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); + -webkit-border-radius: 2px; + -webkit-transform: translatey(0.45em); +} +.mblCheckBoxSelected { + border-color: #769dc0; + background-color: #0064c2; +} +.mblCheckBoxChecked, .mblCheckBox:checked { + border-color: #769dc0; + background-color: #007ef5; +} +.mblCheckBoxChecked::after, .mblCheckBox:checked::after { + content: ""; + width: 0.3em; + height: 0.6em; + position: absolute; + top: 0; + left: 0.3em; + border-color: #000000; + border-width: 0.15em; + border-style: none solid solid none; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblCheckBoxChecked.mblCheckBoxSelected, .mblCheckBox:checked.mblCheckBoxSelected { + border-color: #769dc0; + background-color: #0064c2; +} +.mblCheckBoxChecked.mblCheckBoxSelected::after, .mblCheckBox:checked.mblCheckBoxSelected::after { + border-color: #000000; +} diff --git a/js/dojo/dojox/mobile/themes/custom/CheckBox.less b/js/dojo/dojox/mobile/themes/custom/CheckBox.less new file mode 100644 index 0000000..09f93b2 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/CheckBox.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/CheckBox.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/ComboBox-compat.css b/js/dojo/dojox/mobile/themes/custom/ComboBox-compat.css new file mode 100644 index 0000000..09c7b38 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ComboBox-compat.css @@ -0,0 +1,7 @@ +/* dojox.mobile.ComboBox */ +.dijitPopup { + -moz-box-shadow: 0px 0px 50px black; + -o-box-shadow: 0px 0px 50px black; + -ms-box-shadow: 0px 0px 50px black; + box-shadow: 0px 0px 50px black; +}
\ No newline at end of file diff --git a/js/dojo/dojox/mobile/themes/custom/ComboBox.css b/js/dojo/dojox/mobile/themes/custom/ComboBox.css new file mode 100644 index 0000000..4247da7 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ComboBox.css @@ -0,0 +1,44 @@ +/* dojox.mobile.ComboBox */ +.dijitPopup { + margin: 0; + padding: 0; + position: absolute; + border: 0; + background-color: transparent; + -webkit-box-shadow: 0px 0px 50px black; + -webkit-border-radius: 5px; +} +.mblReset { + margin: 0; + padding: 0; + border: 0; + line-height: normal; + font: inherit; + color: inherit; +} +.mblComboBoxMenu { + overflow-y: hidden !important; + position: relative; + overflow: hidden; + border: 1px solid black; + background-color: #eff1f3; + -webkit-border-radius: 5px; +} +.mblComboBoxMenuItem { + white-space: nowrap; + text-align: left; + padding: .1em .2em; + color: #131313; + border-width: 1px 0 1px 0; + border-style: solid; + border-color: #eff1f3; +} +.mblComboBoxMenuItemSelected { + color: #000000; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); +} +.mblComboBoxMenuPreviousButton, .mblComboBoxMenuNextButton { + font-style: italic; + overflow: hidden; +} diff --git a/js/dojo/dojox/mobile/themes/custom/ComboBox.less b/js/dojo/dojox/mobile/themes/custom/ComboBox.less new file mode 100644 index 0000000..ab9458c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ComboBox.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ComboBox.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeCategory-compat.css b/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeCategory-compat.css new file mode 100644 index 0000000..f62bc07 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeCategory-compat.css @@ -0,0 +1,4 @@ +/* dojox.mobile.EdgeToEdgeCategory */ +.mblEdgeToEdgeCategory { + background-image: url(compat/heading-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeCategory.css b/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeCategory.css new file mode 100644 index 0000000..289511f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeCategory.css @@ -0,0 +1,19 @@ +/* dojox.mobile.EdgeToEdgeCategory */ +.mblEdgeToEdgeCategory { + position: relative; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin: 0; + padding: 0 8px; + height: 30px; + border-bottom: 1px solid #b5bcc7; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(2.5%, #ffffff), color-stop(2.5%, rgba(255, 255, 255, 0.14)), color-stop(5%, rgba(255, 255, 255, 0.14)), color-stop(5%, rgba(255, 255, 255, 0.52)), color-stop(7.5%, rgba(255, 255, 255, 0.52)), color-stop(7.5%, rgba(255, 255, 255, 0.68)), color-stop(10%, rgba(255, 255, 255, 0.68)), color-stop(1, rgba(255, 255, 255, 0))); + font-size: 18px; + font-family: Helvetica; + font-weight: normal; + text-shadow: rgba(0, 0, 0, 0.2) 0px 1px 2px; + color: #000000; + line-height: 32px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeCategory.less b/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeCategory.less new file mode 100644 index 0000000..3bb63da --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeCategory.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/EdgeToEdgeCategory.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeList.css b/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeList.css new file mode 100644 index 0000000..9ea0ea4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeList.css @@ -0,0 +1,12 @@ +/* dojox.mobile.EdgeToEdgeList */ +.mblEdgeToEdgeList { + position: relative; + /* IE needs this */ + + margin: 0; + padding: 0; + background-color: #ffffff; +} +.mblEdgeToEdgeList .mblListItem:last-child { + border-bottom-color: #b5bcc7; +} diff --git a/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeList.less b/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeList.less new file mode 100644 index 0000000..227627c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/EdgeToEdgeList.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/EdgeToEdgeList.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/Heading-compat.css b/js/dojo/dojox/mobile/themes/custom/Heading-compat.css new file mode 100644 index 0000000..74befb9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Heading-compat.css @@ -0,0 +1,47 @@ +/* mbl.widget.Heading */ +.mblHeading { + background-image: url(compat/heading-bg.png); +} +.mblHeadingSpanTitle { + white-space: normal; +} + +/* Heading Arrow Button */ +.mblArrowButtonHead { + background-image: url(compat/ui-widget-bg.png); + -moz-transform-origin: left top; + -o-transform-origin: left top; + -ms-transform-origin: left top; + transform-origin: left top; + -moz-transform: scale(0.9, 0.99) rotate(45deg); + -o-transform: scale(0.9, 0.99) rotate(45deg); + -ms-transform: scale(0.9, 0.99) rotate(45deg); + transform: scale(0.9, 0.99) rotate(45deg); + left: 1px\9; /* IE7/8 hack */ + _left: 9px; /* IE6 hack */ + height: 32px\9; /* IE6/7/8 hack */ + border-width: 0\9; /* IE6/7/8 hack */ + background-image: url(compat/arrow-button-head.png)\9; /* IE6/7/8 hack */ +} +.mblArrowButtonHead:not(:target) { /* IE9 hack */ + background-image: url(compat/ui-widget-bg.png)\9; + left: 17px\9; + height: 21px\9; + border-width: 1px\9; +} +.mblArrowButtonBody { + -moz-border-radius-topright: 2px; + -moz-border-radius-bottomright: 2px; + -o-border-top-right-radius: 2px; + -o-border-bottom-right-radius: 2px; + -ms-border-top-right-radius: 2px; + -ms-border-bottom-right-radius: 2px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + background-image: url(compat/ui-widget-bg.png); +} +*html .mblArrowButtonBody { /* IE6 hack */ + padding: 0px 10px 0px 3px; + top: 0px; + left: 17px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/Heading.css b/js/dojo/dojox/mobile/themes/custom/Heading.css new file mode 100644 index 0000000..86bd3b4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Heading.css @@ -0,0 +1,85 @@ +/* dojox.mobile.Heading */ +.mblHeading { + position: relative; + margin: 0px; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + z-index: 1; + padding: 0; + height: 40px; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(2.5%, #ffffff), color-stop(2.5%, rgba(255, 255, 255, 0.14)), color-stop(5%, rgba(255, 255, 255, 0.14)), color-stop(5%, rgba(255, 255, 255, 0.52)), color-stop(7.5%, rgba(255, 255, 255, 0.52)), color-stop(7.5%, rgba(255, 255, 255, 0.68)), color-stop(10%, rgba(255, 255, 255, 0.68)), color-stop(1, rgba(255, 255, 255, 0))); + border-bottom: 1px solid #769dc0; + color: #131313; + font-size: 18px; + font-family: Helvetica; + font-weight: normal; + text-shadow: rgba(0, 0, 0, 0.2) 0px 1px 2px; + text-align: center; + line-height: 42px; +} +.mblHeading * { + z-index: 2; +} +.mblHeadingDivTitle { + position: absolute; + width: 100%; + display: none; + left: 0px; + z-index: 1; +} +.mblHeadingCenterTitle .mblHeadingDivTitle { + display: block; +} +.mblHeadingCenterTitle .mblHeadingSpanTitle { + display: none; +} +/* Heading Arrow Button */ +.mblArrowButton { + position: relative; + float: left; + height: 30px; + margin: 0px 8px; +} +.mblArrowButtonHead { + position: absolute; + top: 5px; + left: 17px; + width: 21px; + height: 21px; + border: 1px solid #b5bcc7; + -webkit-transform-origin: left top; + -webkit-transform: scale(0.9, 0.99) rotate(45deg); + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, right bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); +} +.dj_chrome .mblArrowButtonHead { + border-style: inset; +} +.mblArrowButtonBody { + position: absolute; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + top: 5px; + left: 17px; + padding: 0px 10px 0px 3px; + height: 30px; + border-width: 1px 1px 1px 0px; + border-style: inset; + border-color: #b5bcc7; + font-size: 14px; + font-family: Helvetica; + font-weight: normal; + text-shadow: none; + color: #131313; + line-height: 30px; + -webkit-border-top-right-radius: 2px; + -webkit-border-bottom-right-radius: 2px; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); +} +.mblArrowButtonSelected .mblArrowButtonHead, .mblArrowButtonSelected .mblArrowButtonBody { + background-color: #0064c2; +} diff --git a/js/dojo/dojox/mobile/themes/custom/Heading.less b/js/dojo/dojox/mobile/themes/custom/Heading.less new file mode 100644 index 0000000..cfc8580 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Heading.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Heading.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/IconContainer-compat.css b/js/dojo/dojox/mobile/themes/custom/IconContainer-compat.css new file mode 100644 index 0000000..78efb95 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/IconContainer-compat.css @@ -0,0 +1,11 @@ +@import url("../common/domButtons/DomButtonColorButtons-compat.css"); + +/* dojox.mobile.IconItem */ +.mblIconArea div { + *font-size: 60px; /* IE 7 quirks */ +} + +/* Icon Content Heading */ +.mblIconContentHeading { + background-image: url(compat/heading-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/custom/IconContainer.css b/js/dojo/dojox/mobile/themes/custom/IconContainer.css new file mode 100644 index 0000000..457a86a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/IconContainer.css @@ -0,0 +1,101 @@ +@import url("../common/domButtons/DomButtonColorButtons.css"); + +@import url("../common/IconContainer_keyframes.css"); +/* dojox.mobile.IconContainer */ +.mblIconContainer { + margin: 8px 0 8px 8px; + padding: 8px 0 8px; + background-color: #eff1f3; +} +/* dojox.mobile.IconItem */ +.mblIconItem { + list-style-type: none; + float: left; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} +.mblIconItemTerminator { + list-style-type: none; + clear: both; + height: 8px; +} +.mblIconItemSub { + list-style-type: none; + margin-left: -8px; + background-color: white; + color: #131313; +} +.mblIconArea { + height: 87px; + width: 73px; + text-align: center; + font-family: Helvetica; + font-weight: normal; + font-size: 14px; +} +.mblIconArea div { + position: relative; + height: 65px; + line-height: 65px; + text-align: center; +} +.mblIconArea img { + vertical-align: middle; +} +.mblIconItemSpriteIcon { + position: absolute; +} +.mblContent { + clear: both; + padding-bottom: 8px; +} +table.mblClose { + clear: both; + cursor: pointer; +} +.mblVibrate { + position: relative; + -webkit-animation-duration: .5s; + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-iteration-count: 20; + -webkit-animation-name: mblVibrate; + -webkit-transform: rotate(0deg); +} +.mblCloseContent { + -webkit-animation-duration: .3s; + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-name: mblShrink; + -webkit-transform: scale(0.01); +} +.mblCloseContent.mblShrink0 { + -webkit-animation-name: mblShrink0; +} +.mblCloseContent.mblShrink1 { + -webkit-animation-name: mblShrink1; +} +.mblCloseContent.mblShrink2 { + -webkit-animation-name: mblShrink2; +} +.mblCloseContent.mblShrink3 { + -webkit-animation-name: mblShrink3; +} +/* Icon Content Heading */ +.mblIconContentHeading { + position: relative; + clear: both; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin-top: 0px; + padding-left: 37px; + height: 25px; + border-top: 1px solid #dfe8f0; + border-bottom: 1px solid #769dc0; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(2.5%, #ffffff), color-stop(2.5%, rgba(255, 255, 255, 0.14)), color-stop(5%, rgba(255, 255, 255, 0.14)), color-stop(5%, rgba(255, 255, 255, 0.52)), color-stop(7.5%, rgba(255, 255, 255, 0.52)), color-stop(7.5%, rgba(255, 255, 255, 0.68)), color-stop(10%, rgba(255, 255, 255, 0.68)), color-stop(1, rgba(255, 255, 255, 0))); + color: #131313; + font-size: 14px; + font-family: Helvetica; + font-weight: normal; + text-shadow: rgba(0, 0, 0, 0.2) 0px 1px 2px; + line-height: 26px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/IconContainer.less b/js/dojo/dojox/mobile/themes/custom/IconContainer.less new file mode 100644 index 0000000..963eae6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/IconContainer.less @@ -0,0 +1,5 @@ +@import url("../common/domButtons/DomButtonColorButtons.css"); +@import url("../common/IconContainer_keyframes.css"); + +@import "variables.less"; +@import "../common/IconContainer.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/ListItem-compat.css b/js/dojo/dojox/mobile/themes/custom/ListItem-compat.css new file mode 100644 index 0000000..1192cdf --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ListItem-compat.css @@ -0,0 +1,16 @@ +@import url("../common/domButtons/DomButtonGrayArrow-compat.css"); +@import url("../common/domButtons/DomButtonDarkBlueCheck-compat.css"); + +/* mbl.widget.ListItem */ +*html li.mblListItem.mblVariableHeight { /* IE6 hack */ + height: 0; +} +.mblItemSelected { + background-image: url(compat/ui-widget-bg.png); +} +*html .mblListItemTextBox { /* IE6 hack */ + height: 100%; +} +*html li.mblListItem.mblVariableHeight .mblListItemTextBox { /* IE6 hack */ + height: auto; +} diff --git a/js/dojo/dojox/mobile/themes/custom/ListItem.css b/js/dojo/dojox/mobile/themes/custom/ListItem.css new file mode 100644 index 0000000..8d3cb7c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ListItem.css @@ -0,0 +1,84 @@ +@import url("../common/domButtons/DomButtonGrayArrow.css"); + +@import url("../common/domButtons/DomButtonDarkBlueCheck.css"); +/* dojox.mobile.ListItem */ +.mblListItem { + position: relative; + list-style-type: none; + vertical-align: bottom; + /* To avoid IE6 LI bug */ + + padding: 0 0 0 8px; + height: 50px; + border-bottom: 1px solid #b5bcc7; + font-size: 18px; + font-family: Helvetica; + font-weight: normal; + text-shadow: none; + color: #131313; + line-height: 50px; +} +.mblListItem.mblVariableHeight { + height: auto; + padding: 11px 0px 10px 6px; + line-height: normal; +} +.mblListItem .mblListItemAnchor { + display: block; + height: 100%; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + background-position: 9px 7px; + text-decoration: none; + padding-right: 7px; +} +.mblListItem .mblListItemAnchor * { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0.2); +} +.mblItemSelected { + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); +} +.mblItemSelected .mblListItemAnchor { + color: #000000; +} +.mblItemSelected .mblDomButton div { + border-color: white; +} +.mblListItemTextBoxSelected { + background-color: #5cb0ff; +} +.mblListItemChecked { + color: #000000; +} +.mblListItemIcon { + float: left; + line-height: normal; + margin-top: 10.5px; + margin-right: 11px; +} +.mblListItemSpriteIcon { + position: absolute; + margin-top: 10.5px; + margin-left: 8px; +} +.mblListItemRightIcon, .mblListItemRightIcon2 { + position: relative; + float: right; + line-height: normal; + margin-top: 10.5px; +} +.mblListItemRightText { + position: relative; + float: right; + line-height: normal; + color: #131313; + margin: 14px 4px 0 0; +} +.mblListItemTextBox { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.mblVariableHeight .mblListItemTextBox { + white-space: normal; +} diff --git a/js/dojo/dojox/mobile/themes/custom/ListItem.less b/js/dojo/dojox/mobile/themes/custom/ListItem.less new file mode 100644 index 0000000..f9f9d21 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ListItem.less @@ -0,0 +1,5 @@ +@import url("../common/domButtons/DomButtonGrayArrow.css"); +@import url("../common/domButtons/DomButtonDarkBlueCheck.css"); + +@import "variables.less"; +@import "../common/ListItem.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/Opener-compat.css b/js/dojo/dojox/mobile/themes/custom/Opener-compat.css new file mode 100644 index 0000000..68cb1a8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Opener-compat.css @@ -0,0 +1,3 @@ +/* dojox.mobile.Opener */ +@import url("Overlay-compat.css"); +@import url("Tooltip-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/custom/Opener.css b/js/dojo/dojox/mobile/themes/custom/Opener.css new file mode 100644 index 0000000..141c72e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Opener.css @@ -0,0 +1,3 @@ +/* dojox.mobile.Opener */ +@import url("Overlay.css"); +@import url("Tooltip.css"); diff --git a/js/dojo/dojox/mobile/themes/custom/Overlay-compat.css b/js/dojo/dojox/mobile/themes/custom/Overlay-compat.css new file mode 100644 index 0000000..3bc72a3 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Overlay-compat.css @@ -0,0 +1,13 @@ +/* dojox.mobile.Overlay */ +.mblOverlay { + _position: absolute; + text-align: center; +} +.dj_gecko .mblOverlay { + text-align: -moz-center; +} +.dj_ie9 .mblOverlay > *, +.dj_ie8 .mblOverlay > * +{ + margin: 0 auto; +} diff --git a/js/dojo/dojox/mobile/themes/custom/Overlay.css b/js/dojo/dojox/mobile/themes/custom/Overlay.css new file mode 100644 index 0000000..c2b7731 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Overlay.css @@ -0,0 +1,18 @@ +@import url("../common/transitions/coverv.css"); + +@import url("../common/transitions/revealv.css"); +/* dojox.mobile.Overlay */ +.mblOverlay { + position: fixed; + z-index: 2000; + left: 0; + bottom: 0; + margin: 0; + width: 100%; + text-align: -webkit-center; + background-color: #eff1f3; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); +} +.mblOverlayHidden *, .mblOverlayHidden { + visibility: hidden !important; +} diff --git a/js/dojo/dojox/mobile/themes/custom/Overlay.less b/js/dojo/dojox/mobile/themes/custom/Overlay.less new file mode 100644 index 0000000..e49ea9e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Overlay.less @@ -0,0 +1,5 @@ +@import url("../common/transitions/coverv.css"); +@import url("../common/transitions/revealv.css"); + +@import "variables.less"; +@import "../common/Overlay.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/PageIndicator.css b/js/dojo/dojox/mobile/themes/custom/PageIndicator.css new file mode 100644 index 0000000..a175ad6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/PageIndicator.css @@ -0,0 +1,24 @@ +/* dojox.mobile.PageIndicator */ +.mblPageIndicator { + position: relative; + width: 100%; + height: 20px; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} +.mblPageIndicatorContainer { + margin-top: 4px; + margin-left: auto; + margin-right: auto; +} +.mblPageIndicatorDot { + margin: 0px 3px; + width: 6px; + height: 6px; + font-size: 1px; + background-color: #949294; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; +} +.mblPageIndicatorDotSelected { + background-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/custom/PageIndicator.less b/js/dojo/dojox/mobile/themes/custom/PageIndicator.less new file mode 100644 index 0000000..9bb6c49 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/PageIndicator.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/PageIndicator.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/ProgressIndicator-compat.css b/js/dojo/dojox/mobile/themes/custom/ProgressIndicator-compat.css new file mode 100644 index 0000000..4ee0810 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ProgressIndicator-compat.css @@ -0,0 +1,46 @@ +/* Progress Indicator */ +.mblProg { + position: absolute; + top: 0px; + width: 4px; + font-size: 1px; + height: 36px; + overflow: hidden; + background-color: #C0C0C0; +} +.mblProg0 { + left: 0px; +} +.mblProg1 { + left: 8px; +} +.mblProg2 { + left: 16px; +} +.mblProg3 { + left: 24px; +} +.mblProg4 { + left: 32px; +} +.mblProg5 { + left: 40px; +} +.mblProg6 { + left: 48px; +} +.mblProg7 { + left: 56px; +} +.mblProg8 { + left: 64px; +} +.mblProg9 { + left: 72px; +} +.mblProg10 { + left: 80px; +} +.mblProg11 { + left: 80px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/ProgressIndicator.css b/js/dojo/dojox/mobile/themes/custom/ProgressIndicator.css new file mode 100644 index 0000000..2340637 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ProgressIndicator.css @@ -0,0 +1,58 @@ +/* Progress Indicator */ +.mblProgContainer { + position: absolute; + width: 40px; + height: 40px; + top: 180px; + left: 50%; + margin: -18px 0px 0px -18px; +} +.mblProg { + position: absolute; + left: 2px; + top: 0px; + width: 11px; + font-size: 1px; + height: 4px; + overflow: hidden; + -webkit-transform-origin: 0 2px; + background-color: #C0C0C0; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} +.mblProg0 { + -webkit-transform: translate(18px, 10px) rotate(-90.1deg); +} +.mblProg1 { + -webkit-transform: translate(22px, 11px) rotate(-60deg); +} +.mblProg2 { + -webkit-transform: translate(25px, 14px) rotate(-30deg); +} +.mblProg3 { + -webkit-transform: translate(26px, 18px) rotate(0deg); +} +.mblProg4 { + -webkit-transform: translate(25px, 22px) rotate(30deg); +} +.mblProg5 { + -webkit-transform: translate(22px, 25px) rotate(60deg); +} +.mblProg6 { + -webkit-transform: translate(18px, 26px) rotate(90.1deg); +} +.mblProg7 { + -webkit-transform: translate(14px, 25px) rotate(120deg); +} +.mblProg8 { + -webkit-transform: translate(11px, 22px) rotate(150deg); +} +.mblProg9 { + -webkit-transform: translate(10px, 18px) rotate(180deg); +} +.mblProg10 { + -webkit-transform: translate(11px, 14px) rotate(210deg); +} +.mblProg11 { + -webkit-transform: translate(14px, 11px) rotate(240deg); +} diff --git a/js/dojo/dojox/mobile/themes/custom/ProgressIndicator.less b/js/dojo/dojox/mobile/themes/custom/ProgressIndicator.less new file mode 100644 index 0000000..2ab2a2d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ProgressIndicator.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ProgressIndicator.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/RadioButton-compat.css b/js/dojo/dojox/mobile/themes/custom/RadioButton-compat.css new file mode 100644 index 0000000..9fd4ead --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/RadioButton-compat.css @@ -0,0 +1,26 @@ +/* dojox.mobile.RadioButton */ +.mblRadioButton { + background-image: url(compat/ui-widget-bg.png); + -moz-border-radius: 0.5em; + -o-border-radius: 0.5em; + -ms-border-radius: 0.5em; + border-radius: 0.5em; + -moz-appearance: none; + -o-appearance: none; + -ms-appearance: none; + appearance: none; + -o-transform: translateY(0.45em); + -ms-transform: translateY(0.45em); + transform: translateY(0.45em); +} +.mblRadioButtonChecked::after, +.mblRadioButton:checked::after { + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; +} diff --git a/js/dojo/dojox/mobile/themes/custom/RadioButton.css b/js/dojo/dojox/mobile/themes/custom/RadioButton.css new file mode 100644 index 0000000..32b1ebb --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/RadioButton.css @@ -0,0 +1,41 @@ +/* dojox.mobile.RadioButton */ +.mblRadioButton { + position: relative; + cursor: pointer; + outline: none; + -webkit-appearance: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + font-size: 18px; + border: 1px outset #b5bcc7; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); + -webkit-border-radius: 0.5em; + -webkit-transform: translatey(0.45em); +} +.mblRadioButtonChecked, .mblRadioButton:checked { + border-color: #769dc0; + background-color: #007ef5; +} +.mblRadioButtonChecked::after, .mblRadioButton:checked::after { + position: absolute; + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.25em; + border-color: #000000; + border-width: 0.15em; + border-style: none solid solid none; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblRadioButtonChecked.mblRadioButtonSelected, .mblRadioButton:checked.mblRadioButtonSelected { + border-color: #769dc0; + background-color: #0064c2; +} +.mblRadioButtonChecked.mblRadioButtonSelected::after, .mblRadioButton:checked.mblRadioButtonSelected::after { + border-color: #000000; +} diff --git a/js/dojo/dojox/mobile/themes/custom/RadioButton.less b/js/dojo/dojox/mobile/themes/custom/RadioButton.less new file mode 100644 index 0000000..0793ca6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/RadioButton.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RadioButton.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/RoundRect-compat.css b/js/dojo/dojox/mobile/themes/custom/RoundRect-compat.css new file mode 100644 index 0000000..104ef49 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/RoundRect-compat.css @@ -0,0 +1,71 @@ +/* dojox.mobile.RoundRect */ +.mblRoundRect { + -moz-border-radius: 5px; + -o-border-radius: 5px; + -ms-border-radius: 5px; + border-radius: 5px; +} +/* Round Corner */ +.mblRoundCorner { + background-color: white; + height: 1px; + font-size: 1px; + overflow: hidden; + border-style: solid; + border-color: #ADAAAD; + border-width: 0px 1px; +} +.mblRoundRectContainer { + margin: 0px; + padding: 0px; + background-color: white; + border-style: solid; + border-color: #ADAAAD; + border-width: 0px 1px; +} +.mblRoundRect .mblRoundRectContainer { + padding: 3px 8px; +} +.mblRoundCorner0T { + height: 0px; +} +.mblRoundCorner1T { + background-color: #ADAAAD; + margin: 0px 5px; +} +.mblRoundCorner2T { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner3T { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4T { + margin: 0px 1px; +} +.mblRoundCorner5T { + margin: 0px 1px; +} + +.mblRoundCorner0B { + height: 0px; +} +.mblRoundCorner1B { + margin: 0px 1px; +} +.mblRoundCorner2B { + margin: 0px 1px; +} +.mblRoundCorner3B { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4B { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner5B { + background-color: #ADAAAD; + margin: 0px 5px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/RoundRect.css b/js/dojo/dojox/mobile/themes/custom/RoundRect.css new file mode 100644 index 0000000..86caed0 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/RoundRect.css @@ -0,0 +1,15 @@ +/* dojox.mobile.RoundRect */ +.mblRoundRect { + margin: 8px 8px 12px; + padding: 8px; + border: 1px solid #b5bcc7; + -webkit-border-radius: 5px; + background-color: #ffffff; + font-size: 18px; + font-family: Helvetica; + font-weight: normal; + text-shadow: none; +} +.mblRoundRect.mblShadow { + -webkit-box-shadow: 5px 5px 5px #b5bcc7; +} diff --git a/js/dojo/dojox/mobile/themes/custom/RoundRect.less b/js/dojo/dojox/mobile/themes/custom/RoundRect.less new file mode 100644 index 0000000..efec816 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/RoundRect.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RoundRect.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/RoundRectCategory.css b/js/dojo/dojox/mobile/themes/custom/RoundRectCategory.css new file mode 100644 index 0000000..12485a8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/RoundRectCategory.css @@ -0,0 +1,14 @@ +/* dojox.mobile.RoundRectCategory */ +.mblRoundRectCategory { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + margin: 0; + padding: 8px 8px 0; + font-size: 18px; + font-family: Helvetica; + font-weight: normal; + text-shadow: rgba(0, 0, 0, 0.2) 0px 1px 2px; + color: #000000; + line-height: 30px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/RoundRectCategory.less b/js/dojo/dojox/mobile/themes/custom/RoundRectCategory.less new file mode 100644 index 0000000..e9148cc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/RoundRectCategory.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RoundRectCategory.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/RoundRectList-compat.css b/js/dojo/dojox/mobile/themes/custom/RoundRectList-compat.css new file mode 100644 index 0000000..d16eb00 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/RoundRectList-compat.css @@ -0,0 +1,91 @@ +/* dojox.mobile.RoundRectList */ +.mblRoundRectList { + -moz-border-radius: 5px; + -o-border-radius: 5px; + -ms-border-radius: 5px; + border-radius: 5px; +} +.mblRoundRectList .mblListItem:first-child { + -moz-border-radius-topleft: 5px; + -moz-border-radius-topright: 5px; + -o-border-top-left-radius: 5px; + -o-border-top-right-radius: 5px; + -ms-border-top-left-radius: 5px; + -ms-border-top-right-radius: 5px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} +.mblRoundRectList .mblListItem:last-child { + -moz-border-radius-bottomleft: 5px; + -moz-border-radius-bottomright: 5px; + -o-border-bottom-left-radius: 5px; + -o-border-bottom-right-radius: 5px; + -ms-border-bottom-left-radius: 5px; + -ms-border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} +/* Round Corner */ +.mblRoundCorner { + background-color: white; + height: 1px; + font-size: 1px; + overflow: hidden; + border-style: solid; + border-color: #ADAAAD; + border-width: 0px 1px; +} +.mblRoundRectContainer { + margin: 0px; + padding: 0px; + background-color: white; + border-style: solid; + border-color: #ADAAAD; + border-width: 0px 1px; +} +.mblRoundRect .mblRoundRectContainer { + padding: 3px 8px; +} +.mblRoundCorner0T { + height: 0px; +} +.mblRoundCorner1T { + background-color: #ADAAAD; + margin: 0px 5px; +} +.mblRoundCorner2T { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner3T { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4T { + margin: 0px 1px; +} +.mblRoundCorner5T { + margin: 0px 1px; +} + +.mblRoundCorner0B { + height: 0px; +} +.mblRoundCorner1B { + margin: 0px 1px; +} +.mblRoundCorner2B { + margin: 0px 1px; +} +.mblRoundCorner3B { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4B { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner5B { + background-color: #ADAAAD; + margin: 0px 5px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/RoundRectList.css b/js/dojo/dojox/mobile/themes/custom/RoundRectList.css new file mode 100644 index 0000000..3399016 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/RoundRectList.css @@ -0,0 +1,21 @@ +/* dojox.mobile.RoundRectList */ +.mblRoundRectList { + position: relative; + /* IE needs this */ + + margin: 8px 8px 12px; + padding: 0; + border: 1px solid #b5bcc7; + -webkit-border-radius: 5px; + background-color: #ffffff; + -webkit-box-shadow: 5px 5px 5px #b5bcc7; +} +.mblRoundRectList .mblListItem:first-child { + -webkit-border-top-left-radius: 5px; + -webkit-border-top-right-radius: 5px; +} +.mblRoundRectList .mblListItem:last-child { + border-bottom-width: 0px; + -webkit-border-bottom-left-radius: 5px; + -webkit-border-bottom-right-radius: 5px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/RoundRectList.less b/js/dojo/dojox/mobile/themes/custom/RoundRectList.less new file mode 100644 index 0000000..52e1164 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/RoundRectList.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RoundRectList.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/Slider-compat.css b/js/dojo/dojox/mobile/themes/custom/Slider-compat.css new file mode 100644 index 0000000..936dcd6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Slider-compat.css @@ -0,0 +1,42 @@ +/* dojox.mobile.Slider */ +.mblSlider { + background-image: url(compat/ui-widget-bg.png); + -moz-border-radius: 8px; + -o-border-radius: 8px; + -ms-border-radius: 8px; + border-radius: 8px; + -moz-user-select: none; /* prevent selection */ + -o-user-select: none; + -ms-user-select: none; + user-select: none; + -moz-box-sizing: content-box; /* make width and height consistent with a DIV */ + -o-box-sizing: content-box; + -ms-box-sizing: content-box; + box-sizing: content-box; +} +.mblSlider.mblSliderV { + background: #ABABAB; +} +.mblSliderProgressBar { + background-image: url(compat/ui-widget-bg.png); + background-repeat: repeat-x; + -moz-border-radius: 8px; + -o-border-radius: 8px; + -ms-border-radius: 8px; + border-radius: 8px; + _background-image: url(compat/slider-h-bar-bg.png); /* IE6 hack */ + _background-color: transparent; /* IE6 hack */ +} +.mblSliderV .mblSliderProgressBar { + background: #0D48A8; +} +.mblSliderHandle { + background-image: url(compat/ui-widget-bg.png); + -moz-border-radius: 10px; + -o-border-radius: 10px; + -ms-border-radius: 10px; + border-radius: 10px; +} +.mblSliderTransition { + transition-duration: 400ms; +} diff --git a/js/dojo/dojox/mobile/themes/custom/Slider.css b/js/dojo/dojox/mobile/themes/custom/Slider.css new file mode 100644 index 0000000..888f96a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Slider.css @@ -0,0 +1,65 @@ +/* dojox.mobile.Slider */ +.mblSlider { + outline: none; + -webkit-user-select: none; + /* prevent selection */ + + -webkit-box-sizing: content-box; + /* make width and height consistent with a DIV */ + + margin: 15px; + /* 1/2 handle width for hanging off the ends of the bar */ + + border: 1px outset #b5bcc7; + background-color: #8fc9ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); + -webkit-border-radius: 2px; +} +.mblSliderH { + width: 200px; + height: 8px; +} +.mblSliderH .mblSliderProgressBar { + height: 100%; +} +.mblSliderH .mblSliderHandle { + top: 50%; +} +.mblSliderV { + height: 200px; + width: 8px; +} +.mblSliderV .mblSliderProgressBar { + width: 100%; +} +.mblSliderV .mblSliderHandle { + left: 50%; +} +.mblSliderProgressBar { + -webkit-border-radius: 2px; + background-color: #0064c2; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); +} +.mblSliderHandle { + margin: -10px 0 0 -10px; + width: 18px; + height: 18px; + border: 1px outset #b5bcc7; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); + -webkit-border-radius: 2px; +} +.mblSliderTransition { + -webkit-transition-duration: 400ms; +} +.mblSliderTouchBox { + margin: 0; + padding: 12pt; + left: -12pt; + top: -12pt; + border: none; + width: 100%; + height: 100%; + background-color: transparent; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} diff --git a/js/dojo/dojox/mobile/themes/custom/Slider.less b/js/dojo/dojox/mobile/themes/custom/Slider.less new file mode 100644 index 0000000..928972f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Slider.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Slider.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/Switch-compat.css b/js/dojo/dojox/mobile/themes/custom/Switch-compat.css new file mode 100644 index 0000000..7730ebb --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Switch-compat.css @@ -0,0 +1,59 @@ +/* Switch - default */ +.mblSwitchBg { + -moz-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + border-radius: 2px; + -moz-box-sizing: border-box; + -o-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} +.mblSwitchBgLeft { + background-image: url(compat/ui-widget-bg.png); +} +.mblSwitchBgRight { + background-image: url(compat/ui-widget-bg.png); +} +.mblSwitchKnob { + background-image: url(compat/ui-widget-bg.png); + -moz-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + border-radius: 2px; + -moz-box-sizing: border-box; + -o-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +/* Round Shape */ +.mblSwRoundShape1 .mblSwitchBg, +.mblSwRoundShape2 .mblSwitchBg { + -moz-border-radius: 14px; + -o-border-radius: 14px; + -ms-border-radius: 14px; + border-radius: 14px; +} +.mblSwRoundShape1 .mblSwitchKnob, +.mblSwRoundShape2 .mblSwitchKnob { + -moz-border-radius: 13px; + -o-border-radius: 13px; + -ms-border-radius: 13px; + border-radius: 13px; +} +/* Arc Shape */ +.mblSwArcShape1 .mblSwitchBg, +.mblSwArcShape2 .mblSwitchBg { + -moz-border-radius: 6px/14px; + -o-border-radius: 6px/14px; + -ms-border-radius: 6px/14px; + border-radius: 6px/14px; +} +.mblSwArcShape1 .mblSwitchKnob, +.mblSwArcShape2 .mblSwitchKnob { + -moz-border-radius: 5px/13px; + -o-border-radius: 5px/13px; + -ms-border-radius: 5px/13px; + border-radius: 5px/13px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/Switch.css b/js/dojo/dojox/mobile/themes/custom/Switch.css new file mode 100644 index 0000000..fa50ef9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Switch.css @@ -0,0 +1,23 @@ +@import url("../common/Switch.css"); +/* dojox.mobile.Switch */ +.mblItemSwitch { + top: 12px; +} +.mblSwitchBg { + border-color: #b5bcc7; + -webkit-border-radius: 2px; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); +} +.mblSwitchBgLeft { + background-color: #007ef5; + color: #131313; +} +.mblSwitchBgRight { + background-color: #8fc9ff; +} +.mblSwitchKnob { + border-color: #7b879b; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); + -webkit-border-radius: 2px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/Switch.less b/js/dojo/dojox/mobile/themes/custom/Switch.less new file mode 100644 index 0000000..84a1146 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Switch.less @@ -0,0 +1,4 @@ +@import url("../common/Switch.css"); + +@import "variables.less"; +@import "../common/Switch.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/TabBar-compat.css b/js/dojo/dojox/mobile/themes/custom/TabBar-compat.css new file mode 100644 index 0000000..fb2a1b2 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/TabBar-compat.css @@ -0,0 +1,55 @@ +/* dojox.mobile.TabBarButton */ +.dj_ie6 .mblTabBarButtonDiv, .dj_ie7 .mblTabBarButtonDiv { + left: auto; +} +.dj_ie6 .mblTabBar .mblTabBarButton { + display: inline; /* IE bug*/ +} +.mblTabPanelHeader { + background-image: url(compat/heading-bg.png); +} +.mblTabBar { + background-image: url(compat/ui-widget-bg.png); +} +.mblTabBarButton, .mblTabButton { + background-image: url(compat/ui-widget-bg.png); + _background-image: none; /* IE6 */ +} +.mblTabBar .mblTabBarButton.mblTabButtonSelected { + -moz-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + border-radius: 2px; +} +.mblTabButton:first-child { + -moz-border-radius-topleft: 2px; + -moz-border-radius-bottomleft: 2px; + -o-border-top-left-radius: 2px; + -o-border-bottom-left-radius: 2px; + -ms-border-top-left-radius: 2px; + -ms-border-bottom-left-radius: 2px; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} +.mblTabButton:last-child { + -moz-border-radius-topright: 2px; + -moz-border-radius-bottomright: 2px; + -o-border-top-right-radius: 2px; + -o-border-bottom-right-radius: 2px; + -ms-border-top-right-radius: 2px; + -ms-border-bottom-right-radius: 2px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} +*html .mblTabButton { /* IE6 hack */ + behavior: expression( + (function(el){ + if(!el.previousSibling) + el.style.borderWidth = "1px"; + el.style.behavior = "none"; + })(this) + ); +} +.dj_ie6 .mblTabPanelHeader .mblDomButton { + left: 0px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/TabBar.css b/js/dojo/dojox/mobile/themes/custom/TabBar.css new file mode 100644 index 0000000..3362235 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/TabBar.css @@ -0,0 +1,161 @@ +/* dojox.mobile.TabBar */ +.mblTabBar { + position: relative; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + height: 50px; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); + border-bottom: 1px solid #769dc0; + color: #131313; + text-align: center; +} +.mblTabBarNoIcons { + height: 34px; +} +.mblTabBarNoText { + height: 34px; +} +/* dojox.mobile.TabBarButton */ +.mblTabBarButton { + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} +.mblTabBar .mblTabBarButton { + position: relative; + list-style-type: none; + float: left; + padding: 5px 0; +} +.mblTabBar .mblTabBarButton.mblTabButtonSelected { + border-color: #769dc0; + background-color: #0064c2; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); + -webkit-border-radius: 2px; +} +.mblTabBarButtonAnchor { + display: block; + text-decoration: none; +} +.mblTabBarButtonDiv { + position: relative; + margin-left: auto; + margin-right: auto; + height: 29px; + width: 29px; +} +.mblTabBarButtonIcon { + position: absolute; + left: 0; + top: 0; +} +.mblTabBarButtonSpriteIcon { + position: absolute; +} +.mblTabBarButtonTextBox { + color: #131313; + font-family: Helvetica; + font-size: 11px; + font-weight: normal; +} +.mblTabBarNoIcons .mblTabBarButtonDiv { + display: none; +} +.mblTabBarNoIcons .mblTabBarButtonTextBox { + line-height: 39px; + font-size: 17px; +} +.mblTabBarTop .mblTabButton .mblTabBarButtonDiv { + display: none; +} +.mblTabButton { + position: relative; + float: left; + list-style-type: none; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + width: 90px; + height: 30px; + border-width: 1px 1px 1px 0px; + border-style: inset; + border-color: #b5bcc7; + border-right-color: #b5bcc7; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); + font-family: Helvetica; + font-size: 14px; + font-weight: normal; + color: #131313; + text-align: center; + line-height: 30px; +} +.mblTabButton .mblTabBarButtonAnchor, .mblTabButton .mblTabBarButtonDiv { + height: 30px; +} +.mblTabButton:first-child { + -webkit-border-top-left-radius: 2px; + -webkit-border-bottom-left-radius: 2px; + border-left-width: 1px; +} +.mblTabButton:last-child { + -webkit-border-top-right-radius: 2px; + -webkit-border-bottom-right-radius: 2px; + border-right-color: #b5bcc7; +} +.mblTabButtonSelected .mblTabBarButtonTextBox { + color: #000000; +} +.mblTabButtonSelected.mblTabButton { + background-color: #0064c2; +} +.mblTabButtonHighlighted.mblTabButton { + background-color: #007ef5; +} +.mblTabButtonImgDiv { + display: none; +} +.mblTabPanelHeader { + position: relative; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin: 0; + padding: 0; + height: 40px; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(2.5%, #ffffff), color-stop(2.5%, rgba(255, 255, 255, 0.14)), color-stop(5%, rgba(255, 255, 255, 0.14)), color-stop(5%, rgba(255, 255, 255, 0.52)), color-stop(7.5%, rgba(255, 255, 255, 0.52)), color-stop(7.5%, rgba(255, 255, 255, 0.68)), color-stop(10%, rgba(255, 255, 255, 0.68)), color-stop(1, rgba(255, 255, 255, 0))); + border-bottom: 1px solid #769dc0; + color: #131313; + font-size: 18px; + font-family: Helvetica; + font-weight: normal; + text-shadow: rgba(0, 0, 0, 0.2) 0px 1px 2px; + text-align: center; + line-height: 42px; +} +.mblTabPanelHeader .mblTabButton { + margin-top: 4px; +} +.mblTabPanelHeader .mblTabButton.mblTabButtonSelected { + background-color: #0064c2; +} +.mblTabPanelHeader .mblTabButtonDomButton { + width: 43px; +} +.mblTabPanelHeader .mblTabButtonDomButtonClass { + left: 8px; +} +.mblHeading .mblTabPanelHeader .mblTabButton { + margin-top: 5px; +} +.mblHeading .mblTabPanelHeader .mblTabButton:first-child { + -webkit-border-top-left-radius: 2px; + -webkit-border-bottom-left-radius: 2px; + border-left-width: 1px; +} +.mblHeading .mblTabPanelHeader .mblTabButton:last-child { + -webkit-border-top-right-radius: 2px; + -webkit-border-bottom-right-radius: 2px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/TabBar.less b/js/dojo/dojox/mobile/themes/custom/TabBar.less new file mode 100644 index 0000000..4875c40 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/TabBar.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/TabBar.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/TextArea-compat.css b/js/dojo/dojox/mobile/themes/custom/TextArea-compat.css new file mode 100644 index 0000000..af7e363 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/TextArea-compat.css @@ -0,0 +1,7 @@ +/* dojox.mobile.TextArea */ +.mblTextArea { + -moz-border-radius: 5px; + -o-border-radius: 5px; + -ms-border-radius: 5px; + border-radius: 5px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/TextArea.css b/js/dojo/dojox/mobile/themes/custom/TextArea.css new file mode 100644 index 0000000..d56f3f4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/TextArea.css @@ -0,0 +1,12 @@ +/* dojox.mobile.TextArea */ +.mblTextArea { + padding: 4px 1px; + border: #b5bcc7 1px inset; + font-family: Helvetica; + font-size: 14px; + -webkit-border-radius: 5px; +} +/* dojox.mobile.ExpandingTextArea */ +.mblExpandingTextArea { + margin: 2px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/TextArea.less b/js/dojo/dojox/mobile/themes/custom/TextArea.less new file mode 100644 index 0000000..c16ffe0 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/TextArea.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/TextArea.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/TextBox-compat.css b/js/dojo/dojox/mobile/themes/custom/TextBox-compat.css new file mode 100644 index 0000000..32dcf46 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/TextBox-compat.css @@ -0,0 +1,7 @@ +/* dojox.mobile.TextBox */ +.mblTextBox { + -moz-border-radius: 5px; + -o-border-radius: 5px; + -ms-border-radius: 5px; + border-radius: 5px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/TextBox.css b/js/dojo/dojox/mobile/themes/custom/TextBox.css new file mode 100644 index 0000000..65a63bf --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/TextBox.css @@ -0,0 +1,8 @@ +/* dojox.mobile.TextBox */ +.mblTextBox { + height: 30px; + border: #b5bcc7 1px inset; + font-family: Helvetica; + font-size: 14px; + -webkit-border-radius: 5px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/TextBox.less b/js/dojo/dojox/mobile/themes/custom/TextBox.less new file mode 100644 index 0000000..c83890a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/TextBox.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/TextBox.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/ToggleButton-compat.css b/js/dojo/dojox/mobile/themes/custom/ToggleButton-compat.css new file mode 100644 index 0000000..c1333a9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ToggleButton-compat.css @@ -0,0 +1,21 @@ +/* dojox.mobile.ToggleButton */ +.mblToggleButton { + background-image: url(compat/ui-widget-bg.png); + -moz-border-radius: 5px; + -o-border-radius: 5px; + -ms-border-radius: 5px; + border-radius: 5px; +} +.mblToggleButton.mblToggleButtonChecked::after { + -moz-transform: translate(-25px,0px) rotate(45deg) skew(10deg); + -o-transform: rotate(45deg) skew(10deg); + -ms-transform: rotate(45deg) skew(10deg); + transform: rotate(45deg) skew(10deg); + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; +} +.dj_ff3 .mblToggleButton.mblToggleButtonChecked::after { + -moz-transform: translate(-25px,-6px) rotate(45deg) skew(10deg); +} diff --git a/js/dojo/dojox/mobile/themes/custom/ToggleButton.css b/js/dojo/dojox/mobile/themes/custom/ToggleButton.css new file mode 100644 index 0000000..9932572 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ToggleButton.css @@ -0,0 +1,52 @@ +/* dojox.mobile.ToggleButton */ +.mblToggleButton { + position: relative; + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + padding: 0 8px 0 23px; + height: 30px; + border: 1px outset #b5bcc7; + -webkit-border-radius: 2px; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); + font-family: Helvetica; + font-weight: normal; + line-height: 30px; + color: #131313; + line-height: 30px; +} +.mblToggleButton.mblToggleButtonSelected { + border-color: #769dc0; + background-color: #0064c2; +} +.mblToggleButton.mblToggleButtonChecked { + border-color: #769dc0; + background-color: #007ef5; +} +.mblToggleButton.mblToggleButtonChecked::after { + position: absolute; + content: ""; + top: 7.5px; + left: 7px; + width: 5px; + height: 10px; + border-color: #000000; + border-width: 0.15em; + border-style: none solid solid none; + -webkit-transform: rotate(45deg) skew(10deg); + -webkit-transform-origin: 50% 50%; +} +.mblToggleButton.mblToggleButtonChecked.mblToggleButtonSelected { + border-color: #769dc0; + background-color: #0064c2; +} +.mblToggleButton.mblToggleButtonChecked.mblToggleButtonSelected::after { + border-color: #000000; +} +.mblToggleButton:disabled { + cursor: default; + color: grey; + border-color: grey; + background-color: #8fc9ff; +} diff --git a/js/dojo/dojox/mobile/themes/custom/ToggleButton.less b/js/dojo/dojox/mobile/themes/custom/ToggleButton.less new file mode 100644 index 0000000..bdce40f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ToggleButton.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ToggleButton.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/ToolBarButton.css b/js/dojo/dojox/mobile/themes/custom/ToolBarButton.css new file mode 100644 index 0000000..c02a12e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ToolBarButton.css @@ -0,0 +1,32 @@ +/* dojox.mobile.ToolBarButton */ +.mblToolBarButton { + float: left; + position: relative; + overflow: hidden; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + margin: 8px; + height: 30px; + border: 1px inset #b5bcc7; + -webkit-border-radius: 2px; + font-size: 14px; + font-family: Helvetica; + font-weight: normal; + text-shadow: none; + color: #131313; + line-height: 30px; + text-align: center; +} +.mblToolBarButton.mblArrowButtonText { + margin: 6px 8px; +} +.mblToolBarButtonIcon { + position: relative; + top: 2px; +} +.mblToolBarButtonSpriteIcon { + position: absolute; +} +.mblToolBarButtonText { + padding: 0px 10px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/ToolBarButton.less b/js/dojo/dojox/mobile/themes/custom/ToolBarButton.less new file mode 100644 index 0000000..3b67bdc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/ToolBarButton.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ToolBarButton.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/Tooltip-compat.css b/js/dojo/dojox/mobile/themes/custom/Tooltip-compat.css new file mode 100644 index 0000000..a028ad7 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Tooltip-compat.css @@ -0,0 +1,47 @@ +/* dojox.mobile.Tooltip */ +.mblTooltip { + -moz-border-radius: 8px; + -o-border-radius: 8px; + -ms-border-radius: 8px; + border-radius: 8px; + background-image: none; +} +.mblTooltipBefore .mblTooltipArrow { + *right: 0; /* IE 7 quirks */ +} +.mblTooltipAbove .mblTooltipArrow { + *bottom: 0px; /* IE 7 quirks */ +} +.mblTooltipBefore .mblTooltipInnerArrow { + *right: -1px; /* IE 7 quirks */ +} +.mblTooltipAbove .mblTooltipInnerArrow { + *bottom: -1px; /* IE 7 quirks */ +} +.mblTooltipBefore .mblTooltipInnerArrow { + border-right-color: #5cb0ff; +} +.mblTooltipAfter .mblTooltipInnerArrow { + border-left-color: #5cb0ff; +} +.mblTooltipAbove .mblTooltipInnerArrow { + border-bottom-color: #5cb0ff; +} +.mblTooltipBelow .mblTooltipInnerArrow { + border-top-color: #5cb0ff; +} +.mblTooltip .mblHeading { + *padding: 0 9px 15px; + *border-top: 1px solid #5cb0ff; + *border-bottom: 1px solid #5cb0ff; + *width: auto; + *height: auto; + *overflow: visible; + *line-height: normal; +} +.dj_ie9 .mblTooltip .mblHeading { + width: auto; +} +.mblTooltip .mblHeading .mblToolBarButton { + *margin: auto 6px; +} diff --git a/js/dojo/dojox/mobile/themes/custom/Tooltip.css b/js/dojo/dojox/mobile/themes/custom/Tooltip.css new file mode 100644 index 0000000..2269de4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Tooltip.css @@ -0,0 +1,142 @@ +/* dojox.mobile.Tooltip */ +.mblTooltip { + position: absolute; + z-index: 2000; + display: block; + margin: 0; + padding: 8px; + border: #769dc0 1px solid; + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); + -webkit-border-radius: 5px; + opacity: .97; +} +.mblTooltipBubble { + overflow: visible; + padding: 3px; + background-color: #5cb0ff; + background-image: none; +} +.mblTooltipBubble.mblTooltipAbove .mblTooltipInnerArrow { + border-bottom-color: #5cb0ff; +} +.mblTooltipBubble.mblTooltipBelow .mblTooltipInnerArrow { + border-top-color: #5cb0ff; +} +.mblTooltipBubble.mblTooltipAfter .mblTooltipInnerArrow { + border-left-color: #5cb0ff; +} +.mblTooltipBubble.mblTooltipBefore .mblTooltipInnerArrow { + border-right-color: #5cb0ff; +} +.mblTooltip.mblTooltipAfter { + margin-left: -11px; +} +.mblTooltip.mblTooltipBefore { + margin-left: 11px; +} +.mblTooltip.mblTooltipAbove { + margin-top: 11px; +} +.mblTooltip.mblTooltipBelow { + margin-top: -11px; +} +.mblTooltipAnchor { + position: absolute; + width: 1px; + height: 1px; + background-color: transparent; + line-height: 0; + font-size: 0; +} +.mblTooltipBefore .mblTooltipAnchor { + left: -1px; +} +.mblTooltipAfter .mblTooltipAnchor { + right: -1px; +} +.mblTooltipAbove .mblTooltipAnchor { + top: -1px; +} +.mblTooltipBelow .mblTooltipAnchor { + bottom: -1px; +} +.mblTooltipArrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + border: 11px solid transparent; +} +.mblTooltipBefore .mblTooltipArrow { + left: auto; + right: 1px; + top: 0; + bottom: auto; + border-left-width: 0; + border-right-color: #769dc0; +} +.mblTooltipAfter .mblTooltipArrow { + left: 1px; + right: auto; + top: 0; + bottom: auto; + border-right-width: 0; + border-left-color: #769dc0; +} +.mblTooltipAbove .mblTooltipArrow { + top: auto; + bottom: 1px; + left: auto; + right: auto; + border-top-width: 0; + border-bottom-color: #769dc0; +} +.mblTooltipBelow .mblTooltipArrow { + top: 1px; + bottom: auto; + left: auto; + right: auto; + border-bottom-width: 0; + border-top-color: #769dc0; +} +.mblTooltipInnerArrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + border: 10px solid transparent; +} +.mblTooltipBefore .mblTooltipInnerArrow { + right: 0; + top: 0; + border-left-width: 0; + border-right-color: #deefff; +} +.mblTooltipAfter .mblTooltipInnerArrow { + left: 0; + top: 0; + border-right-width: 0; + border-left-color: #deefff; +} +.mblTooltipAbove .mblTooltipInnerArrow { + bottom: 0; + left: 0; + border-top-width: 0; + border-bottom-color: #ffffff; +} +.mblTooltipBelow .mblTooltipInnerArrow { + top: 0; + left: 0; + border-bottom-width: 0; + border-top-color: #aed8ff; +} +.mblTooltipHidden, .mblTooltipHidden * { + visibility: hidden !important; +} +.mblTooltip .mblHeading { + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + background-color: transparent; + background-image: none; +} diff --git a/js/dojo/dojox/mobile/themes/custom/Tooltip.less b/js/dojo/dojox/mobile/themes/custom/Tooltip.less new file mode 100644 index 0000000..60af6d1 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/Tooltip.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Tooltip.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/View.css b/js/dojo/dojox/mobile/themes/custom/View.css new file mode 100644 index 0000000..1600cde --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/View.css @@ -0,0 +1,24 @@ +@import url("../common/transitions/slide.css"); + +@import url("../common/transitions/flip.css"); + +@import url("../common/transitions/fade.css"); +/* dojox.mobile.View */ +.mblView { + position: relative; + top: 0px; + left: 0px; + width: 100%; + color: #131313; +} +.mblView.mblIn { + position: absolute; +} +.mblFixedHeaderBar { + z-index: 1; +} +.mblFixedBottomBar { + position: absolute !important; + width: 100%; + z-index: 1; +} diff --git a/js/dojo/dojox/mobile/themes/custom/View.less b/js/dojo/dojox/mobile/themes/custom/View.less new file mode 100644 index 0000000..910651f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/View.less @@ -0,0 +1,6 @@ +@import url("../common/transitions/slide.css"); +@import url("../common/transitions/flip.css"); +@import url("../common/transitions/fade.css"); + +@import "variables.less"; +@import "../common/View.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/base-compat.css b/js/dojo/dojox/mobile/themes/custom/base-compat.css new file mode 100644 index 0000000..9c9c207 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/base-compat.css @@ -0,0 +1,8 @@ +@import url("common-compat.css"); +@import url("Heading-compat.css"); +@import url("RoundRect-compat.css"); +@import url("RoundRectList-compat.css"); +@import url("EdgeToEdgeCategory-compat.css"); +@import url("ListItem-compat.css"); +@import url("Switch-compat.css"); +@import url("ProgressIndicator-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/custom/base.css b/js/dojo/dojox/mobile/themes/custom/base.css new file mode 100644 index 0000000..2409467 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/base.css @@ -0,0 +1,12 @@ +@import url("common.css"); +@import url("Heading.css"); +@import url("View.css"); +@import url("ToolBarButton.css"); +@import url("RoundRect.css"); +@import url("EdgeToEdgeCategory.css"); +@import url("RoundRectCategory.css"); +@import url("RoundRectList.css"); +@import url("EdgeToEdgeList.css"); +@import url("ListItem.css"); +@import url("Switch.css"); +@import url("ProgressIndicator.css"); diff --git a/js/dojo/dojox/mobile/themes/custom/common-compat.css b/js/dojo/dojox/mobile/themes/custom/common-compat.css new file mode 100644 index 0000000..963af00 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/common-compat.css @@ -0,0 +1,8 @@ +/* Button Colors */ +.mblColorBlue { + background-image: url(compat/ui-widget-bg.png); +} +/* Default Button Colors */ +.mblColorDefault { + background-image: url(compat/ui-widget-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/custom/common.css b/js/dojo/dojox/mobile/themes/custom/common.css new file mode 100644 index 0000000..8c097ff --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/common.css @@ -0,0 +1,31 @@ +html.mobile, .mobile body { + width: 100%; + margin: 0px; + padding: 0px; +} +.mobile body { + overflow-x: hidden; + -webkit-text-size-adjust: none; + background-color: #eff1f3; + font-family: Helvetica; + font-size: 14px; +} +/* Button Colors */ +.mblColorBlue { + background-color: #366EDF; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); +} +/* Default Button Colors */ +.mblColorDefault { + background-color: #5cb0ff; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(3.3333333333333335%, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); +} +.mblColorDefault.mblDomButton { + background-color: #5cb0ff; +} +.mblColorDefaultSel { + background-color: #0064c2; +} +.mblColorDefaultSel.mblDomButton { + background-color: #0064c2; +} diff --git a/js/dojo/dojox/mobile/themes/custom/common.less b/js/dojo/dojox/mobile/themes/custom/common.less new file mode 100644 index 0000000..4e57a5c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/common.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/common.less"; diff --git a/js/dojo/dojox/mobile/themes/custom/compat/arrow-button-head.png b/js/dojo/dojox/mobile/themes/custom/compat/arrow-button-head.png Binary files differnew file mode 100644 index 0000000..12dad4e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/compat/arrow-button-head.png diff --git a/js/dojo/dojox/mobile/themes/custom/compat/heading-bg.png b/js/dojo/dojox/mobile/themes/custom/compat/heading-bg.png Binary files differnew file mode 100644 index 0000000..22328a7 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/compat/heading-bg.png diff --git a/js/dojo/dojox/mobile/themes/custom/compat/slider-h-bar-bg.png b/js/dojo/dojox/mobile/themes/custom/compat/slider-h-bar-bg.png Binary files differnew file mode 100644 index 0000000..65510ba --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/compat/slider-h-bar-bg.png diff --git a/js/dojo/dojox/mobile/themes/custom/compat/ui-widget-bg.png b/js/dojo/dojox/mobile/themes/custom/compat/ui-widget-bg.png Binary files differnew file mode 100644 index 0000000..cb787cb --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/compat/ui-widget-bg.png diff --git a/js/dojo/dojox/mobile/themes/custom/custom-compat.css b/js/dojo/dojox/mobile/themes/custom/custom-compat.css new file mode 100644 index 0000000..f5a0140 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/custom-compat.css @@ -0,0 +1,18 @@ +@import url("base-compat.css"); + +/* common styles */ +@import url("../common/domButtons-compat.css"); +@import url("../common/SpinWheel-compat.css"); + +/* widget styles */ +@import url("Button-compat.css"); +@import url("CheckBox-compat.css"); +@import url("ComboBox-compat.css"); +@import url("IconContainer-compat.css"); +@import url("Opener-compat.css"); +@import url("RadioButton-compat.css"); +@import url("Slider-compat.css"); +@import url("TabBar-compat.css"); +@import url("TextArea-compat.css"); +@import url("TextBox-compat.css"); +@import url("ToggleButton-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/custom/custom.css b/js/dojo/dojox/mobile/themes/custom/custom.css new file mode 100644 index 0000000..a50e0ce --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/custom.css @@ -0,0 +1,22 @@ +@import url("base.css"); + +/* common styles */ +@import url("../common/domButtons.css"); +@import url("../common/FixedSplitter.css"); +@import url("../common/SpinWheel.css"); +@import url("../common/transitions.css"); + +/* widget styles */ +@import url("Button.css"); +@import url("Carousel.css"); +@import url("CheckBox.css"); +@import url("ComboBox.css"); +@import url("IconContainer.css"); +@import url("Opener.css"); +@import url("PageIndicator.css"); +@import url("RadioButton.css"); +@import url("Slider.css"); +@import url("TabBar.css"); +@import url("TextArea.css"); +@import url("TextBox.css"); +@import url("ToggleButton.css"); diff --git a/js/dojo/dojox/mobile/themes/custom/images/thumb-overlay-large.png b/js/dojo/dojox/mobile/themes/custom/images/thumb-overlay-large.png Binary files differnew file mode 100644 index 0000000..dfac370 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/images/thumb-overlay-large.png diff --git a/js/dojo/dojox/mobile/themes/custom/images/thumb-overlay-small.png b/js/dojo/dojox/mobile/themes/custom/images/thumb-overlay-small.png Binary files differnew file mode 100644 index 0000000..b6836d9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/images/thumb-overlay-small.png diff --git a/js/dojo/dojox/mobile/themes/custom/images/thumb-overlay.png b/js/dojo/dojox/mobile/themes/custom/images/thumb-overlay.png Binary files differnew file mode 100644 index 0000000..b16efec --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/images/thumb-overlay.png diff --git a/js/dojo/dojox/mobile/themes/custom/variables.less b/js/dojo/dojox/mobile/themes/custom/variables.less new file mode 100644 index 0000000..9c22efc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/custom/variables.less @@ -0,0 +1,921 @@ +//---------------------------------------------------------------- +// 1. Variables for quick setting +//---------------------------------------------------------------- + +// Default state variables +@theme-default-margin: 8px; +@theme-default-padding: 8px; +@theme-default-font-size: 14px; +@theme-default-font-family: Helvetica; +@theme-default-font-weight: normal; +@theme-default-text-shadow: none; +@theme-default-color: #131313; // numerical color value +@theme-default-border-color: #B5BCC7; // numerical color value +@theme-default-border-radius: 5px; +@theme-default-background-color: lighten(@theme-default-border-color, 20%); + +// Highlighting state variables +@theme-highlight-font-size: 18px; +@theme-highlight-font-family: @theme-default-font-family; +@theme-highlight-font-weight: bold; +@theme-highlight-text-shadow: rgba(0,0,0,0.2) 0px 1px 2px; +@theme-highlight-color: #000000; // numerical color value +@theme-highlight-border-color: #769DC0; // numerical color value +@theme-highlight-background-color: #5CB0FF; // numerical color value + +//---------------------------------------------------------------- +// 2. Variables for typical style setting +//---------------------------------------------------------------- + +// Color +@theme-heading-color: @theme-default-color; +@theme-heading-border-color: @theme-highlight-border-color; +@theme-heading-background-color: @theme-highlight-background-color; +@theme-dom-button-background-color: @theme-highlight-background-color; +@theme-tabbar-color: @theme-default-color; +@theme-round-rect-border-color: @theme-default-border-color; +@theme-round-rect-background-color: #FFFFFF; +@theme-round-rect-box-shadow: 5px 5px 5px @theme-round-rect-border-color; +@theme-category-color: @theme-highlight-color; +@theme-list-item-color: @theme-default-color; +@theme-list-item-border-color: @theme-default-border-color; +@theme-list-item-background-color: #FFFFFF; +@theme-ui-widget-color: @theme-default-color; +@theme-ui-widget-selected-color: @theme-highlight-color; +@theme-ui-widget-border-color: @theme-default-border-color; +@theme-ui-widget-selected-border-color: @theme-highlight-border-color; +@theme-ui-widget-background-color: @theme-highlight-background-color; +@theme-ui-widget-selected-background-color: darken(@theme-ui-widget-background-color, 30%); +@theme-ui-widget-checked-background-color: darken(@theme-ui-widget-background-color, 20%); +@theme-ui-widget-disabled-background-color: lighten(@theme-ui-widget-background-color, 10%); + +// Font +@theme-heading-font-size: @theme-highlight-font-size; +@theme-heading-font-family: @theme-highlight-font-family; +@theme-heading-font-weight: @theme-default-font-weight; +@theme-heading-text-shadow: @theme-highlight-text-shadow; +@theme-tabbar-font-size: @theme-default-font-size - 3; +@theme-tabbar-font-family: @theme-default-font-family; +@theme-tabbar-font-weight: @theme-default-font-weight; +@theme-category-font-size: @theme-highlight-font-size; +@theme-category-font-family: @theme-highlight-font-family; +@theme-category-font-weight: @theme-default-font-weight; +@theme-category-text-shadow: @theme-highlight-text-shadow; +@theme-list-item-font-size: @theme-highlight-font-size; +@theme-list-item-font-family: @theme-default-font-family; +@theme-list-item-font-weight: @theme-default-font-weight; +@theme-list-item-text-shadow: none; +@theme-ui-widget-font-size: @theme-default-font-size; +@theme-ui-widget-font-family: @theme-default-font-family; +@theme-ui-widget-font-weight: @theme-default-font-weight; +@theme-ui-widget-text-shadow: none; + +// Size +@theme-heading-height: 40px; +@theme-tabbar-height: 50px; +@theme-category-height: 30px; +@theme-list-item-height: 50px; +@theme-icon-item-height: 65px; +@theme-icon-item-width: 65px; +@theme-ui-widget-height: 30px; +@theme-ui-widget-width: 90px; + +@theme-ui-widget-border-radius: 2px; // square style +//@theme-ui-widget-border-radius: @theme-default-border-radius; // round style +//@theme-ui-widget-border-radius: @theme-ui-widget-height * 0.5; // oval style + +// background-image gradation +._background-image-gradient-mask-heading () { + @delta: 1% / @theme-heading-height * 100; + // claro gradation + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, rgba(255, 255, 255, 1)), color-stop(@delta * 1, rgba(255, 255, 255, 1)), color-stop(@delta * 1, rgba(255, 255, 255, 0.14)), color-stop(@delta * 2, rgba(255, 255, 255, 0.14)), color-stop(@delta * 2, rgba(255, 255, 255, 0.52)), color-stop(@delta * 3, rgba(255, 255, 255, 0.52)), color-stop(@delta * 3, rgba(255, 255, 255, 0.68)), color-stop(@delta * 4, rgba(255, 255, 255, 0.68)), color-stop(1, rgba(255, 255, 255, 0))); +} +._background-image-gradient-mask-ui-widget () { + @delta: 1% / @theme-ui-widget-height * 100; + // claro gradation + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, rgba(255, 255, 255, 1)), color-stop(@delta * 1, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); +} +._background-image-gradient-mask-ui-widget-r () { // for .mblArrowButtonHead-styles + @delta: 1% / @theme-ui-widget-height * 100; + // claro gradation + background-image: -webkit-gradient(linear, left top, right bottom, color-stop(0, rgba(255, 255, 255, 1)), color-stop(@delta * 1, rgba(255, 255, 255, 0.1)), color-stop(0.5, rgba(255, 255, 255, 0.6)), color-stop(1, rgba(255, 255, 255, 0.3))); +} + +// dojox.mobile fixed variables +@mbl-dom-button-size: 29px; +@mbl-switch-height: 27px; + +// Application's customizable variables +@appl-list-item-icon-size: 29px; // size of ListItemIcon + +//---------------------------------------------------------------- +// 3. Variables for dojox.mobile Widgets +//---------------------------------------------------------------- + +//---------------------------------------------------------------- +// common.less +//---------------------------------------------------------------- +// .mobile body +.mobile-body-styles () { + background-color: @theme-default-background-color; + font-family: @theme-default-font-family; + font-size: @theme-default-font-size; +} +// .mblView +.mblView-styles () { + color: @theme-default-color; +} +// .mblColorBlue +.mblColorBlue-styles () { + background-color: #366EDF; + ._background-image-gradient-mask-ui-widget; +} +// .mblColorDefault +.mblColorDefault-styles () { + background-color: @theme-ui-widget-background-color; + ._background-image-gradient-mask-ui-widget; + &.mblDomButton { + background-color: @theme-dom-button-background-color; + } +} +// .mblColorDefaultSel +.mblColorDefaultSel-styles () { + background-color: @theme-ui-widget-selected-background-color; + &.mblDomButton { + background-color: @theme-ui-widget-selected-background-color; + } +} + +//---------------------------------------------------------------- +// Heading.less +//---------------------------------------------------------------- +@_heading-inner-margin: (@theme-heading-height - @theme-ui-widget-height) * 0.5; +.mblHeading-styles () { + padding: 0; + height: @theme-heading-height; + background-color: @theme-heading-background-color; + ._background-image-gradient-mask-heading(); + border-bottom: 1px solid @theme-heading-border-color; + color: @theme-heading-color; + font-size: @theme-heading-font-size; + font-family: @theme-heading-font-family; + font-weight: @theme-heading-font-weight; + text-shadow: @theme-heading-text-shadow; + text-align: center; + line-height: @theme-heading-height + 2; +} +.mblArrowButton-styles () { + height: @theme-ui-widget-height; + margin: 0px @theme-default-margin; +} +.mblArrowButtonHead-styles () { + top: @_heading-inner-margin; + left: @_heading-inner-margin + @theme-ui-widget-height * 0.4; // = 0.5 * 0.9 + width: @theme-ui-widget-height * 0.7; + height: @theme-ui-widget-height * 0.7; + border: 1px solid @theme-ui-widget-border-color; + -webkit-transform-origin: left top; + -webkit-transform: scale(0.9,0.99) rotate(45deg); + background-color: @theme-ui-widget-background-color; + ._background-image-gradient-mask-ui-widget-r; +} +.mblArrowButtonHeadChrome-styles () { + border-style: inset; +} +.mblArrowButtonBody-styles () { + top: @_heading-inner-margin; + left: @_heading-inner-margin + @theme-ui-widget-height * 0.4; + padding: 0px 10px 0px 3px; + height: @theme-ui-widget-height; + border-width: 1px 1px 1px 0px; + border-style: inset; + border-color: @theme-ui-widget-border-color; + font-size: @theme-ui-widget-font-size; + font-family: @theme-ui-widget-font-family; + font-weight: @theme-ui-widget-font-weight; + text-shadow: @theme-ui-widget-text-shadow; + color: @theme-ui-widget-color; + line-height: @theme-ui-widget-height; + -webkit-border-top-right-radius: @theme-ui-widget-border-radius; + -webkit-border-bottom-right-radius: @theme-ui-widget-border-radius; + background-color: @theme-ui-widget-background-color; + ._background-image-gradient-mask-ui-widget; +} +.mblArrowButtonSelected-styles () { + background-color: @theme-ui-widget-selected-background-color; +} +.mblArrowButtonHeadSelected-styles () { +} +.mblArrowButtonBodySelected-styles () { +} + +//---------------------------------------------------------------- +// ToolBarButton.less +//---------------------------------------------------------------- +.mblToolBarButton-styles () { + margin: @theme-default-margin; + height: @theme-ui-widget-height; + border: 1px inset @theme-ui-widget-border-color; + -webkit-border-radius: @theme-ui-widget-border-radius; + font-size: @theme-ui-widget-font-size; + font-family: @theme-ui-widget-font-family; + font-weight: @theme-ui-widget-font-weight; + text-shadow: @theme-ui-widget-text-shadow; + color: @theme-ui-widget-color; + line-height: @theme-ui-widget-height; + text-align: center; + &.mblArrowButtonText { + margin: ((@theme-heading-height + 2 - @theme-ui-widget-height) * 0.5) @theme-default-margin; + } +} +.mblToolBarButtonDomButton-styles () { +} +.mblToolBarButtonIcon-styles () { + top: 2px; +} + +//---------------------------------------------------------------- +// RoundRect.less +//---------------------------------------------------------------- +.mblRoundRect-styles () { + margin: @theme-default-margin @theme-default-margin (@theme-default-margin * 1.5); + padding: @theme-default-padding; + border: 1px solid @theme-round-rect-border-color; + -webkit-border-radius: @theme-default-border-radius; + background-color: @theme-round-rect-background-color; + font-size: @theme-list-item-font-size; + font-family: @theme-list-item-font-family; + font-weight: @theme-list-item-font-weight; + text-shadow: @theme-list-item-text-shadow; +} +.mblRoundRectShadowBox-styles () { + -webkit-box-shadow: @theme-round-rect-box-shadow; +} + +//---------------------------------------------------------------- +// EdgeToEdgeCategory.less +//---------------------------------------------------------------- +.mblEdgeToEdgeCategory-styles () { + margin: 0; + padding: 0 @theme-default-padding; + height: @theme-category-height; + border-bottom: 1px solid @theme-default-border-color; + background-color: @theme-highlight-background-color; + ._background-image-gradient-mask-heading(); + font-size: @theme-category-font-size; + font-family: @theme-category-font-family; + font-weight: @theme-category-font-weight; + text-shadow: @theme-category-text-shadow; + color: @theme-category-color; + line-height: @theme-category-height + 2; +} + +//---------------------------------------------------------------- +// RoundRectCategory.less +//---------------------------------------------------------------- +.mblRoundRectCategory-styles () { + margin: 0; + padding: @theme-default-margin @theme-default-margin 0; + font-size: @theme-category-font-size; + font-family: @theme-category-font-family; + font-weight: @theme-category-font-weight; + text-shadow: @theme-category-text-shadow; + color: @theme-category-color; + line-height: @theme-category-height; +} + +//---------------------------------------------------------------- +// RoundRectList.less +//---------------------------------------------------------------- +.mblRoundRectList-styles () { + margin: @theme-default-margin @theme-default-margin (@theme-default-margin * 1.5); + padding: 0; + border: 1px solid @theme-default-border-color; + -webkit-border-radius: @theme-default-border-radius; + background-color: @theme-list-item-background-color; + -webkit-box-shadow: @theme-round-rect-box-shadow; +} +.mblRoundRectList-withCategory-styles () { +} +.mblRoundRectList-FirstListItem-styles () { + -webkit-border-top-left-radius: @theme-default-border-radius; + -webkit-border-top-right-radius: @theme-default-border-radius; +} +.mblRoundRectList-withCategory-FirstListItem-styles () { +} +.mblRoundRectList-LastListItem-styles () { + border-bottom-width: 0px; + -webkit-border-bottom-left-radius: @theme-default-border-radius; + -webkit-border-bottom-right-radius: @theme-default-border-radius; +} + +//---------------------------------------------------------------- +// EdgeToEdgeList.less +//---------------------------------------------------------------- +.mblEdgeToEdgeList-styles () { + margin: 0; + padding: 0; + background-color: @theme-list-item-background-color; +} +.mblEdgeToEdgeList-LastListItem-styles () { + border-bottom-color: @theme-list-item-border-color; +} + +//---------------------------------------------------------------- +// ListItem.less +//---------------------------------------------------------------- +.mblListItem-styles () { + padding: 0 0 0 @theme-default-margin; + height: @theme-list-item-height; + border-bottom: 1px solid @theme-list-item-border-color; + font-size: @theme-list-item-font-size; + font-family: @theme-list-item-font-family; + font-weight: @theme-list-item-font-weight; + text-shadow: @theme-list-item-text-shadow; + color: @theme-list-item-color; + line-height: @theme-list-item-height; +} +.mblListItem-mblVariableHeight-styles () { + padding: 11px 0px 10px 6px; + line-height: normal; +} +.mblListItem-mblListItemAnchor-styles () { + background-position: 9px 7px; + text-decoration: none; + padding-right: 7px; +} +.mblItemSelected-styles () { + background-color: @theme-highlight-background-color; + ._background-image-gradient-mask-ui-widget; +} +.mblItemSelected-mblListItemAnchor-styles () { + color: @theme-highlight-color; +} +.mblItemSelected-mblDomButton-Div-styles () { + border-color: white; +} +.mblItemSelected-mblListItemSubText-styles () { +} +.mblListItemTextBoxSelected-styles () { + background-color: @theme-highlight-background-color; +} +.mblListItemChecked-styles () { + color: @theme-highlight-color; +} +.mblListItemIcon-styles () { + margin-top: (@theme-list-item-height - @appl-list-item-icon-size) * 0.5; + margin-right: 11px; +} +.mblListItemSpriteIcon-styles () { + margin-top: (@theme-list-item-height - @appl-list-item-icon-size) * 0.5; + margin-left: 8px; +} +.mblListItemRightIcon-styles () { + margin-top: (@theme-list-item-height - @appl-list-item-icon-size) * 0.5; +} +.mblListItemRightText-styles () { + color: @theme-default-color; + margin: ((@theme-list-item-height - (@theme-list-item-font-size + 4)) * 0.5) 4px 0 0; +} +.mblListItemTextBox-styles () { +} +.mblListItemAnchorNoIcon-mblListItemTextBox-styles () { +} +.mblListItemSubText-styles () { +} + +//---------------------------------------------------------------- +// Switch.less +//---------------------------------------------------------------- +.mblItemSwitch-styles () { + top: (@theme-list-item-height - @mbl-switch-height + 1) * 0.5; +} +.mblSwitchBg-styles () { + border-color: @theme-ui-widget-border-color; + -webkit-border-radius: @theme-ui-widget-border-radius; + ._background-image-gradient-mask-ui-widget; +} +.mblSwitchBgLeft-styles () { + background-color: @theme-ui-widget-checked-background-color; + color: @theme-ui-widget-color; +} +.mblSwitchBgRight-styles () { + background-color: @theme-ui-widget-disabled-background-color; +} +.mblSwitchKnob-styles () { + border-color: darken(@theme-ui-widget-border-color, 20%); + background-color: @theme-ui-widget-background-color; + ._background-image-gradient-mask-ui-widget; + -webkit-border-radius: @theme-ui-widget-border-radius; +} + +//---------------------------------------------------------------- +// Button.less +//---------------------------------------------------------------- +.mblButton-styles () { + padding: 0 @theme-default-padding; + height: @theme-ui-widget-height; + border: 1px outset @theme-ui-widget-border-color; + color: @theme-ui-widget-color; + font-size: @theme-ui-widget-font-size; + font-family: @theme-ui-widget-font-family; + font-weight: @theme-ui-widget-font-weight; + line-height: @theme-ui-widget-height; + background-color: @theme-ui-widget-background-color; + ._background-image-gradient-mask-ui-widget; + -webkit-border-radius: @theme-ui-widget-border-radius; +} +.mblButton-mblBlueButton-styles () { + color: @theme-ui-widget-color; + background-color: #0000FF; +} +.mblButton-mblBlueButtonSelected-styles () { + color: @theme-ui-widget-selected-color; + border-color: @theme-ui-widget-selected-border-color; + background-color: darken(#0000FF, 30%); +} +.mblButton-mblRedButton-styles () { + color: @theme-ui-widget-color; + background-color: #FF0000; +} +.mblButton-mblRedButtonSelected-styles () { + color: @theme-ui-widget-selected-color; + border-color: @theme-ui-widget-selected-border-color; + background-color: darken(#FF0000, 30%); +} +.mblButtonSelected-styles () { + color: @theme-ui-widget-selected-color; + border-color: @theme-ui-widget-selected-border-color; + background-color: @theme-ui-widget-selected-background-color; +} +.mblButtonDisabled-styles () { + color: grey; + border-color: grey; + background-color: @theme-ui-widget-disabled-background-color; +} + +//---------------------------------------------------------------- +// CheckBox.less +//---------------------------------------------------------------- +.mblCheckBox-styles () { + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + font-size: @theme-highlight-font-size; + border: 1px outset @theme-ui-widget-border-color; + background-color: @theme-ui-widget-background-color; + ._background-image-gradient-mask-ui-widget; + -webkit-border-radius: @theme-ui-widget-border-radius; + -webkit-transform: translateY(0.45em); +} +.mblCheckBoxSelected-styles () { + border-color: @theme-ui-widget-selected-border-color; + background-color: @theme-ui-widget-selected-background-color; +} +.mblCheckBoxChecked-styles () { + border-color: @theme-ui-widget-selected-border-color; + background-color: @theme-ui-widget-checked-background-color; +} +.mblCheckBoxChecked-after-styles () { + content: ""; + width: 0.3em; + height: 0.6em; + position: absolute; + top: 0; + left: 0.3em; + border-color: @theme-ui-widget-selected-color; + border-width: 0.15em; + border-style: none solid solid none; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblCheckBoxChecked-mblCheckBoxSelected-styles () { + border-color: @theme-ui-widget-selected-border-color; + background-color: @theme-ui-widget-selected-background-color; +} +.mblCheckBoxChecked-mblCheckBoxSelected-after-styles () { + border-color: @theme-ui-widget-selected-color; +} + +//---------------------------------------------------------------- +// ComboBox.less +//---------------------------------------------------------------- +.dijitPopup-styles () { + -webkit-box-shadow: 0px 0px 50px black; + -webkit-border-radius: @theme-default-border-radius; +} +.mblComboBoxMenu-styles () { + border: 1px solid black; + background-color: @theme-default-background-color; + -webkit-border-radius: @theme-default-border-radius; +} +.mblComboBoxMenuItem-styles () { + text-align: left; + padding: .1em .2em; + color: @theme-default-color; + border-width: 1px 0 1px 0; + border-style: solid; + border-color: @theme-default-background-color; +} +.mblComboBoxMenuItemSelected-styles () { + color: @theme-highlight-color; + background-color: @theme-highlight-background-color; + ._background-image-gradient-mask-ui-widget; +} +.mblComboBoxMenuPreviousButton-styles () { + font-style: italic; + overflow: hidden; +} + +//---------------------------------------------------------------- +// IconContainer.less +//---------------------------------------------------------------- +.mblIconContainer-styles () { + margin: @theme-default-margin 0 @theme-default-margin @theme-default-margin; + padding: @theme-default-padding 0 @theme-default-padding; + background-color: @theme-default-background-color; +} + +//---------------------------------------------------------------- +// IconItem.less +//---------------------------------------------------------------- +.mblIconItemTerminator-styles () { + height: @theme-default-margin; +} +.mblIconItemSub-styles () { + margin-left: -@theme-default-margin; + background-color: white; + color: @theme-default-color; +} +.mblIconArea-styles () { + height: @theme-icon-item-height + @theme-default-font-size + @theme-default-margin; + width: @theme-icon-item-width + @theme-default-margin; + text-align: center; + font-family: @theme-default-font-family; + font-weight: @theme-default-font-weight; + font-size: @theme-default-font-size; +} +.mblContent-styles () { + padding-bottom: @theme-default-margin; +} +.mblIconContentHeading-styles () { + margin-top: 0px; + padding-left: @mbl-dom-button-size + @theme-default-margin; + height: @mbl-dom-button-size - 4; + border-top: 1px solid lighten(@theme-heading-border-color, 30%); + border-bottom: 1px solid @theme-heading-border-color; + background-color: @theme-heading-background-color; + ._background-image-gradient-mask-heading(); + color: @theme-heading-color; + font-size: @theme-default-font-size; + font-family: @theme-heading-font-family; + font-weight: @theme-heading-font-weight; + text-shadow: @theme-heading-text-shadow; + line-height: @mbl-dom-button-size - 3; +} + +//---------------------------------------------------------------- +// RadioButton.less +//---------------------------------------------------------------- +.mblRadioButton-styles () { + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + font-size: @theme-highlight-font-size; + border: 1px outset @theme-ui-widget-border-color; + background-color: @theme-ui-widget-background-color; + ._background-image-gradient-mask-ui-widget; + -webkit-border-radius: 0.5em; + -webkit-transform: translateY(0.45em); +} +.mblRadioButtonChecked-styles () { + border-color: @theme-ui-widget-selected-border-color; + background-color: @theme-ui-widget-checked-background-color; +} +.mblRadioButtonChecked-after-styles () { + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.25em; + border-color: @theme-ui-widget-selected-color; + border-width: 0.15em; + border-style: none solid solid none; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblRadioButtonChecked-Selected-styles () { + border-color: @theme-ui-widget-selected-border-color; + background-color: @theme-ui-widget-selected-background-color; +} +.mblRadioButtonChecked-Selected-after-styles () { + border-color: @theme-ui-widget-selected-color; +} + +//---------------------------------------------------------------- +// Slider.less +//---------------------------------------------------------------- +.mblSlider-styles () { + margin: 15px; /* 1/2 handle width for hanging off the ends of the bar */ + border: 1px outset @theme-ui-widget-border-color; + background-color: @theme-ui-widget-disabled-background-color; + ._background-image-gradient-mask-ui-widget; + -webkit-border-radius: @theme-ui-widget-border-radius; +} +.mblSliderProgressBar-styles () { + -webkit-border-radius: @theme-ui-widget-border-radius; + background-color: @theme-ui-widget-selected-background-color; + ._background-image-gradient-mask-ui-widget; +} +.mblSliderHandle-styles () { + margin: -10px 0 0 -10px; + width: 18px; + height: 18px; + border: 1px outset @theme-ui-widget-border-color; + background-color: @theme-ui-widget-background-color; + ._background-image-gradient-mask-ui-widget; + -webkit-border-radius: @theme-ui-widget-border-radius; +} + +//---------------------------------------------------------------- +// TabBar.less +//---------------------------------------------------------------- +.mblTabBar-styles () { + margin: 0; + padding: 0; + height: @theme-tabbar-height; + background-color: @theme-heading-background-color; + ._background-image-gradient-mask-ui-widget; + border-bottom: 1px solid @theme-heading-border-color; + color: @theme-heading-color; + text-align: center; +} +.mblTabBar-TabBarButton-styles () { + padding: ((@theme-tabbar-height - @mbl-dom-button-size - @theme-tabbar-font-size) * 0.5) 0; +} +.mblTabBar-TabBarButton-Selected-styles () { + border-color: @theme-ui-widget-selected-border-color; + background-color: @theme-ui-widget-selected-background-color; + ._background-image-gradient-mask-ui-widget; + -webkit-border-radius: @theme-ui-widget-border-radius; +} +.mblTabBarButtonDiv-styles () { + height: @mbl-dom-button-size; + width: @mbl-dom-button-size; +} +.mblTabBarButtonIcon-styles () { + left: 0; + top: 0; +} +.mblTabBarButtonTextBox-styles () { + color: @theme-tabbar-color; + font-family: @theme-tabbar-font-family; + font-size: @theme-tabbar-font-size; + font-weight: @theme-tabbar-font-weight; +} +.mblTabBarNoIcons-TabBarButtonTextBox-styles () { + line-height: @theme-tabbar-height - @theme-tabbar-font-size; + font-size: @theme-tabbar-font-size + 6; +} +.mblTabButton-styles () { + width: @theme-ui-widget-width; + height: @theme-ui-widget-height; + border-width: 1px 1px 1px 0px; + border-style: inset; + border-color: @theme-default-border-color; + border-right-color: @theme-ui-widget-border-color; + background-color: @theme-ui-widget-background-color; + ._background-image-gradient-mask-ui-widget; + font-family: @theme-default-font-family; + font-size: @theme-default-font-size; + font-weight: @theme-default-font-weight; + color: @theme-default-color; + text-align: center; + line-height: @theme-ui-widget-height; +} +.mblTabButton-TabBarButtonAnchor-styles () { + height: @theme-ui-widget-height; +} +.mblTabBarTop-TabButton-TabBarButtonDiv-styles () { + display: none; +} +.mblTabBarHead-TabButton-TabBarButtonDiv-styles () { +} +.mblTabButton-FirstTabButtom-styles () { + -webkit-border-top-left-radius: @theme-ui-widget-border-radius; + -webkit-border-bottom-left-radius: @theme-ui-widget-border-radius; + border-left-width: 1px; +} +.mblTabButton-LastTabButton-styles () { + -webkit-border-top-right-radius: @theme-ui-widget-border-radius; + -webkit-border-bottom-right-radius: @theme-ui-widget-border-radius; + border-right-color: @theme-ui-widget-border-color; +} +.mblTabButton-img-styles () { +} +.mblTabBarButtonTextBoxSelected-styles () { + color: @theme-ui-widget-selected-color; +} +.mblTabButtonSelected-styles () { + background-color: @theme-ui-widget-selected-background-color; +} +.mblTabButtonHighlighted-styles () { + background-color: @theme-ui-widget-checked-background-color; +} +.mblTabButtonImgDiv-styles () { + display: none; +} +.mblTabPanelHeader-styles () { + margin: 0; + padding: 0; + height: @theme-heading-height; + background-color: @theme-heading-background-color; + ._background-image-gradient-mask-heading(); + border-bottom: 1px solid @theme-heading-border-color; + color: @theme-heading-color; + font-size: @theme-heading-font-size; + font-family: @theme-heading-font-family; + font-weight: @theme-heading-font-weight; + text-shadow: @theme-heading-text-shadow; + text-align: center; + line-height: @theme-heading-height + 2; +} +.mblTabPanelHeader-TabButton-styles () { + margin-top: (@theme-heading-height - @theme-ui-widget-height - 2) * 0.5; +} +.mblTabPanelHeader-TabButtonSelected-styles () { + background-color: @theme-ui-widget-selected-background-color; +} +.mblTabPanelHeader-TabButtonDomButton-styles () { + width: 43px; +} +.mblTabPanelHeader-TabButtonDomButtonClass-styles () { + left: 8px; +} +.mblTabPanelHeader-DomButton-styles () { +} +.mblTabPanelHeader-inHeading-styles () { +} +.mblTabPanelHeader-TabButton-inHeading-styles () { + margin-top: (@theme-heading-height - @theme-ui-widget-height) * 0.5; +} +.mblTabPanelHeader-TabButton-FirstTabButtom-inHeading-styles () { + -webkit-border-top-left-radius: @theme-ui-widget-border-radius; + -webkit-border-bottom-left-radius: @theme-ui-widget-border-radius; + border-left-width: 1px; +} +.mblTabPanelHeader-TabButton-LastTabButtom-inHeading-styles () { + -webkit-border-top-right-radius: @theme-ui-widget-border-radius; + -webkit-border-bottom-right-radius: @theme-ui-widget-border-radius; +} +.mblTabPanelHeader-TabButtonSelected-inHeading-styles () { +} + +//---------------------------------------------------------------- +// TextArea.less +//---------------------------------------------------------------- +.mblTextArea-styles () { + padding: 4px 1px; + border: @theme-default-border-color 1px inset; + font-family: @theme-default-font-family; + font-size: @theme-default-font-size; + -webkit-border-radius: @theme-default-border-radius; +} +.mblExpandingTextArea-styles () { + margin: 2px; +} + +//---------------------------------------------------------------- +// TextBox.less +//---------------------------------------------------------------- +.mblTextBox-styles () { + height: @theme-ui-widget-height; + border: @theme-default-border-color 1px inset; + font-family: @theme-default-font-family; + font-size: @theme-default-font-size; + -webkit-border-radius: @theme-default-border-radius; +} + +//---------------------------------------------------------------- +// ToggleButton.less +//---------------------------------------------------------------- +.mblToggleButton-styles () { + padding: 0 @theme-default-padding 0 (@theme-default-padding + 15px); + height: @theme-ui-widget-height; + border: 1px outset @theme-ui-widget-border-color; + -webkit-border-radius: @theme-ui-widget-border-radius; + background-color: @theme-ui-widget-background-color; + ._background-image-gradient-mask-ui-widget; + font-family: @theme-ui-widget-font-family; + font-weight: @theme-ui-widget-font-weight; + line-height: @theme-ui-widget-height; + color: @theme-ui-widget-color; + line-height: @theme-ui-widget-height; +} +.mblToggleButtonSelected-styles () { + border-color: @theme-ui-widget-selected-border-color; + background-color: @theme-ui-widget-selected-background-color; +} +.mblToggleButtonChecked-styles () { + border-color: @theme-ui-widget-selected-border-color; + background-color: @theme-ui-widget-checked-background-color; +} +.mblToggleButtonChecked-after-styles () { + content: ""; + top: (@theme-ui-widget-height - 15) * 0.5; + left: 7px; + width: 5px; + height: 10px; + border-color: @theme-ui-widget-selected-color; + border-width: 0.15em; + border-style: none solid solid none; + -webkit-transform: rotate(45deg) skew(10deg); + -webkit-transform-origin: 50% 50%; +} +.mblToggleButtonCheckedSelected-styles () { + border-color: @theme-ui-widget-selected-border-color; + background-color: @theme-ui-widget-selected-background-color; +} +.mblToggleButtonCheckedSelected-after-styles () { + border-color: @theme-ui-widget-selected-color; +} +.mblToggleButtonDisabled-styles () { + color: grey; + border-color: grey; + background-color: @theme-ui-widget-disabled-background-color; +} + +// Overlay.less +.mblOverlay-styles () { + background-color: @theme-default-background-color; + ._background-image-gradient-mask-ui-widget; +} + +// Tooltip.less +.mblTooltip-styles () { + padding: @theme-default-padding; + border: @theme-heading-border-color 1px solid; + background-color: @theme-heading-background-color; + ._background-image-gradient-mask-ui-widget; + -webkit-border-radius: @theme-default-border-radius; + opacity: .97; +} +.mblTooltipBubble-styles () { + background-color: @theme-heading-background-color; + background-image: none; +} +.mblTooltipInnerArrow-Bubble-Above-styles () { + border-bottom-color: @theme-heading-background-color; +} +.mblTooltipInnerArrow-Bubble-Below-styles () { + border-top-color: @theme-heading-background-color; +} +.mblTooltipInnerArrow-Bubble-After-styles () { + border-left-color: @theme-heading-background-color; +} +.mblTooltipInnerArrow-Bubble-Before-styles () { + border-right-color: @theme-heading-background-color; +} +.mblTooltipArrow-styles () { + border: 11px solid transparent; +} +.mblTooltipArrow-Before-styles () { + border-left-width: 0; + border-right-color: @theme-heading-border-color; +} +.mblTooltipArrow-After-styles () { + border-right-width: 0; + border-left-color: @theme-heading-border-color; +} +.mblTooltipArrow-Above-styles () { + border-top-width: 0; + border-bottom-color: @theme-heading-border-color; +} +.mblTooltipArrow-Below-styles () { + border-bottom-width: 0; + border-top-color: @theme-heading-border-color; +} +.mblTooltipInnerArrow-Before-styles () { + border-left-width: 0; + border-right-color: @theme-heading-background-color * 0.2 + #ffffff * 0.8; +} +.mblTooltipInnerArrow-After-styles () { + border-right-width: 0; + border-left-color: @theme-heading-background-color * 0.2 + #ffffff * 0.8; +} +.mblTooltipInnerArrow-Above-styles () { + border-top-width: 0; + border-bottom-color: @theme-heading-background-color * 0.0 + #ffffff * 1.0; +} +.mblTooltipInnerArrow-Below-styles () { + border-bottom-width: 0; + border-top-color: @theme-heading-background-color * 0.5 + #ffffff * 0.5; +} +.mblTooltip-Heading-styles () { + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + background-color: transparent; + background-image: none; +} +.mblTooltip-Heading-ToolbarButton-styles () { +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Button-compat.css b/js/dojo/dojox/mobile/themes/iphone/Button-compat.css new file mode 100644 index 0000000..dccf89b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Button-compat.css @@ -0,0 +1,33 @@ +/* dojox.mobile.Button */ +.mblButton { + background-color: #cfcfcf; + background-image: url(compat/button-bg.png); + background-repeat: repeat-x; + -moz-border-radius: 5px; + -o-border-radius: 5px; + -ms-border-radius: 5px; + border-radius: 5px; +} +.mblButtonSelected { + background-color: #c0c0c0; + background-image: url(compat/button-sel-bg.png); +} +.mblButtonDisabled { + background-image: none; +} +.mblBlueButton { + background-color: #2261dd; + background-image: url(compat/blue-button-bg.png); +} +.mblBlueButtonSelected { + background-color: #4a6c9b; + background-image: url(compat/blue-button-sel-bg.png); +} +.mblRedButton { + background-color: #ee4115; + background-image: url(compat/red-button-bg.png); +} +.mblRedButtonSelected { + background-color: #9b6c4a; + background-image: url(compat/red-button-sel-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Button.css b/js/dojo/dojox/mobile/themes/iphone/Button.css new file mode 100644 index 0000000..9ed5a9d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Button.css @@ -0,0 +1,45 @@ +/* dojox.mobile.Button */ +.mblButton { + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + padding: 0px 10px; + height: 29px; + border: #9CACC0 1px outset; + -webkit-border-radius: 5px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd), to(#cecece), color-stop(0.5, #f8f8f8), color-stop(0.5, #eeeeee)); + color: black; + font-family: Helvetica; + font-size: 13px; + line-height: 29px; +} +.mblButton.mblBlueButton { + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7a9de9), to(#2362dd), color-stop(0.5, #366edf), color-stop(0.5, #215fdc)); + color: white; +} +.mblButton.mblBlueButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#8ea4c1), to(#4a6c9b), color-stop(0.5, #5877a2), color-stop(0.5, #476999)); + color: white; +} +.mblButton.mblRedButton { + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fa9d58), to(#ee4115), color-stop(0.5, #ff4d25), color-stop(0.5, #ed4d15)); + color: white; +} +.mblButton.mblRedButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#c1a48e), to(#9b6c4a), color-stop(0.5, #a27758), color-stop(0.5, #996947)); + color: white; +} +.mblButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0f0), to(#bfbfbf), color-stop(0.5, #ebebeb), color-stop(0.5, #dedede)); + color: black; +} +.mblButtonDisabled, .mblButton:disabled { + cursor: default; + border-color: grey; + background-image: none; + color: grey; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Button.less b/js/dojo/dojox/mobile/themes/iphone/Button.less new file mode 100644 index 0000000..ab3a96c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Button.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Button.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/Carousel.css b/js/dojo/dojox/mobile/themes/iphone/Carousel.css new file mode 100644 index 0000000..a415950 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Carousel.css @@ -0,0 +1,60 @@ +/* dojox.mobile.Carousel */ +.mblCarousel { + overflow: hidden; +} +.mblCarouselBox { + position: relative; + float: left; +} +.mblCarouselImg { + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5); + vertical-align: bottom; +} +.mblCarouselImgSelected { + border: 1px dashed #C0C0C0; + -webkit-box-shadow: none; +} +.mblCarouselImgHeaderText { + color: white; + font: 14px arial, helvetica, clean, sans-serif; +} +.mblCarouselImgFooterText { + color: white; + font: 14px arial, helvetica, clean, sans-serif; +} +.mblCarouselHeaderBar { + background-color: #3A3A3B; + color: #B1B1B1; + font: bold 16px arial, helvetica, clean, sans-serif; + padding: 1px; +} +.mblCarouselBtnContainer { + float: right; +} +.mblCarouselBtn { + height: 18px; + width: 46px; + font: bold 14px arial, helvetica, clean, sans-serif; + color: gray; + padding-top: 0px; + margin: 0px 2px; + border-width: 1px; + /* workaround for android problem */ + +} +.mblCarouselTitle { + margin: 2px 0px 2px 4px; +} +.mblCarouselHeaderBar .mblPageIndicator { + float: right; + width: auto; + padding: 0px 20px; +} +.mblCarouselHeaderBar .mblPageIndicatorContainer { + margin-left: 0px; + margin-right: 0px; +} +.mblCarouselPages { + position: relative; + text-align: center; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Carousel.less b/js/dojo/dojox/mobile/themes/iphone/Carousel.less new file mode 100644 index 0000000..d717397 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Carousel.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Carousel.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/CheckBox-compat.css b/js/dojo/dojox/mobile/themes/iphone/CheckBox-compat.css new file mode 100644 index 0000000..99aade2 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/CheckBox-compat.css @@ -0,0 +1,36 @@ +/* dojox.mobile.CheckBox */ +.mblCheckBox { + background-image: url(compat/button-bg.png); + -moz-border-radius: 5px; + -o-border-radius: 5px; + -ms-border-radius: 5px; + border-radius: 5px; + -moz-appearance: none; + -o-appearance: none; + -ms-appearance: none; + appearance: none; + -o-transform: translateY(0.45em); + -ms-transform: translateY(0.45em); + transform: translateY(0.45em); +} +.mblCheckBoxSelected { + background-image: url(compat/button-sel-bg.png); +} +.mblCheckBoxChecked, +.mblCheckBox:checked { + background-image: url(compat/blue-button-bg.png); +} +.mblCheckBoxChecked::after, +.mblCheckBox:checked::after { + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; +} +.mblCheckBoxChecked.mblCheckBoxSelected { + background-image: url(compat/blue-button-sel-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/CheckBox.css b/js/dojo/dojox/mobile/themes/iphone/CheckBox.css new file mode 100644 index 0000000..eb9069c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/CheckBox.css @@ -0,0 +1,44 @@ +/* dojox.mobile.CheckBox */ +.mblCheckBox { + position: relative; + cursor: pointer; + outline: none; + -webkit-appearance: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + border: #9CACC0 1px outset; + -webkit-border-radius: 5px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd), to(#cecece), color-stop(0.5, #f8f8f8), color-stop(0.5, #eeeeee)); + font: inherit; + -webkit-transform: translatey(0.45em); +} +.mblCheckBoxSelected { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0f0), to(#bfbfbf), color-stop(0.5, #ebebeb), color-stop(0.5, #dedede)); +} +.mblCheckBoxChecked, .mblCheckBox:checked { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7a9de9), to(#2362dd), color-stop(0.5, #366edf), color-stop(0.5, #215fdc)); +} +.mblCheckBoxChecked::after, .mblCheckBox:checked::after { + position: absolute; + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.3em; + border-color: white; + border-width: 0.15em; + border-style: none solid solid none; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblCheckBoxChecked.mblCheckBoxSelected, .mblCheckBox:checked.mblCheckBoxSelected { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#8ea4c1), to(#4a6c9b), color-stop(0.5, #5877a2), color-stop(0.5, #476999)); +} +.mblCheckBoxChecked.mblCheckBoxSelected::after, .mblCheckBox:checked.mblCheckBoxSelected::after { + border-color: #9CACC0; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/CheckBox.less b/js/dojo/dojox/mobile/themes/iphone/CheckBox.less new file mode 100644 index 0000000..09f93b2 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/CheckBox.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/CheckBox.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/ComboBox-compat.css b/js/dojo/dojox/mobile/themes/iphone/ComboBox-compat.css new file mode 100644 index 0000000..09c7b38 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ComboBox-compat.css @@ -0,0 +1,7 @@ +/* dojox.mobile.ComboBox */ +.dijitPopup { + -moz-box-shadow: 0px 0px 50px black; + -o-box-shadow: 0px 0px 50px black; + -ms-box-shadow: 0px 0px 50px black; + box-shadow: 0px 0px 50px black; +}
\ No newline at end of file diff --git a/js/dojo/dojox/mobile/themes/iphone/ComboBox.css b/js/dojo/dojox/mobile/themes/iphone/ComboBox.css new file mode 100644 index 0000000..259629d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ComboBox.css @@ -0,0 +1,44 @@ +/* dojox.mobile.ComboBox */ +.dijitPopup { + margin: 0; + padding: 0; + position: absolute; + border: 0; + background-color: transparent; + -webkit-box-shadow: 0px 0px 50px black; + -webkit-border-radius: 0px; +} +.mblReset { + margin: 0; + padding: 0; + border: 0; + line-height: normal; + font: inherit; + color: inherit; +} +.mblComboBoxMenu { + overflow-y: hidden !important; + position: relative; + overflow: hidden; + border: 1px solid black; + -webkit-border-radius: 0px; + background-color: white; +} +.mblComboBoxMenuItem { + white-space: nowrap; + padding: .1em .2em; + border-width: 1px 0 1px 0; + border-style: solid; + border-color: #ffffff; + color: inherit; + text-align: left; +} +.mblComboBoxMenuItemSelected { + background-color: black; + background-image: -webkit-gradient(linear, left top, left bottom, from(#048bf4), to(#005ce5)); + color: white; +} +.mblComboBoxMenuPreviousButton, .mblComboBoxMenuNextButton { + font-style: italic; + overflow: hidden; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/ComboBox.less b/js/dojo/dojox/mobile/themes/iphone/ComboBox.less new file mode 100644 index 0000000..ab9458c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ComboBox.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ComboBox.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeCategory-compat.css b/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeCategory-compat.css new file mode 100644 index 0000000..f6d50e2 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeCategory-compat.css @@ -0,0 +1,4 @@ +/* dojox.mobile.EdgeToEdgeCategory */ +.mblEdgeToEdgeCategory { + background-image: url(compat/edge-categ-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeCategory.css b/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeCategory.css new file mode 100644 index 0000000..fc21dd8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeCategory.css @@ -0,0 +1,19 @@ +/* dojox.mobile.EdgeToEdgeCategory */ +.mblEdgeToEdgeCategory { + position: relative; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin: 0px; + padding: 0px 10px; + height: 22px; + border-top: 1px solid #A4B0B9; + border-bottom: 1px solid #979DA3; + background-image: -webkit-gradient(linear, left top, left bottom, from(#8f9ea9), to(#b7c0c7)); + font-family: Helvetica; + font-size: 16px; + font-weight: bold; + color: white; + line-height: 22px; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeCategory.less b/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeCategory.less new file mode 100644 index 0000000..3bb63da --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeCategory.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/EdgeToEdgeCategory.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeList.css b/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeList.css new file mode 100644 index 0000000..9864276 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeList.css @@ -0,0 +1,12 @@ +/* dojox.mobile.EdgeToEdgeList */ +.mblEdgeToEdgeList { + position: relative; + /* IE needs this */ + + margin: 0px; + padding: 0px; + background-color: white; +} +.mblEdgeToEdgeList .mblListItem:last-child { + border-bottom-color: #707C84; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeList.less b/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeList.less new file mode 100644 index 0000000..227627c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/EdgeToEdgeList.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/EdgeToEdgeList.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/Heading-compat.css b/js/dojo/dojox/mobile/themes/iphone/Heading-compat.css new file mode 100644 index 0000000..bc02fa1 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Heading-compat.css @@ -0,0 +1,24 @@ +/* mbl.widget.Heading */ +.mblHeading { + background-image: url(compat/heading-bg.png); +} +.mblHeadingSpanTitle { + white-space: normal; +} + +/* Heading Arrow Button */ +.mblArrowButtonHead { + position: absolute; + top: 6px; + left: 3px; + width: 19px; + height: 29px; + border-style: none; + background-image: url(compat/arrow-button-head.png); +} +.mblArrowButtonBody { + padding: 0px 10px 0px 4px; + -moz-border-radius-topright: 5px; + -moz-border-radius-bottomright: 5px; + background-image: url(compat/arrow-button-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Heading.css b/js/dojo/dojox/mobile/themes/iphone/Heading.css new file mode 100644 index 0000000..613cf72 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Heading.css @@ -0,0 +1,84 @@ +/* dojox.mobile.Heading */ +.mblHeading { + position: relative; + margin: 0px; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + z-index: 1; + padding: 0px; + height: 42px; + background-color: #889BB3; + background-image: -webkit-gradient(linear, left top, left bottom, from(#b0bccd), to(#6d84a2), color-stop(0.5, #889bb3), color-stop(0.5, #8195af)); + border-top: 1px solid #CDD5DF; + border-bottom: 1px solid #2D3642; + color: white; + font-family: Helvetica; + font-size: 20px; + font-weight: bold; + text-align: center; + line-height: 44px; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0px; +} +.mblHeading * { + z-index: 2; +} +.mblHeadingDivTitle { + position: absolute; + width: 100%; + display: none; + left: 0px; + z-index: 1; +} +.mblHeadingCenterTitle .mblHeadingDivTitle { + display: block; +} +.mblHeadingCenterTitle .mblHeadingSpanTitle { + display: none; +} +/* Heading Arrow Button */ +.mblArrowButton { + position: relative; + float: left; + height: 42px; +} +.mblArrowButtonHead { + position: absolute; + top: 11px; + left: 5px; + width: 20px; + height: 19px; + border: 1px solid #3A4655; + -webkit-transform: scale(0.7, 1) rotate(45deg); + background-image: -webkit-gradient(linear, left top, right bottom, from(#8ea4c1), to(#4a6c9b), color-stop(0.5, #5877a2), color-stop(0.5, #476999)); +} +.dj_chrome .mblArrowButtonHead { + border: 1px inset #3A4655; +} +.mblArrowButtonBody { + position: absolute; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + top: 6px; + left: 16px; + padding: 0px 10px 0px 4px; + height: 29px; + border-width: 1px 1px 1px 0px; + border-style: inset; + border-color: #9CACC0; + font-family: Helvetica; + font-size: 13px; + color: white; + line-height: 29px; + -webkit-border-top-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + background-color: #5877A2; + background-image: -webkit-gradient(linear, left top, left bottom, from(#8ea4c1), to(#4a6c9b), color-stop(0.5, #5877a2), color-stop(0.5, #476999)); +} +.mblArrowButtonSelected .mblArrowButtonHead { + background-image: -webkit-gradient(linear, left top, right bottom, from(#7c87a4), to(#263e6c), color-stop(0.5, #394d77), color-stop(0.5, #243b69)); +} +.mblArrowButtonSelected .mblArrowButtonBody { + background-image: -webkit-gradient(linear, left top, left bottom, from(#7c87a4), to(#263e6c), color-stop(0.5, #394d77), color-stop(0.5, #243b69)); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Heading.less b/js/dojo/dojox/mobile/themes/iphone/Heading.less new file mode 100644 index 0000000..cfc8580 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Heading.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Heading.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/IconContainer-compat.css b/js/dojo/dojox/mobile/themes/iphone/IconContainer-compat.css new file mode 100644 index 0000000..adf6d49 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/IconContainer-compat.css @@ -0,0 +1,11 @@ +@import url("../common/domButtons/DomButtonColorButtons-compat.css"); + +/* dojox.mobile.IconItem */ +.mblIconArea div { + *font-size: 60px; /* IE 7 quirks */ +} + +/* Icon Content Heading */ +.mblIconContentHeading { + background-image: url(compat/icon-content-heading-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/IconContainer.css b/js/dojo/dojox/mobile/themes/iphone/IconContainer.css new file mode 100644 index 0000000..bb33f89 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/IconContainer.css @@ -0,0 +1,97 @@ +@import url("../common/domButtons/DomButtonColorButtons.css"); + +@import url("../common/IconContainer_keyframes.css"); +/* dojox.mobile.IconContainer */ +.mblIconContainer { + margin: 20px 0px 0px 10px; + padding: 0px 0px 40px 0px; +} +/* dojox.mobile.IconItem */ +.mblIconItem { + list-style-type: none; + float: left; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} +.mblIconItemTerminator { + list-style-type: none; + clear: both; + height: 20px; +} +.mblIconItemSub { + list-style-type: none; + margin-left: -10px; + background-color: white; +} +.mblIconArea { + margin-bottom: 10px; + height: 78px; + width: 74px; + font-family: Helvetica; + font-size: 12px; + text-align: center; +} +.mblIconArea div { + position: relative; + height: 65px; + line-height: 65px; + text-align: center; +} +.mblIconArea img { + vertical-align: middle; +} +.mblIconItemSpriteIcon { + position: absolute; +} +.mblContent { + clear: both; + padding-bottom: 20px; +} +table.mblClose { + clear: both; + cursor: pointer; +} +.mblVibrate { + position: relative; + -webkit-animation-duration: .5s; + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-iteration-count: 20; + -webkit-animation-name: mblVibrate; + -webkit-transform: rotate(0deg); +} +.mblCloseContent { + -webkit-animation-duration: .3s; + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-name: mblShrink; + -webkit-transform: scale(0.01); +} +.mblCloseContent.mblShrink0 { + -webkit-animation-name: mblShrink0; +} +.mblCloseContent.mblShrink1 { + -webkit-animation-name: mblShrink1; +} +.mblCloseContent.mblShrink2 { + -webkit-animation-name: mblShrink2; +} +.mblCloseContent.mblShrink3 { + -webkit-animation-name: mblShrink3; +} +/* Icon Content Heading */ +.mblIconContentHeading { + position: relative; + clear: both; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin-top: 0px; + padding-left: 40px; + height: 25px; + border-top: 1px solid #F1F3F4; + border-bottom: 1px solid #717D85; + background-image: -webkit-gradient(linear, left top, left bottom, from(#e0e4e7), to(#b4bec6), color-stop(0.5, #c4ccd2), color-stop(0.5, #bfc8ce)); + font-family: Helvetica; + font-size: 14px; + color: white; + line-height: 26px; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/IconContainer.less b/js/dojo/dojox/mobile/themes/iphone/IconContainer.less new file mode 100644 index 0000000..963eae6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/IconContainer.less @@ -0,0 +1,5 @@ +@import url("../common/domButtons/DomButtonColorButtons.css"); +@import url("../common/IconContainer_keyframes.css"); + +@import "variables.less"; +@import "../common/IconContainer.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/ListItem-compat.css b/js/dojo/dojox/mobile/themes/iphone/ListItem-compat.css new file mode 100644 index 0000000..d153c4b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ListItem-compat.css @@ -0,0 +1,7 @@ +@import url("../common/domButtons/DomButtonGrayArrow-compat.css"); +@import url("../common/domButtons/DomButtonDarkBlueCheck-compat.css"); + +/* mbl.widget.ListItem */ +*html li.mblListItem.mblVariableHeight { /* IE6 hack */ + height: 0; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/ListItem.css b/js/dojo/dojox/mobile/themes/iphone/ListItem.css new file mode 100644 index 0000000..77d88d9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ListItem.css @@ -0,0 +1,82 @@ +@import url("../common/domButtons/DomButtonGrayArrow.css"); + +@import url("../common/domButtons/DomButtonDarkBlueCheck.css"); +/* dojox.mobile.ListItem */ +.mblListItem { + position: relative; + list-style-type: none; + vertical-align: bottom; + /* To avoid IE6 LI bug */ + + padding: 0px 0px 0px 8px; + height: 43px; + border-bottom: 1px solid #ADAAAD; + font-weight: bold; + color: black; + line-height: 43px; +} +.mblListItem.mblVariableHeight { + height: auto; + padding: 11px 0px 10px 6px; + line-height: normal; +} +.mblListItem .mblListItemAnchor { + display: block; + height: 100%; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + background-position: 9px 7px; + text-decoration: none; + padding-right: 7px; +} +.mblListItem .mblListItemAnchor * { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0.2); +} +.mblItemSelected { + background-color: #048BF4; + background-image: -webkit-gradient(linear, left top, left bottom, from(#048bf4), to(#005ce5)); +} +.mblItemSelected .mblListItemAnchor { + color: white; +} +.mblItemSelected .mblDomButton div { + border-color: white; +} +.mblListItemTextBoxSelected { + background-color: #048BF4; +} +.mblListItemChecked { + color: #314E84; +} +.mblListItemIcon { + float: left; + line-height: normal; + margin-top: 7px; + margin-right: 11px; +} +.mblListItemSpriteIcon { + position: absolute; + margin-top: 7px; + margin-left: 8px; +} +.mblListItemRightIcon, .mblListItemRightIcon2 { + position: relative; + float: right; + line-height: normal; + margin-top: 7px; + margin-bottom: -7px; +} +.mblListItemRightText { + position: relative; + float: right; + line-height: normal; + color: #324F85; + margin: 11px 4px 0 0; +} +.mblListItemTextBox { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.mblVariableHeight .mblListItemTextBox { + white-space: normal; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/ListItem.less b/js/dojo/dojox/mobile/themes/iphone/ListItem.less new file mode 100644 index 0000000..f9f9d21 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ListItem.less @@ -0,0 +1,5 @@ +@import url("../common/domButtons/DomButtonGrayArrow.css"); +@import url("../common/domButtons/DomButtonDarkBlueCheck.css"); + +@import "variables.less"; +@import "../common/ListItem.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/Opener-compat.css b/js/dojo/dojox/mobile/themes/iphone/Opener-compat.css new file mode 100644 index 0000000..68cb1a8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Opener-compat.css @@ -0,0 +1,3 @@ +/* dojox.mobile.Opener */ +@import url("Overlay-compat.css"); +@import url("Tooltip-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/iphone/Opener.css b/js/dojo/dojox/mobile/themes/iphone/Opener.css new file mode 100644 index 0000000..141c72e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Opener.css @@ -0,0 +1,3 @@ +/* dojox.mobile.Opener */ +@import url("Overlay.css"); +@import url("Tooltip.css"); diff --git a/js/dojo/dojox/mobile/themes/iphone/Overlay-compat.css b/js/dojo/dojox/mobile/themes/iphone/Overlay-compat.css new file mode 100644 index 0000000..bf8a160 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Overlay-compat.css @@ -0,0 +1,15 @@ +/* dojox.mobile.Overlay */ +.mblOverlay { + *position: absolute; + background-color: #CECECE; + background-image: none; + text-align: center; +} +.dj_gecko .mblOverlay { + text-align: -moz-center; +} +.dj_ie9 .mblOverlay > *, +.dj_ie8 .mblOverlay > * +{ + margin: 0 auto; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Overlay.css b/js/dojo/dojox/mobile/themes/iphone/Overlay.css new file mode 100644 index 0000000..56c3778 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Overlay.css @@ -0,0 +1,17 @@ +@import url("../common/transitions/coverv.css"); + +@import url("../common/transitions/revealv.css"); +/* dojox.mobile.Overlay */ +.mblOverlay { + position: fixed; + z-index: 2000; + left: 0; + bottom: 0; + margin: 0; + width: 100%; + text-align: -webkit-center; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd), to(#cecece)); +} +.mblOverlayHidden *, .mblOverlayHidden { + visibility: hidden !important; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Overlay.less b/js/dojo/dojox/mobile/themes/iphone/Overlay.less new file mode 100644 index 0000000..e49ea9e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Overlay.less @@ -0,0 +1,5 @@ +@import url("../common/transitions/coverv.css"); +@import url("../common/transitions/revealv.css"); + +@import "variables.less"; +@import "../common/Overlay.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/PageIndicator.css b/js/dojo/dojox/mobile/themes/iphone/PageIndicator.css new file mode 100644 index 0000000..a175ad6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/PageIndicator.css @@ -0,0 +1,24 @@ +/* dojox.mobile.PageIndicator */ +.mblPageIndicator { + position: relative; + width: 100%; + height: 20px; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} +.mblPageIndicatorContainer { + margin-top: 4px; + margin-left: auto; + margin-right: auto; +} +.mblPageIndicatorDot { + margin: 0px 3px; + width: 6px; + height: 6px; + font-size: 1px; + background-color: #949294; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; +} +.mblPageIndicatorDotSelected { + background-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/PageIndicator.less b/js/dojo/dojox/mobile/themes/iphone/PageIndicator.less new file mode 100644 index 0000000..9bb6c49 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/PageIndicator.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/PageIndicator.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/ProgressIndicator-compat.css b/js/dojo/dojox/mobile/themes/iphone/ProgressIndicator-compat.css new file mode 100644 index 0000000..4ee0810 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ProgressIndicator-compat.css @@ -0,0 +1,46 @@ +/* Progress Indicator */ +.mblProg { + position: absolute; + top: 0px; + width: 4px; + font-size: 1px; + height: 36px; + overflow: hidden; + background-color: #C0C0C0; +} +.mblProg0 { + left: 0px; +} +.mblProg1 { + left: 8px; +} +.mblProg2 { + left: 16px; +} +.mblProg3 { + left: 24px; +} +.mblProg4 { + left: 32px; +} +.mblProg5 { + left: 40px; +} +.mblProg6 { + left: 48px; +} +.mblProg7 { + left: 56px; +} +.mblProg8 { + left: 64px; +} +.mblProg9 { + left: 72px; +} +.mblProg10 { + left: 80px; +} +.mblProg11 { + left: 80px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/ProgressIndicator.css b/js/dojo/dojox/mobile/themes/iphone/ProgressIndicator.css new file mode 100644 index 0000000..2340637 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ProgressIndicator.css @@ -0,0 +1,58 @@ +/* Progress Indicator */ +.mblProgContainer { + position: absolute; + width: 40px; + height: 40px; + top: 180px; + left: 50%; + margin: -18px 0px 0px -18px; +} +.mblProg { + position: absolute; + left: 2px; + top: 0px; + width: 11px; + font-size: 1px; + height: 4px; + overflow: hidden; + -webkit-transform-origin: 0 2px; + background-color: #C0C0C0; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} +.mblProg0 { + -webkit-transform: translate(18px, 10px) rotate(-90.1deg); +} +.mblProg1 { + -webkit-transform: translate(22px, 11px) rotate(-60deg); +} +.mblProg2 { + -webkit-transform: translate(25px, 14px) rotate(-30deg); +} +.mblProg3 { + -webkit-transform: translate(26px, 18px) rotate(0deg); +} +.mblProg4 { + -webkit-transform: translate(25px, 22px) rotate(30deg); +} +.mblProg5 { + -webkit-transform: translate(22px, 25px) rotate(60deg); +} +.mblProg6 { + -webkit-transform: translate(18px, 26px) rotate(90.1deg); +} +.mblProg7 { + -webkit-transform: translate(14px, 25px) rotate(120deg); +} +.mblProg8 { + -webkit-transform: translate(11px, 22px) rotate(150deg); +} +.mblProg9 { + -webkit-transform: translate(10px, 18px) rotate(180deg); +} +.mblProg10 { + -webkit-transform: translate(11px, 14px) rotate(210deg); +} +.mblProg11 { + -webkit-transform: translate(14px, 11px) rotate(240deg); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/ProgressIndicator.less b/js/dojo/dojox/mobile/themes/iphone/ProgressIndicator.less new file mode 100644 index 0000000..2ab2a2d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ProgressIndicator.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ProgressIndicator.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/RadioButton-compat.css b/js/dojo/dojox/mobile/themes/iphone/RadioButton-compat.css new file mode 100644 index 0000000..6566cc1 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/RadioButton-compat.css @@ -0,0 +1,33 @@ +/* dojox.mobile.RadioButton */ +.mblRadioButton { + background-image: url(compat/button-bg.png); + -moz-border-radius: 0.5em; + -o-border-radius: 0.5em; + -ms-border-radius: 0.5em; + border-radius: 0.5em; + -moz-appearance: none; + -o-appearance: none; + -ms-appearance: none; + appearance: none; + -o-transform: translateY(0.45em); + -ms-transform: translateY(0.45em); + transform: translateY(0.45em); +} +.mblRadioButtonChecked, +.mblRadioButton:checked { + background-image: url(compat/blue-button-bg.png); +} +.mblRadioButtonChecked::after, +.mblRadioButton:checked::after { + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; +} +.mblRadioButtonChecked.mblRadioButtonSelected { + background-image: url(compat/blue-button-sel-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/RadioButton.css b/js/dojo/dojox/mobile/themes/iphone/RadioButton.css new file mode 100644 index 0000000..799f485 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/RadioButton.css @@ -0,0 +1,41 @@ +/* dojox.mobile.RadioButton */ +.mblRadioButton { + position: relative; + cursor: pointer; + outline: none; + -webkit-appearance: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + border: #9CACC0 1px outset; + -webkit-border-radius: 0.5em; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd), to(#cecece), color-stop(0.5, #f8f8f8), color-stop(0.5, #eeeeee)); + font: inherit; + -webkit-transform: translatey(0.45em); +} +.mblRadioButtonChecked, .mblRadioButton:checked { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7a9de9), to(#2362dd), color-stop(0.5, #366edf), color-stop(0.5, #215fdc)); +} +.mblRadioButtonChecked::after, .mblRadioButton:checked::after { + position: absolute; + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.25em; + border-color: white; + border-width: 0.15em; + border-style: none solid solid none; + border-color: white; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblRadioButtonChecked.mblRadioButtonSelected, .mblRadioButton:checked.mblRadioButtonSelected { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#8ea4c1), to(#4a6c9b), color-stop(0.5, #5877a2), color-stop(0.5, #476999)); +} +.mblRadioButtonChecked.mblRadioButtonSelected::after, .mblRadioButton:checked.mblRadioButtonSelected::after { + border-color: white; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/RadioButton.less b/js/dojo/dojox/mobile/themes/iphone/RadioButton.less new file mode 100644 index 0000000..0793ca6 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/RadioButton.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RadioButton.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/RoundRect-compat.css b/js/dojo/dojox/mobile/themes/iphone/RoundRect-compat.css new file mode 100644 index 0000000..4f16c44 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/RoundRect-compat.css @@ -0,0 +1,64 @@ +/* Round Corner */ +.mblRoundCorner { + background-color: white; + height: 1px; + font-size: 1px; + overflow: hidden; + border-style: solid; + border-color: #ADAAAD; + border-width: 0px 1px; +} +.mblRoundRectContainer { + margin: 0px; + padding: 0px; + background-color: white; + border-style: solid; + border-color: #ADAAAD; + border-width: 0px 1px; +} +.mblRoundRect .mblRoundRectContainer { + padding: 3px 8px; +} +.mblRoundCorner0T { + height: 0px; +} +.mblRoundCorner1T { + background-color: #ADAAAD; + margin: 0px 5px; +} +.mblRoundCorner2T { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner3T { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4T { + margin: 0px 1px; +} +.mblRoundCorner5T { + margin: 0px 1px; +} + +.mblRoundCorner0B { + height: 0px; +} +.mblRoundCorner1B { + margin: 0px 1px; +} +.mblRoundCorner2B { + margin: 0px 1px; +} +.mblRoundCorner3B { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4B { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner5B { + background-color: #ADAAAD; + margin: 0px 5px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/RoundRect.css b/js/dojo/dojox/mobile/themes/iphone/RoundRect.css new file mode 100644 index 0000000..071a9da --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/RoundRect.css @@ -0,0 +1,12 @@ +/* dojox.mobile.RoundRect */ +.mblRoundRect { + margin: 7px 9px 16px 9px; + padding: 8px; + border: 1px solid #ADAAAD; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + background-color: white; +} +.mblRoundRect.mblShadow { + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/RoundRect.less b/js/dojo/dojox/mobile/themes/iphone/RoundRect.less new file mode 100644 index 0000000..efec816 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/RoundRect.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RoundRect.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/RoundRectCategory.css b/js/dojo/dojox/mobile/themes/iphone/RoundRectCategory.css new file mode 100644 index 0000000..0a9b90b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/RoundRectCategory.css @@ -0,0 +1,12 @@ +/* dojox.mobile.RoundRectCategory */ +.mblRoundRectCategory { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + padding: 18px 0px 0px 20px; + margin: 0px; + font-family: Helvetica; + font-size: 16px; + color: #4C566C; + text-shadow: #ffffff 0px 1px 0px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/RoundRectCategory.less b/js/dojo/dojox/mobile/themes/iphone/RoundRectCategory.less new file mode 100644 index 0000000..e9148cc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/RoundRectCategory.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RoundRectCategory.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/RoundRectList-compat.css b/js/dojo/dojox/mobile/themes/iphone/RoundRectList-compat.css new file mode 100644 index 0000000..4f16c44 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/RoundRectList-compat.css @@ -0,0 +1,64 @@ +/* Round Corner */ +.mblRoundCorner { + background-color: white; + height: 1px; + font-size: 1px; + overflow: hidden; + border-style: solid; + border-color: #ADAAAD; + border-width: 0px 1px; +} +.mblRoundRectContainer { + margin: 0px; + padding: 0px; + background-color: white; + border-style: solid; + border-color: #ADAAAD; + border-width: 0px 1px; +} +.mblRoundRect .mblRoundRectContainer { + padding: 3px 8px; +} +.mblRoundCorner0T { + height: 0px; +} +.mblRoundCorner1T { + background-color: #ADAAAD; + margin: 0px 5px; +} +.mblRoundCorner2T { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner3T { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4T { + margin: 0px 1px; +} +.mblRoundCorner5T { + margin: 0px 1px; +} + +.mblRoundCorner0B { + height: 0px; +} +.mblRoundCorner1B { + margin: 0px 1px; +} +.mblRoundCorner2B { + margin: 0px 1px; +} +.mblRoundCorner3B { + margin: 0px 1px; + border-width: 0px 2px; +} +.mblRoundCorner4B { + margin: 0px 2px; + border-width: 0px 3px; +} +.mblRoundCorner5B { + background-color: #ADAAAD; + margin: 0px 5px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/RoundRectList.css b/js/dojo/dojox/mobile/themes/iphone/RoundRectList.css new file mode 100644 index 0000000..cf0bea0 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/RoundRectList.css @@ -0,0 +1,25 @@ +/* dojox.mobile.RoundRectList */ +.mblRoundRectList { + position: relative; + /* IE needs this */ + + margin: 7px 9px 16px 9px; + padding: 0px; + border: 1px solid #ADAAAD; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + background-color: white; +} +.mblRoundRectList .mblListItem:first-child { + -webkit-border-top-left-radius: 8px; + -webkit-border-top-right-radius: 8px; + -moz-border-radius-topleft: 8px; + -moz-border-radius-topright: 8px; +} +.mblRoundRectList .mblListItem:last-child { + border-bottom-width: 0px; + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/RoundRectList.less b/js/dojo/dojox/mobile/themes/iphone/RoundRectList.less new file mode 100644 index 0000000..52e1164 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/RoundRectList.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/RoundRectList.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/Slider-compat.css b/js/dojo/dojox/mobile/themes/iphone/Slider-compat.css new file mode 100644 index 0000000..f6987bd --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Slider-compat.css @@ -0,0 +1,43 @@ +/* dojox.mobile.Slider */ +.mblSlider { + background-image: url(compat/slider-h-bg.png); + -moz-border-radius: 8px; + -o-border-radius: 8px; + -ms-border-radius: 8px; + border-radius: 8px; + -moz-user-select: none; /* prevent selection */ + -o-user-select: none; + -ms-user-select: none; + user-select: none; + -moz-box-sizing: content-box; /* make width and height consistent with a DIV */ + -o-box-sizing: content-box; + -ms-box-sizing: content-box; + box-sizing: content-box; +} +.mblSlider.mblSliderV { + background: #ABABAB; +} +.mblSliderProgressBar { + background-image: url(compat/slider-h-bar-bg.png); + background-repeat: repeat-x; + -moz-border-radius: 8px; + -o-border-radius: 8px; + -ms-border-radius: 8px; + border-radius: 8px; +} +.mblSliderV .mblSliderProgressBar { + background: #0D48A8; +} +.mblSliderHandle { + background-image: url(compat/slider-handle-bg.png); + -moz-border-radius: 10px; + -o-border-radius: 10px; + -ms-border-radius: 10px; + border-radius: 10px; +} +.mblSliderTransition { + -moz-transition-duration: 400ms; + -o-transition-duration: 400ms; + -ms-transition-duration: 400ms; + transition-duration: 400ms; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Slider.css b/js/dojo/dojox/mobile/themes/iphone/Slider.css new file mode 100644 index 0000000..6866098 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Slider.css @@ -0,0 +1,62 @@ +/* dojox.mobile.Slider */ +.mblSlider { + outline: none; + -webkit-user-select: none; + /* prevent selection */ + + -webkit-box-sizing: content-box; + /* make width and height consistent with a DIV */ + + margin: 15px; + /* 1/2 handle width for hanging off the ends of the bar */ + + border: #B0B0B0 1px inset; + background-image: -webkit-gradient(linear, left top, left bottom, from(#ababab), to(#fefefe)); + -webkit-border-radius: 8px; +} +.mblSliderH { + width: 200px; + height: 8px; +} +.mblSliderH .mblSliderProgressBar { + height: 100%; +} +.mblSliderH .mblSliderHandle { + top: 50%; +} +.mblSliderV { + height: 200px; + width: 8px; +} +.mblSliderV .mblSliderProgressBar { + width: 100%; +} +.mblSliderV .mblSliderHandle { + left: 50%; +} +.mblSliderProgressBar { + background-image: -webkit-gradient(linear, left top, left bottom, from(#0d48a8), to(#68a6f8)); + -webkit-border-radius: 8px; +} +.mblSliderHandle { + margin: -10px 0 0 -10px; + width: 18px; + height: 18px; + border: #9D9D9D 1px outset; + -webkit-border-radius: 10px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#a6a6a6), to(#fcfcfc)); +} +.mblSliderTransition { + -webkit-transition-duration: 400ms; +} +.mblSliderTouchBox { + margin: 0; + padding: 12pt; + left: -12pt; + top: -12pt; + border: none; + width: 100%; + height: 100%; + background-color: transparent; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Slider.less b/js/dojo/dojox/mobile/themes/iphone/Slider.less new file mode 100644 index 0000000..928972f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Slider.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Slider.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/Switch-compat.css b/js/dojo/dojox/mobile/themes/iphone/Switch-compat.css new file mode 100644 index 0000000..3756d95 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Switch-compat.css @@ -0,0 +1,70 @@ +/* Switch - default */ +.mblSwitchBg { + border: none; +} +.mblSwitchBgLeft { + background: none; + background-image: url(compat/switch-default-l.gif); + background-repeat: no-repeat; +} +.mblSwitchBgRight { + background: none; + background-image: url(compat/switch-default-r.gif); + background-repeat: no-repeat; +} +.mblSwitchKnob { + top: 0px; + height: 27px; + background: none; + background-image: url(compat/switch-default-k.gif); + background-repeat: no-repeat; + border: none; +} +/* Switch - Round Shape1 */ +.mblSwRoundShape1 .mblSwitchBgLeft { + background-image: url(compat/switch-round-l.gif); +} +.mblSwRoundShape1 .mblSwitchBgRight { + background-image: url(compat/switch-round-r.gif); +} +.mblSwRoundShape1 .mblSwitchKnob { + top: 1px; + height: 26px; + background-image: url(compat/switch-round1-k.gif); +} +/* Switch - Round Shape2 */ +.mblSwRoundShape2 .mblSwitchBgLeft { + background-image: url(compat/switch-round-l.gif); +} +.mblSwRoundShape2 .mblSwitchBgRight { + background-image: url(compat/switch-round-r.gif); +} +.mblSwRoundShape2 .mblSwitchKnob { + top: 1px; + height: 26px; + background-image: url(compat/switch-round2-k.gif); +} +/* Switch - Arc Shape1 */ +.mblSwArcShape1 .mblSwitchBgLeft { + background-image: url(compat/switch-arc-l.gif); +} +.mblSwArcShape1 .mblSwitchBgRight { + background-image: url(compat/switch-arc-r.gif); +} +.mblSwArcShape1 .mblSwitchKnob { + top: 1px; + height: 26px; + background-image: url(compat/switch-arc1-k.gif); +} +/* Switch - Arc Shape2 */ +.mblSwArcShape2 .mblSwitchBgLeft { + background-image: url(compat/switch-arc-l.gif); +} +.mblSwArcShape2 .mblSwitchBgRight { + background-image: url(compat/switch-arc-r.gif); +} +.mblSwArcShape2 .mblSwitchKnob { + top: 1px; + height: 26px; + background-image: url(compat/switch-arc2-k.gif); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Switch.css b/js/dojo/dojox/mobile/themes/iphone/Switch.css new file mode 100644 index 0000000..84597f9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Switch.css @@ -0,0 +1,18 @@ +@import url("../common/Switch.css"); +/* dojox.mobile.Switch */ +.mblItemSwitch { + top: 8px; +} +.mblSwitchBg { + -webkit-border-radius: 5px; +} +.mblSwitchBgLeft { + background-image: -webkit-gradient(linear, left top, left bottom, from(#2859b1), to(#75acfb), color-stop(0.5, #3f84eb), color-stop(0.5, #4c8eee)); +} +.mblSwitchBgRight { + background-image: -webkit-gradient(linear, left top, left bottom, from(#cecece), to(#fdfdfd), color-stop(0.5, #eeeeee), color-stop(0.5, #f8f8f8)); +} +.mblSwitchKnob { + background-image: -webkit-gradient(linear, left top, left bottom, from(#cccccc), to(#fafafa)); + -webkit-border-radius: 5px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Switch.less b/js/dojo/dojox/mobile/themes/iphone/Switch.less new file mode 100644 index 0000000..84a1146 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Switch.less @@ -0,0 +1,4 @@ +@import url("../common/Switch.css"); + +@import "variables.less"; +@import "../common/Switch.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/TabBar-compat.css b/js/dojo/dojox/mobile/themes/iphone/TabBar-compat.css new file mode 100644 index 0000000..2e12529 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/TabBar-compat.css @@ -0,0 +1,36 @@ +/* dojox.mobile.TabBarButton */ +.dj_ie6 .mblTabBarButtonDiv, .dj_ie7 .mblTabBarButtonDiv { + left: auto; +} +.dj_ie6 .mblTabBar .mblTabBarButton { + display: inline; /* IE bug*/ +} +.mblTabPanelHeader { + background-image: url(compat/heading-bg.png); +} +.mblTabContainer .mblTabButton { + background-image: url(compat/tab-button-bg.png); +} +.mblTabContainer .mblTabButtonSelected { + background-image: url(compat/tab-sel-button-bg.png); +} +*html .mblTabButton { /* IE6 hack */ + behavior: expression( + (function(el){ + if(!el.previousSibling) + el.style.borderWidth = "1px"; + el.style.behavior = "none"; + })(this) + ); +} +.dj_ie6 .mblTabPanelHeader .mblDomButton { + left: 0px; +} +.mblTabButton:first-child { + -moz-border-radius-topleft: 5px; + -moz-border-radius-bottomleft: 5px; +} +.mblTabButton:last-child { + -moz-border-radius-topright: 5px; + -moz-border-radius-bottomright: 5px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/TabBar.css b/js/dojo/dojox/mobile/themes/iphone/TabBar.css new file mode 100644 index 0000000..becc58a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/TabBar.css @@ -0,0 +1,142 @@ +/* dojox.mobile.TabBar */ +.mblTabBar { + position: relative; + overflow: hidden; + white-space: nowrap; + margin: 0px; + padding: 0px; + height: 48px; + border-top: 1px solid #000000; + background-color: #000000; + background-image: -webkit-gradient(linear, left top, left bottom, from(#2d2d2d), to(#000000), color-stop(0.5, #141414), color-stop(0.5, #000000)); + color: white; + text-align: center; +} +.mblTabBarNoIcons { + height: 34px; +} +.mblTabBarNoText { + height: 34px; +} +/* dojox.mobile.TabBarButton */ +.mblTabBarButton { + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} +.mblTabBar .mblTabBarButton { + position: relative; + list-style-type: none; + float: left; +} +.mblTabBar .mblTabBarButton.mblTabButtonSelected { + -webkit-border-radius: 3px; + background-color: #404040; + background-image: -webkit-gradient(linear, left top, left bottom, from(#484848), to(#242424), color-stop(0.5, #353535), color-stop(0.5, #242424)); +} +.mblTabBarButtonAnchor { + display: block; + text-decoration: none; +} +.mblTabBarButtonDiv { + position: relative; + margin-left: auto; + margin-right: auto; + height: 34px; + width: 29px; +} +.mblTabBarButtonIcon { + position: absolute; + left: 0px; + top: 2px; +} +.mblTabBarButtonSpriteIcon { + position: absolute; +} +.mblTabBarButtonTextBox { + color: #979797; + font-family: "Helvetica Neue", Helvetica; + font-size: 11px; +} +.mblTabBarNoIcons .mblTabBarButtonDiv { + display: none; +} +.mblTabBarNoIcons .mblTabBarButtonTextBox { + line-height: 34px; + font-size: 20px; +} +.mblTabBarTop .mblTabButton .mblTabBarButtonDiv { + display: none; +} +.mblTabButton { + position: relative; + float: left; + list-style-type: none; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + width: 100px; + height: 28px; + border-width: 1px 1px 1px 0px; + border-style: inset; + border-color: #9CACC0; + border-right-color: #5E708A; + background-image: -webkit-gradient(linear, left top, left bottom, from(#abb9ca), to(#788da9), color-stop(0.5, #8297af), color-stop(0.5, #768ba7)); + font-family: Helvetica; + font-size: 13px; + color: white; + text-align: center; + line-height: 29px; +} +.mblTabButton .mblTabBarButtonAnchor, .mblTabButton .mblTabBarButtonDiv { + height: 29px; +} +.mblTabButton:first-child { + -webkit-border-top-left-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + border-left-width: 1px; +} +.mblTabButton:last-child { + -webkit-border-top-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + border-right-color: #9CACC0; +} +.mblTabButtonSelected .mblTabBarButtonTextBox { + color: white; +} +.mblTabButtonImgDiv { + display: none; +} +.mblTabPanelHeader { + position: relative; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin: 0px; + padding: 3px 0px 0px 0px; + height: 39px; + border-top: 1px solid #CDD5DF; + border-bottom: 1px solid #2D3642; + background-color: #889BB3; + background-image: -webkit-gradient(linear, left top, left bottom, from(#b0bccd), to(#6d84a2), color-stop(0.5, #889bb3), color-stop(0.5, #8195af)); + font-family: Helvetica; + font-size: 20px; + color: white; + text-align: center; + line-height: 44px; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0px; +} +.mblTabPanelHeader .mblTabButton { + margin-top: 3px; +} +.mblTabPanelHeader .mblTabButton.mblTabButtonSelected { + background-color: #5877A2; + background-image: -webkit-gradient(linear, left top, left bottom, from(#8ea4c1), to(#4a6c9b), color-stop(0.5, #5877a2), color-stop(0.5, #476999)); +} +.mblTabPanelHeader .mblTabButtonDomButton { + width: 43px; +} +.mblTabPanelHeader .mblTabButtonDomButtonClass { + left: 8px; +} +.mblHeading .mblTabPanelHeader .mblTabButton { + margin-top: 6px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/TabBar.less b/js/dojo/dojox/mobile/themes/iphone/TabBar.less new file mode 100644 index 0000000..4875c40 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/TabBar.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/TabBar.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/TextArea-compat.css b/js/dojo/dojox/mobile/themes/iphone/TextArea-compat.css new file mode 100644 index 0000000..af7e363 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/TextArea-compat.css @@ -0,0 +1,7 @@ +/* dojox.mobile.TextArea */ +.mblTextArea { + -moz-border-radius: 5px; + -o-border-radius: 5px; + -ms-border-radius: 5px; + border-radius: 5px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/TextArea.css b/js/dojo/dojox/mobile/themes/iphone/TextArea.css new file mode 100644 index 0000000..0768622 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/TextArea.css @@ -0,0 +1,14 @@ +/* dojox.mobile.TextArea */ +.mblTextArea { + padding: 4px 1px; + border-color: #9CACC0; + border-width: 1px; + border-style: inset; + -webkit-border-radius: 5px; + font-family: Helvetica; + font-size: 13px; +} +/* dojox.mobile.ExpandingTextArea */ +.mblExpandingTextArea { + margin: 2px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/TextArea.less b/js/dojo/dojox/mobile/themes/iphone/TextArea.less new file mode 100644 index 0000000..c16ffe0 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/TextArea.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/TextArea.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/TextBox-compat.css b/js/dojo/dojox/mobile/themes/iphone/TextBox-compat.css new file mode 100644 index 0000000..32dcf46 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/TextBox-compat.css @@ -0,0 +1,7 @@ +/* dojox.mobile.TextBox */ +.mblTextBox { + -moz-border-radius: 5px; + -o-border-radius: 5px; + -ms-border-radius: 5px; + border-radius: 5px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/TextBox.css b/js/dojo/dojox/mobile/themes/iphone/TextBox.css new file mode 100644 index 0000000..d87404e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/TextBox.css @@ -0,0 +1,8 @@ +/* dojox.mobile.TextBox */ +.mblTextBox { + height: 22px; + border: #9CACC0 1px inset; + -webkit-border-radius: 5px; + font-family: Helvetica; + font-size: 13px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/TextBox.less b/js/dojo/dojox/mobile/themes/iphone/TextBox.less new file mode 100644 index 0000000..c83890a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/TextBox.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/TextBox.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/ToggleButton-compat.css b/js/dojo/dojox/mobile/themes/iphone/ToggleButton-compat.css new file mode 100644 index 0000000..75bfb32 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ToggleButton-compat.css @@ -0,0 +1,30 @@ +/* dojox.mobile.ToggleButton */ +.mblToggleButton { + background-image: url(compat/button-bg.png); + -moz-border-radius: 5px; + -o-border-radius: 5px; + -ms-border-radius: 5px; + border-radius: 5px; +} +.mblToggleButtonSelected { + background-image: url(compat/button-sel-bg.png); +} +.mblToggleButtonChecked { + background-image: url(compat/blue-button-bg.png); +} +.mblToggleButton.mblToggleButtonChecked::after { + -moz-transform: translate(-25px,0px) rotate(45deg) skew(10deg); + -o-transform: rotate(45deg) skew(10deg); + -ms-transform: rotate(45deg) skew(10deg); + transform: rotate(45deg) skew(10deg); + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; +} +.dj_ff3 .mblToggleButton.mblToggleButtonChecked::after { + -moz-transform: translate(-25px,-6px) rotate(45deg) skew(10deg); +} +.mblToggleButtonChecked.mblToggleButtonSelected { + background-image: url(compat/blue-button-sel-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/ToggleButton.css b/js/dojo/dojox/mobile/themes/iphone/ToggleButton.css new file mode 100644 index 0000000..17e7295 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ToggleButton.css @@ -0,0 +1,52 @@ +/* dojox.mobile.ToggleButton */ +.mblToggleButton { + position: relative; + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + padding: 0px 10px 0px 25px; + height: 29px; + border-width: 1px 1px 1px 1px; + border-style: outset; + border-color: #9CACC0; + -webkit-border-radius: 5px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd), to(#cecece), color-stop(0.5, #f8f8f8), color-stop(0.5, #eeeeee)); + font-family: Helvetica; + font-size: 13px; + color: black; + line-height: 29px; +} +.mblToggleButton.mblToggleButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0f0), to(#bfbfbf), color-stop(0.5, #ebebeb), color-stop(0.5, #dedede)); + color: black; +} +.mblToggleButton.mblToggleButtonChecked { + background-image: -webkit-gradient(linear, left top, left bottom, from(#7a9de9), to(#2362dd), color-stop(0.5, #366edf), color-stop(0.5, #215fdc)); + color: white; +} +.mblToggleButton.mblToggleButtonChecked::after { + position: absolute; + content: ""; + top: 6px; + left: 7px; + width: 5px; + height: 10px; + border-color: white; + border-width: 2px; + border-style: none solid solid none; + -webkit-transform: rotate(45deg) skew(10deg); + -webkit-transform-origin: 50% 50%; +} +.mblToggleButton.mblToggleButtonChecked.mblToggleButtonSelected { + background-image: -webkit-gradient(linear, left top, left bottom, from(#8ea4c1), to(#4a6c9b), color-stop(0.5, #5877a2), color-stop(0.5, #476999)); + color: white; +} +.mblToggleButton.mblToggleButtonChecked.mblToggleButtonSelected::after { + border-color: white; +} +.mblToggleButton:disabled { + cursor: default; + border-color: grey; + background-image: none; + color: grey; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/ToggleButton.less b/js/dojo/dojox/mobile/themes/iphone/ToggleButton.less new file mode 100644 index 0000000..bdce40f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ToggleButton.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ToggleButton.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/ToolBarButton.css b/js/dojo/dojox/mobile/themes/iphone/ToolBarButton.css new file mode 100644 index 0000000..7299e04 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ToolBarButton.css @@ -0,0 +1,28 @@ +/* dojox.mobile.ToolBarButton */ +.mblToolBarButton { + float: left; + position: relative; + overflow: hidden; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + margin: 6px; + height: 29px; + border: 1px inset #9CACC0; + font-family: Helvetica; + font-size: 13px; + font-weight: bold; + color: white; + line-height: 29px; + text-align: center; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; +} +.mblToolBarButtonIcon { + position: relative; +} +.mblToolBarButtonSpriteIcon { + position: absolute; +} +.mblToolBarButtonText { + padding: 0px 10px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/ToolBarButton.less b/js/dojo/dojox/mobile/themes/iphone/ToolBarButton.less new file mode 100644 index 0000000..3b67bdc --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ToolBarButton.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/ToolBarButton.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/Tooltip-compat.css b/js/dojo/dojox/mobile/themes/iphone/Tooltip-compat.css new file mode 100644 index 0000000..18b2623 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Tooltip-compat.css @@ -0,0 +1,41 @@ +/* dojox.mobile.Tooltip */ +.mblTooltip { + -moz-border-radius: 8px; + -o-border-radius: 8px; + -ms-border-radius: 8px; + border-radius: 8px; + background-image: none; +} +.mblTooltipBefore .mblTooltipArrow { + *right: 0; /* IE 7 quirks */ +} +.mblTooltipAbove .mblTooltipArrow { + *bottom: 0px; /* IE 7 quirks */ +} +.mblTooltipBefore .mblTooltipInnerArrow { + *right: -1px; /* IE 7 quirks */ +} +.mblTooltipAbove .mblTooltipInnerArrow { + *bottom: -1px; /* IE 7 quirks */ +} +.mblTooltipAbove .mblTooltipInnerArrow { + border-bottom-color: #172035; +} +.mblTooltip .mblHeading { + background-image: url(compat/tooltip-heading-bg.png); + *padding: 0 9px 9px; + *border-top: 1px solid #4F5055; + *border-bottom: 1px solid #2D3642; + *width: auto; + *height: auto; + *overflow: visible; + *line-height: normal; +} +.dj_ie9 .mblTooltip .mblHeading { + width: auto; +} +.mblTooltip .mblHeading .mblToolBarButton { + background-color: #000924; + background-image: url(compat/tooltip-button-bg.png); + *margin: auto 6px; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Tooltip.css b/js/dojo/dojox/mobile/themes/iphone/Tooltip.css new file mode 100644 index 0000000..cfe2db4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Tooltip.css @@ -0,0 +1,150 @@ +/* dojox.mobile.Tooltip */ +.mblTooltip { + position: absolute; + z-index: 2000; + display: block; + margin: 0; + padding: 5px; + border: #5A5A5A 1px solid; + background-color: #121B2F; + background-image: -webkit-gradient(linear, left top, left bottom, from(#656872), to(#121b2f), color-stop(0.1, #2c3345), color-stop(0.1, #161f32)); + -webkit-border-radius: 8px; + opacity: .97; +} +.mblTooltipBubble { + overflow: visible; + padding: 3px; + background-color: #f9f7ba; + background-image: none; +} +.mblTooltipBubble.mblTooltipAbove .mblTooltipInnerArrow { + border-bottom-color: #f9f7ba; +} +.mblTooltipBubble.mblTooltipBelow .mblTooltipInnerArrow { + border-top-color: #f9f7ba; +} +.mblTooltipBubble.mblTooltipAfter .mblTooltipInnerArrow { + border-left-color: #f9f7ba; +} +.mblTooltipBubble.mblTooltipBefore .mblTooltipInnerArrow { + border-right-color: #f9f7ba; +} +.mblTooltip.mblTooltipAfter { + margin-left: -11px; +} +.mblTooltip.mblTooltipBefore { + margin-left: 11px; +} +.mblTooltip.mblTooltipAbove { + margin-top: 11px; +} +.mblTooltip.mblTooltipBelow { + margin-top: -11px; +} +.mblTooltipAnchor { + position: absolute; + width: 1px; + height: 1px; + background-color: transparent; + line-height: 0; + font-size: 0; +} +.mblTooltipBefore .mblTooltipAnchor { + left: -1px; +} +.mblTooltipAfter .mblTooltipAnchor { + right: -1px; +} +.mblTooltipAbove .mblTooltipAnchor { + top: -1px; +} +.mblTooltipBelow .mblTooltipAnchor { + bottom: -1px; +} +.mblTooltipArrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + border: 11px solid transparent; +} +.mblTooltipBefore .mblTooltipArrow { + left: auto; + right: 1px; + top: 0; + bottom: auto; + border-left-width: 0; + border-right-color: #5A5A5A; +} +.mblTooltipAfter .mblTooltipArrow { + left: 1px; + right: auto; + top: 0; + bottom: auto; + border-right-width: 0; + border-left-color: #5A5A5A; +} +.mblTooltipAbove .mblTooltipArrow { + top: auto; + bottom: 1px; + left: auto; + right: auto; + border-top-width: 0; + border-bottom-color: #5A5A5A; +} +.mblTooltipBelow .mblTooltipArrow { + top: 1px; + bottom: auto; + left: auto; + right: auto; + border-bottom-width: 0; + border-top-color: #5A5A5A; +} +.mblTooltipInnerArrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + border: 10px solid transparent; +} +.mblTooltipBefore .mblTooltipInnerArrow { + right: 0; + top: 0; + border-left-width: 0; + border-right-color: #192235; +} +.mblTooltipAfter .mblTooltipInnerArrow { + left: 0; + top: 0; + border-right-width: 0; + border-left-color: #192235; +} +.mblTooltipAbove .mblTooltipInnerArrow { + bottom: 0; + left: 0; + border-top-width: 0; + border-bottom-color: #656872; +} +.mblTooltipBelow .mblTooltipInnerArrow { + top: 0; + left: 0; + border-bottom-width: 0; + border-top-color: #172035; +} +.mblTooltipHidden, .mblTooltipHidden * { + visibility: hidden !important; +} +.mblTooltip .mblHeading { + border-top: 3px solid #4F5055; + border-bottom: 1px solid #2D3642; + border-left: 1px solid #2A2D47; + -webkit-border-radius: 3px 3px 0 0; + background-color: #889BB3; + background-image: -webkit-gradient(linear, left top, left bottom, from(#5e6167), to(#1a1d24), color-stop(0.5, #2e322b)); + font-weight: normal; +} +.mblTooltip .mblHeading .mblToolBarButton { + border: 1px inset #434450; + background-image: -webkit-gradient(linear, left top, left bottom, from(#686f80), to(#000924), color-stop(0.5, #000b29)); + font-weight: normal; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/Tooltip.less b/js/dojo/dojox/mobile/themes/iphone/Tooltip.less new file mode 100644 index 0000000..60af6d1 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/Tooltip.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/Tooltip.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/View.css b/js/dojo/dojox/mobile/themes/iphone/View.css new file mode 100644 index 0000000..cf2151b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/View.css @@ -0,0 +1,23 @@ +@import url("../common/transitions/slide.css"); + +@import url("../common/transitions/flip.css"); + +@import url("../common/transitions/fade.css"); +/* dojox.mobile.View */ +.mblView { + position: relative; + top: 0px; + left: 0px; + width: 100%; +} +.mblView.mblIn { + position: absolute; +} +.mblFixedHeaderBar { + z-index: 1; +} +.mblFixedBottomBar { + position: absolute !important; + width: 100%; + z-index: 1; +} diff --git a/js/dojo/dojox/mobile/themes/iphone/View.less b/js/dojo/dojox/mobile/themes/iphone/View.less new file mode 100644 index 0000000..910651f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/View.less @@ -0,0 +1,6 @@ +@import url("../common/transitions/slide.css"); +@import url("../common/transitions/flip.css"); +@import url("../common/transitions/fade.css"); + +@import "variables.less"; +@import "../common/View.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/base-compat.css b/js/dojo/dojox/mobile/themes/iphone/base-compat.css new file mode 100644 index 0000000..d12cf2b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/base-compat.css @@ -0,0 +1,7 @@ +@import url("Heading-compat.css"); +@import url("RoundRect-compat.css"); +@import url("RoundRectList-compat.css"); +@import url("EdgeToEdgeCategory-compat.css"); +@import url("ListItem-compat.css"); +@import url("Switch-compat.css"); +@import url("ProgressIndicator-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/iphone/base.css b/js/dojo/dojox/mobile/themes/iphone/base.css new file mode 100644 index 0000000..2409467 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/base.css @@ -0,0 +1,12 @@ +@import url("common.css"); +@import url("Heading.css"); +@import url("View.css"); +@import url("ToolBarButton.css"); +@import url("RoundRect.css"); +@import url("EdgeToEdgeCategory.css"); +@import url("RoundRectCategory.css"); +@import url("RoundRectList.css"); +@import url("EdgeToEdgeList.css"); +@import url("ListItem.css"); +@import url("Switch.css"); +@import url("ProgressIndicator.css"); diff --git a/js/dojo/dojox/mobile/themes/iphone/common.css b/js/dojo/dojox/mobile/themes/iphone/common.css new file mode 100644 index 0000000..f2859e0 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/common.css @@ -0,0 +1,26 @@ +html.mobile, .mobile body { + width: 100%; + margin: 0px; + padding: 0px; +} +.mobile body { + overflow-x: hidden; + -webkit-text-size-adjust: none; + background-color: #c5ccd3; + font-family: Helvetica; + font-size: 17px; +} +/* Button Colors */ +.mblColorBlue { + background-color: #366EDF; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7a9de9), to(#2362dd), color-stop(0.5, #366edf), color-stop(0.5, #215fdc)); +} +/* Default Button Colors */ +.mblColorDefault { + background-color: #5877A2; + background-image: -webkit-gradient(linear, left top, left bottom, from(#8ea4c1), to(#4a6c9b), color-stop(0.5, #5877a2), color-stop(0.5, #476999)); +} +.mblColorDefaultSel { + background-color: #394D77; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7c87a4), to(#263e6c), color-stop(0.5, #394d77), color-stop(0.5, #243b69)); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/common.less b/js/dojo/dojox/mobile/themes/iphone/common.less new file mode 100644 index 0000000..4e57a5c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/common.less @@ -0,0 +1,2 @@ +@import "variables.less"; +@import "../common/common.less"; diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/arrow-button-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/arrow-button-bg.png Binary files differnew file mode 100644 index 0000000..5efaa9e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/arrow-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/arrow-button-head.png b/js/dojo/dojox/mobile/themes/iphone/compat/arrow-button-head.png Binary files differnew file mode 100644 index 0000000..85beb43 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/arrow-button-head.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/blue-button-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/blue-button-bg.png Binary files differnew file mode 100644 index 0000000..3bd558b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/blue-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/blue-button-sel-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/blue-button-sel-bg.png Binary files differnew file mode 100644 index 0000000..6968458 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/blue-button-sel-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/button-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/button-bg.png Binary files differnew file mode 100644 index 0000000..0d378fa --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/button-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/button-sel-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/button-sel-bg.png Binary files differnew file mode 100644 index 0000000..c8a71b8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/button-sel-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/edge-categ-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/edge-categ-bg.png Binary files differnew file mode 100644 index 0000000..3a62e14 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/edge-categ-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/gray-arrow.png b/js/dojo/dojox/mobile/themes/iphone/compat/gray-arrow.png Binary files differnew file mode 100644 index 0000000..c93d17f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/gray-arrow.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/heading-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/heading-bg.png Binary files differnew file mode 100644 index 0000000..888a92e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/heading-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/icon-content-heading-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/icon-content-heading-bg.png Binary files differnew file mode 100644 index 0000000..3daa1a8 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/icon-content-heading-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/ipad-arrow-button-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/ipad-arrow-button-bg.png Binary files differnew file mode 100644 index 0000000..b2afca9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/ipad-arrow-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/ipad-arrow-button-head.png b/js/dojo/dojox/mobile/themes/iphone/compat/ipad-arrow-button-head.png Binary files differnew file mode 100644 index 0000000..503c685 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/ipad-arrow-button-head.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/ipad-heading-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/ipad-heading-bg.png Binary files differnew file mode 100644 index 0000000..614bbbd --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/ipad-heading-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/red-button-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/red-button-bg.png Binary files differnew file mode 100644 index 0000000..799870f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/red-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/red-button-sel-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/red-button-sel-bg.png Binary files differnew file mode 100644 index 0000000..cc57b2b --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/red-button-sel-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/slider-h-bar-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/slider-h-bar-bg.png Binary files differnew file mode 100644 index 0000000..212d59f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/slider-h-bar-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/slider-h-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/slider-h-bg.png Binary files differnew file mode 100644 index 0000000..b5f77b1 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/slider-h-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/slider-handle-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/slider-handle-bg.png Binary files differnew file mode 100644 index 0000000..4b5bb6c --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/slider-handle-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/switch-arc-l.gif b/js/dojo/dojox/mobile/themes/iphone/compat/switch-arc-l.gif Binary files differnew file mode 100644 index 0000000..60fa6e0 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/switch-arc-l.gif diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/switch-arc-r.gif b/js/dojo/dojox/mobile/themes/iphone/compat/switch-arc-r.gif Binary files differnew file mode 100644 index 0000000..2d1cbce --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/switch-arc-r.gif diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/switch-arc1-k.gif b/js/dojo/dojox/mobile/themes/iphone/compat/switch-arc1-k.gif Binary files differnew file mode 100644 index 0000000..6596e32 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/switch-arc1-k.gif diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/switch-arc2-k.gif b/js/dojo/dojox/mobile/themes/iphone/compat/switch-arc2-k.gif Binary files differnew file mode 100644 index 0000000..bf307b1 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/switch-arc2-k.gif diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/switch-default-k.gif b/js/dojo/dojox/mobile/themes/iphone/compat/switch-default-k.gif Binary files differnew file mode 100644 index 0000000..9accbf5 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/switch-default-k.gif diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/switch-default-l.gif b/js/dojo/dojox/mobile/themes/iphone/compat/switch-default-l.gif Binary files differnew file mode 100644 index 0000000..c42f5ba --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/switch-default-l.gif diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/switch-default-r.gif b/js/dojo/dojox/mobile/themes/iphone/compat/switch-default-r.gif Binary files differnew file mode 100644 index 0000000..74499d5 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/switch-default-r.gif diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/switch-round-l.gif b/js/dojo/dojox/mobile/themes/iphone/compat/switch-round-l.gif Binary files differnew file mode 100644 index 0000000..6061d6d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/switch-round-l.gif diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/switch-round-r.gif b/js/dojo/dojox/mobile/themes/iphone/compat/switch-round-r.gif Binary files differnew file mode 100644 index 0000000..cf53086 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/switch-round-r.gif diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/switch-round1-k.gif b/js/dojo/dojox/mobile/themes/iphone/compat/switch-round1-k.gif Binary files differnew file mode 100644 index 0000000..6b9fe0a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/switch-round1-k.gif diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/switch-round2-k.gif b/js/dojo/dojox/mobile/themes/iphone/compat/switch-round2-k.gif Binary files differnew file mode 100644 index 0000000..dfa763e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/switch-round2-k.gif diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/tab-button-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/tab-button-bg.png Binary files differnew file mode 100644 index 0000000..f8d6ef0 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/tab-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/tab-sel-button-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/tab-sel-button-bg.png Binary files differnew file mode 100644 index 0000000..c3b0a33 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/tab-sel-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/tooltip-button-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/tooltip-button-bg.png Binary files differnew file mode 100644 index 0000000..03bf47f --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/tooltip-button-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/tooltip-heading-bg.png b/js/dojo/dojox/mobile/themes/iphone/compat/tooltip-heading-bg.png Binary files differnew file mode 100644 index 0000000..e7a64fa --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/tooltip-heading-bg.png diff --git a/js/dojo/dojox/mobile/themes/iphone/compat/white-arrow.png b/js/dojo/dojox/mobile/themes/iphone/compat/white-arrow.png Binary files differnew file mode 100644 index 0000000..84e435a --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/compat/white-arrow.png diff --git a/js/dojo/dojox/mobile/themes/iphone/images/thumb-overlay-large.png b/js/dojo/dojox/mobile/themes/iphone/images/thumb-overlay-large.png Binary files differnew file mode 100644 index 0000000..dfac370 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/images/thumb-overlay-large.png diff --git a/js/dojo/dojox/mobile/themes/iphone/images/thumb-overlay-small.png b/js/dojo/dojox/mobile/themes/iphone/images/thumb-overlay-small.png Binary files differnew file mode 100644 index 0000000..b6836d9 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/images/thumb-overlay-small.png diff --git a/js/dojo/dojox/mobile/themes/iphone/images/thumb-overlay.png b/js/dojo/dojox/mobile/themes/iphone/images/thumb-overlay.png Binary files differnew file mode 100644 index 0000000..b16efec --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/images/thumb-overlay.png diff --git a/js/dojo/dojox/mobile/themes/iphone/ipad-compat.css b/js/dojo/dojox/mobile/themes/iphone/ipad-compat.css new file mode 100644 index 0000000..d48170e --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ipad-compat.css @@ -0,0 +1,17 @@ +/* mbl.widget.Heading */ +.dj_tablet .mblHeading { + background-image: url(compat/ipad-heading-bg.png); +} + +/* Heading Arrow Button */ +.dj_tablet .mblArrowButtonHead { + background-image: url(compat/ipad-arrow-button-head.png); +} +.dj_tablet .mblArrowButtonBody { + background-image: url(compat/ipad-arrow-button-bg.png); +} + +/* mbl.widget.TabBar */ +.dj_tablet .mblTabPanelHeader { + background-image: url(compat/ipad-heading-bg.png); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/ipad.css b/js/dojo/dojox/mobile/themes/iphone/ipad.css new file mode 100644 index 0000000..b17502d --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/ipad.css @@ -0,0 +1,152 @@ +/* dojox.mobile.View */ + +/* dojox.mobile.Heading */ +.dj_tablet .mblHeading { + background-color: #889BB3; + background: -webkit-gradient(linear, left top, left bottom, from(#F3F4F6), to(#A7ABB8)); + border-top: 1px solid #FEFEFE; + border-bottom: 1px solid #787E8F; + color: #70777F; + text-shadow: rgba(256,256,256,0.6) 0px 1px 0px; +} + +/*Headings and Button styles are overridden in Tooltips*/ +.dj_tablet .mblTooltip .mblHeading { + position: relative; + margin: 0px; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + padding: 0px; + height: 42px; + background-color: #889BB3; + background-image: -webkit-gradient(linear, left top, left bottom, from(#5E6167), to(#1A1D24), color-stop(0.5, #2E322B)); + border-top: 3px solid #4F5055; + border-bottom: 1px solid #2D3642; + color: white; + font-family: Helvetica; + font-size: 20px; + font-weight: normal; + text-align: center; + line-height: 44px; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0px; + z-index: 1; + border-left: 1px solid #2A2D47; + -webkit-border-radius: 3px 3px 0 0; +} +.dj_tablet .mblTooltip .mblHeading .mblToolBarButton { + float: left; + position: relative; + cursor: pointer; + -webkit-tap-highlight-color: rgba(255,255,255,0); + margin: 6px; + padding: 0px 10px; + height: 29px; + border: 1px inset #434450; + font-family: Helvetica; + font-size: 13px; + font-weight: normal; + color: white; + line-height: 29px; + text-align: center; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#686F80), to(#000924), color-stop(0.5, #000B29)); +} + +/* Heading Arrow Button */ +.dj_tablet .mblArrowButtonHead { + border-color: #4D4E50; + background: -webkit-gradient(linear, left top, right bottom, from(#B1B5BB), to(#6A727D)); +} +.dj_tablet .mblArrowButtonBody { + border-color: #C0C0C0; + background-color: #8B919A; + background: -webkit-gradient(linear, left top, left bottom, from(#B1B5BB), to(#6A727D)); + -webkit-tap-highlight-color: rgba(255,255,255,0); + text-shadow: rgba(0,0,0,0.6) 0px -1px 0px; +} +.dj_tablet .mblArrowButtonSelected .mblArrowButtonHead { + background: -webkit-gradient(linear, left top, right bottom, from(#9DA0A3), to(#43484F)); +} +.dj_tablet .mblArrowButtonSelected .mblArrowButtonBody { + background: -webkit-gradient(linear, left top, left bottom, from(#9DA0A3), to(#43484F)); +} + +/* dojox.mobile.RoundRect */ +.dj_tablet .mblRoundRect { + margin: 7px 30px 30px 30px; +} +.dj_tablet .mblHeading + .mblRoundRect { + margin-top: 30px; +} + +/* dojox.mobile.EdgeToEdgeCategory */ +/* dojox.mobile.RoundRectCategory */ +.dj_tablet .mblRoundRectCategory { + margin: 18px 0px 0px 41px; +} + +/* dojox.mobile.RoundRectList */ +.dj_tablet .mblRoundRectList { + margin: 7px 30px 30px 30px; +} +.dj_tablet .mblRoundRectList:first-child { + margin-top: 25px; +} +.dj_tablet .mblHeading + .mblRoundRectList { + margin-top: 30px; +} + +/* dojox.mobile.EdgeToEdgeList */ +/* dojox.mobile.ListItem */ +/* Switch */ +/* Icon Container */ +/* Icon Content Heading */ +/* dojox.mobile.Button */ +/* Tab Container */ +/* Progress Indicator */ + +/* dojox.mobile.TabBar */ +.dj_tablet .mblTabPanelHeader { + background-color: #889BB3; + background: -webkit-gradient(linear, left top, left bottom, from(#F3F4F6), to(#A7ABB8)); + border-top: 1px solid #FEFEFE; + border-bottom: 1px solid #787E8F; + color: #70777F; + text-shadow: rgba(256,256,256,0.6) 0px 1px 0px; +} + +/* dojox.mobile.TabBarButton */ +.dj_tablet .mblTabButton { + font-weight: bold; + color: #70777F; + text-shadow: none; + border-color: silver; + background-color: #CCCED6; + background: -webkit-gradient(linear, left top, left bottom, from(#F3F4F6), to(#A7ABB8)); +} +.dj_tablet .mblTabPanelHeader .mblTabButton.mblTabButtonSelected { + color: white; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0px; + background-color: #8B919A; + background-image: -webkit-gradient(linear, left top, left bottom, from(#B1B5BB), to(#6A727D)); +} + +/* dojox.mobile.ToolBarButton */ +.dj_tablet .mblToolBarButton { + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0px; + border: 1px inset silver; +} + +/* Default Button Colors */ +.dj_tablet .mblColorDefault { + background-color: #8B919A; + background-image: -webkit-gradient(linear, left top, left bottom, from(#B1B5BB), to(#6A727D)); + +} +.dj_tablet .mblColorDefaultSel { + background-color: #515761; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7A7E85), to(#303845)); +} diff --git a/js/dojo/dojox/mobile/themes/iphone/iphone-app-compat.css b/js/dojo/dojox/mobile/themes/iphone/iphone-app-compat.css new file mode 100644 index 0000000..dc0a814 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/iphone-app-compat.css @@ -0,0 +1,24 @@ +/* mbl.widget.Heading */ +@import url("iphone-compat.css"); + +.alertTitle { + background-image: url(compat/heading-bg.png); +} + +.mblImageThumbView .mblThumb { + -moz-transition: all 0.5s ease-in-out; + -o-transition: all 0.5s ease-in-out; +} + +.mblImageThumbView .mblThumb:hover { + -moz-transform: scale(1.2); + -moz-transition: all 0.3s ease-in-out; + -o-transform: scale(1.2); + -o-transition: all 0.3s ease-in-out; +} +.mblImageThumbView .mblThumbInner .mblThumbMask .mblThumbSrc { + -moz-background-size: 100% 100%; + -moz-border-radius: 5px; + -o-background-size: 100% 100%; + -o-border-radius: 5px; +}
\ No newline at end of file diff --git a/js/dojo/dojox/mobile/themes/iphone/iphone-app.css b/js/dojo/dojox/mobile/themes/iphone/iphone-app.css new file mode 100644 index 0000000..d91d2f4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/iphone-app.css @@ -0,0 +1,341 @@ +@import url("iphone.css"); + +.alertDialog { + width: 100%; + padding-left: 2px; + padding-right: 2px; + z-index: 1000; +} + +.alertDialogBody { + border: 1px solid #ADAAAD; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + background-color: white; + margin-left: 2px; + margin-right: 4px; +} + +.alertTitle { + height: 42px; + margin: 0px; + padding: 0px; + background-color: #889BB3; + background: -webkit-gradient(linear, left top, left bottom, from(#B0BCCD), to(#6D84A2), color-stop(0.5, #889BB3), color-stop(0.5, #8195AF)); + border-top: 1px solid #CDD5DF; + border-bottom: 1px solid #2D3642; + font-family: Helvetica; + font-size: 20px; + color: white; + text-align: center; + line-height: 44px; + text-shadow: rgba(0,0,0,0.6) 0px -1px 0px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + text-align: center; +} + +.alertText { + text-align: center; +} + +.alertBtns { + padding: 5px; + text-align: center; +} + +.alertBtns .mblButton { + width: 100%; + margin-top: 5px; +} + +.alertDialog.mblOut { + position: absolute; +} + +.alertDialog.mblIn { + position: absolute; +} + +.mblSlidev.mblOut { + -webkit-animation-duration: .4s; + -webkit-animation-name: mblSlideOut; + -webkit-animation-timing-function: linear; + -webkit-transform: translateY(-100%); +} +.mblSlidev.mblIn { + -webkit-animation-duration: .4s; + -webkit-animation-name: mblSlideIn; + -webkit-animation-timing-function: linear; + -webkit-transform: translateY(0px); +} +.mblSlidev.mblOut.mblReverse { + -webkit-animation-name: mblSlideOutReverse; +} +.mblSlidev.mblIn.mblReverse { + -webkit-animation-name: mblSlideInReverse; +} + +.dialogUnderlayWrapper { + position: absolute; + left: 0; + top: 0; + z-index: 998; + background: transparent !important; + visibility: visible; + height: 100%; + width: 100%; +} + +.dialogUnderlay { + background-color: #eee; + opacity: 0.5; + width: 100%; + height: 100%; +} + +.list .row { + padding: 10px; + border-bottom: 1px solid #444; + position: relative; + background-color: white; + z-index: 6; /* Must be greater than the .buttons z-index */ +} +.list .row.mblListItem { + padding: 0px; +} + +.list .row.last { + border-bottom: none; +} + +.list .row.hold { + background-color: #ddd; +} + +.list .buttons { + position: absolute; + text-align: center; + padding-top: 10px; + width: 100%; + height: 100%; + z-index: 5; +} + +.list .buttons .mblButton { +} + +.list .buttons .deleteBtn { + background-color: red; + +} +.list .buttons .cancelBtn { + margin-left: 10px; + background-color: blue; +} + +.row.collapsed { + -webkit-animation-name: collapse-vert; + -webkit-animation-duration: 0.5s; + -webkit-animation-timing-function: linear; +} + +@-webkit-keyframes collapse-vert { + from { + height: 100%; + padding: 10px; + } + to { + height: 0px; + padding: 0px; + } +} + +.listSelector { + position: absolute; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border: 1px solid #666; + background-color: #ccc; + color: #333; + z-index: 1000; +} +.listSelectorRow { + padding: 10px; + border-bottom: 1px solid #666; + white-space: nowrap; +} +.listSelectorRow-selected { + background-color: #666; + color: #ccc; +} + +.listSelectorRow.last { + border-bottom: none; +} + +.mblImageView, .mblImageView canvas { + width: 100%; + height: 100%; +} + +.mblPillar { + display: none; +} + +/* Form Input Styles */ + +input { + -webkit-text-size-adjust: 140%; +} + + +/* ImageThumbView styles */ +.mblImageThumbView { + position: relative; + -webkit-transition-property: height; + -webkit-transition-duration: 0.8s; + -webkit-transition-delay: 0; +} + +.mblImageThumbView .mblThumb { + width: 100px; + min-height: 100px; + display: inline-block; + z-index: 2; + position: absolute; +} + +.mblImageThumbView.animated .mblThumb { + -webkit-transition-property: -webkit-transform, opacity; + -webkit-transition-duration: 1.3s, 1s; + -webkit-transition-delay: 0, 0; +} + +.mblImageThumbView .mblThumb.hidden { + z-index: 1; + opacity: 0; +} +.mblImageThumbView .mblThumbInner { + width: 102px; + height: 102px; + position: relative; +} + +.mblImageThumbView .mblThumbOverlay { + width: 102px; + height: 102px; + background: url(images/thumb-overlay.png) center top no-repeat; + position: absolute; + z-index: 20; + overflow: hidden; +} +.mblImageThumbView .mblThumb.selected .mblThumbOverlay { + background-position: center bottom; +} +.mblImageThumbView .mblThumbInner .mblThumbMask { + width: 90px; + height: 90px; + overflow: hidden; + padding-left: 6px; + padding-top: 5px; + z-index: 10; +} +.mblImageThumbView .mblThumbInner .mblThumbMask img { + left: 0px; + top: 0px; + width: 90px; + height: 90px; +} + +.mblImageThumbView .mblThumbInner .mblThumbMask .mblThumbSrc { + left: 6px; + top: 5px; + background-position: center center; + background-repeat: no-repeat; + overflow: hidden; + position: absolute; + -webkit-background-size: 100% 100%; + -webkit-border-radius: 5px; + width: 90px; + height: 90px; + z-index: 5; +} + +.mblImageThumbView .mblThumbMask div { + left: 0px; + top: 0px; + width: 90px; + height: 90px; + background-repeat: no-repeat; +} +.mblImageThumbView .mblThumb:hover, +.mblImageThumbView .mblThumb.selected { + -webkit-transform: scale(1.2); + transform: scale(1.2); +} + +/* Large Images */ +.mblImageThumbView.large .mblThumb { + width: 150px; + min-height: 150px; +} + +.mblImageThumbView.large .mblThumbInner{ + width: 152px; + height: 152px; +} + +.mblImageThumbView.large .mblThumbOverlay { + background: url(images/thumb-overlay-large.png) center top no-repeat; + width: 152px; + height: 152px; +} +.mblImageThumbView.large .mblThumbInner .mblThumbMask, +.mblImageThumbView.large .mblThumbInner .mblThumbMask img, +.mblImageThumbView.large .mblThumbInner .mblThumbMask .mblThumbSrc, +.mblImageThumbView.large .mblThumbMask div { + width: 133px; + height: 133px; +} + +.mblImageThumbView.large .mblThumbInner .mblThumbMask .mblThumbSrc { + left: 9px; + top: 7px; +} +/* Small Images */ +.mblImageThumbView.small .mblThumb { + width: 75px; + min-height: 75px; +} + +.mblImageThumbView.small .mblThumbInner{ + width: 77px; + height: 77px; +} + +.mblImageThumbView.small .mblThumbOverlay { + background: url(images/thumb-overlay-small.png) center top no-repeat; + width: 77px; + height: 77px; +} +.mblImageThumbView.small .mblThumbInner .mblThumbMask, +.mblImageThumbView.small .mblThumbInner .mblThumbMask img, +.mblImageThumbView.small .mblThumbInner .mblThumbMask .mblThumbSrc, +.mblImageThumbView.small .mblThumbMask div { + width: 70px; + height: 70px; +} + +.mblImageThumbView.small .mblThumbInner .mblThumbMask .mblThumbSrc { + left: 4px; + top: 3px; +} + +.mblImageThumbView .mblThumbLabel { + font-size: smaller; + overflow: hidden; + white-space: nowrap; + text-align: center; +}
\ No newline at end of file diff --git a/js/dojo/dojox/mobile/themes/iphone/iphone-compat.css b/js/dojo/dojox/mobile/themes/iphone/iphone-compat.css new file mode 100644 index 0000000..f5a0140 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/iphone-compat.css @@ -0,0 +1,18 @@ +@import url("base-compat.css"); + +/* common styles */ +@import url("../common/domButtons-compat.css"); +@import url("../common/SpinWheel-compat.css"); + +/* widget styles */ +@import url("Button-compat.css"); +@import url("CheckBox-compat.css"); +@import url("ComboBox-compat.css"); +@import url("IconContainer-compat.css"); +@import url("Opener-compat.css"); +@import url("RadioButton-compat.css"); +@import url("Slider-compat.css"); +@import url("TabBar-compat.css"); +@import url("TextArea-compat.css"); +@import url("TextBox-compat.css"); +@import url("ToggleButton-compat.css"); diff --git a/js/dojo/dojox/mobile/themes/iphone/iphone.css b/js/dojo/dojox/mobile/themes/iphone/iphone.css new file mode 100644 index 0000000..a50e0ce --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/iphone.css @@ -0,0 +1,22 @@ +@import url("base.css"); + +/* common styles */ +@import url("../common/domButtons.css"); +@import url("../common/FixedSplitter.css"); +@import url("../common/SpinWheel.css"); +@import url("../common/transitions.css"); + +/* widget styles */ +@import url("Button.css"); +@import url("Carousel.css"); +@import url("CheckBox.css"); +@import url("ComboBox.css"); +@import url("IconContainer.css"); +@import url("Opener.css"); +@import url("PageIndicator.css"); +@import url("RadioButton.css"); +@import url("Slider.css"); +@import url("TabBar.css"); +@import url("TextArea.css"); +@import url("TextBox.css"); +@import url("ToggleButton.css"); diff --git a/js/dojo/dojox/mobile/themes/iphone/variables.less b/js/dojo/dojox/mobile/themes/iphone/variables.less new file mode 100644 index 0000000..007cab4 --- /dev/null +++ b/js/dojo/dojox/mobile/themes/iphone/variables.less @@ -0,0 +1,726 @@ +// common.less +.mobile-body-styles () { + background-color: rgb(197,204,211); + font-family: Helvetica; + font-size: 17px; +} + +.mblView-styles () { +} + +.mblColorBlue-styles () { + background-color: #366EDF; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7A9DE9), to(#2362DD), color-stop(0.5, #366EDF), color-stop(0.5, #215FDC)); +} +.mblColorDefault-styles () { + background-color: #5877A2; + background-image: -webkit-gradient(linear, left top, left bottom, from(#8EA4C1), to(#4A6C9B), color-stop(0.5, #5877A2), color-stop(0.5, #476999)); +} +.mblColorDefaultSel-styles () { + background-color: #394D77; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7C87A4), to(#263E6C), color-stop(0.5, #394D77), color-stop(0.5, #243B69)); +} + +// Heading.less +.mblHeading-styles () { + padding: 0px; + height: 42px; + background-color: #889BB3; + background-image: -webkit-gradient(linear, left top, left bottom, from(#B0BCCD), to(#6D84A2), color-stop(0.5, #889BB3), color-stop(0.5, #8195AF)); + border-top: 1px solid #CDD5DF; + border-bottom: 1px solid #2D3642; + color: white; + font-family: Helvetica; + font-size: 20px; + font-weight: bold; + text-align: center; + line-height: 44px; + text-shadow: rgba(0,0,0,0.6) 0px -1px 0px; +} +.mblArrowButton-styles () { + height: 42px; +} +.mblArrowButtonHead-styles () { + top: 11px; + left: 5px; + width: 20px; + height: 19px; + border: 1px solid #3A4655; + -webkit-transform: scale(0.7, 1) rotate(45deg); + background-image: -webkit-gradient(linear, left top, right bottom, from(#8EA4C1), to(#4A6C9B), color-stop(0.5, #5877A2), color-stop(0.5, #476999)); +} +.mblArrowButtonHeadChrome-styles () { + border: 1px inset #3A4655; +} +.mblArrowButtonBody-styles () { + top: 6px; + left: 16px; + padding: 0px 10px 0px 4px; + height: 29px; + border-width: 1px 1px 1px 0px; + border-style: inset; + border-color: #9CACC0; + font-family: Helvetica; + font-size: 13px; + color: white; + line-height: 29px; + -webkit-border-top-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + background-color: #5877A2; + background-image: -webkit-gradient(linear, left top, left bottom, from(#8EA4C1), to(#4A6C9B), color-stop(0.5, #5877A2), color-stop(0.5, #476999)); +} +.mblArrowButtonSelected-styles () { +} +.mblArrowButtonHeadSelected-styles () { + background-image: -webkit-gradient(linear, left top, right bottom, from(#7C87A4), to(#263E6C), color-stop(0.5, #394D77), color-stop(0.5, #243B69)); +} +.mblArrowButtonBodySelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#7C87A4), to(#263E6C), color-stop(0.5, #394D77), color-stop(0.5, #243B69)); +} + +// ToolBarButton.less +.mblToolBarButton-styles () { + margin: 6px; + height: 29px; + border: 1px inset #9CACC0; + font-family: Helvetica; + font-size: 13px; + font-weight: bold; + color: white; + line-height: 29px; + text-align: center; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; +} +.mblToolBarButtonDomButton-styles () { +} +.mblToolBarButtonIcon-styles () { +} + +// RoundRect.less +.mblRoundRect-styles () { + margin: 7px 9px 16px 9px; + padding: 8px; + border: 1px solid #ADAAAD; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + background-color: white; +} +.mblRoundRectShadowBox-styles () { + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5); +} + +// EdgeToEdgeCategory.less +.mblEdgeToEdgeCategory-styles () { + margin: 0px; + padding: 0px 10px; + height: 22px; + border-top: 1px solid #A4B0B9; + border-bottom: 1px solid #979DA3; + background-image: -webkit-gradient(linear, left top, left bottom, from(#8F9EA9), to(#B7C0C7)); + font-family: Helvetica; + font-size: 16px; + font-weight: bold; + color: white; + line-height: 22px; + text-shadow: rgba(0,0,0,0.6) 0px -1px 0px; +} + +// RoundRectCategory.less +.mblRoundRectCategory-styles () { + padding: 18px 0px 0px 20px; + margin: 0px; + font-family: Helvetica; + font-size: 16px; + color: #4C566C; + text-shadow: rgba(255, 255, 255, 1) 0px 1px 0px; +} + +// RoundRectList.less +.mblRoundRectList-styles () { + margin: 7px 9px 16px 9px; + padding: 0px; + border: 1px solid #ADAAAD; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + background-color: white; +} +.mblRoundRectList-withCategory-styles () { +} +.mblRoundRectList-FirstListItem-styles () { + -webkit-border-top-left-radius: 8px; + -webkit-border-top-right-radius: 8px; + -moz-border-radius-topleft: 8px; + -moz-border-radius-topright: 8px; +} +.mblRoundRectList-withCategory-FirstListItem-styles () { +} +.mblRoundRectList-LastListItem-styles () { + border-bottom-width: 0px; + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; +} + +// EdgeToEdgeList.less +.mblEdgeToEdgeList-styles () { + margin: 0px; + padding: 0px; + background-color: white; +} +.mblEdgeToEdgeList-LastListItem-styles () { + border-bottom-color: #707C84; +} + +// ListItem.less +.mblListItem-styles () { + padding: 0px 0px 0px 8px; + height: 43px; + border-bottom: 1px solid #ADAAAD; + font-weight: bold; + color: black; + line-height: 43px; +} +.mblListItem-mblVariableHeight-styles () { + padding: 11px 0px 10px 6px; + line-height: normal; +} +.mblListItem-mblListItemAnchor-styles () { + background-position: 9px 7px; + text-decoration: none; + padding-right: 7px; +} +.mblItemSelected-styles () { + background-color: #048BF4; + background-image: -webkit-gradient(linear, left top, left bottom, from(#048BF4), to(#005CE5)); +} +.mblItemSelected-mblListItemAnchor-styles () { + color: white; +} +.mblItemSelected-mblDomButton-Div-styles () { + border-color: white; +} +.mblItemSelected-mblListItemSubText-styles () { +} +.mblListItemTextBoxSelected-styles () { + background-color: #048BF4; +} +.mblListItemChecked-styles () { + color: #314E84; +} +.mblListItemIcon-styles () { + margin-top: 7px; + margin-right: 11px; +} +.mblListItemSpriteIcon-styles () { + margin-top: 7px; + margin-left: 8px; +} +.mblListItemRightIcon-styles () { + margin-top: 7px; + margin-bottom: -7px; +} +.mblListItemRightText-styles () { + color: #324F85; + margin: 11px 4px 0 0; +} +.mblListItemTextBox-styles () { +} +.mblListItemAnchorNoIcon-mblListItemTextBox-styles () { +} +.mblListItemSubText-styles () { +} + +// Switch.less +.mblItemSwitch-styles () { + top: 8px; +} +.mblSwitchBg-styles () { + -webkit-border-radius: 5px; +} +.mblSwitchBgLeft-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#2859B1), to(#75ACFB), color-stop(0.5, #3F84EB), color-stop(0.5, #4C8EEE)); +} +.mblSwitchBgRight-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#CECECE), to(#FDFDFD), color-stop(0.5, #EEEEEE), color-stop(0.5, #F8F8F8)); +} +.mblSwitchKnob-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#CCCCCC), to(#FAFAFA)); + -webkit-border-radius: 5px; +} + +// Button.less +.mblButton-styles () { + padding: 0px 10px; + height: 29px; + border: #9CACC0 1px outset; + -webkit-border-radius: 5px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#FDFDFD), to(#CECECE), color-stop(0.5, #F8F8F8), color-stop(0.5, #EEEEEE)); + color: black; + font-family: Helvetica; + font-size: 13px; + line-height: 29px; +} +.mblButton-mblBlueButton-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7A9DE9), to(#2362DD), color-stop(0.5, #366EDF), color-stop(0.5, #215FDC)); + color: white; +} +.mblButton-mblBlueButtonSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#8EA4C1), to(#4A6C9B), color-stop(0.5, #5877A2), color-stop(0.5, #476999)); + color: white; +} +.mblButton-mblRedButton-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#FA9D58), to(#EE4115), color-stop(0.5, #FF4D25), color-stop(0.5, #ED4D15)); + color: white; +} +.mblButton-mblRedButtonSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#C1A48E), to(#9B6C4A), color-stop(0.5, #A27758), color-stop(0.5, #996947)); + color: white; +} +.mblButtonSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#F0F0F0), to(#BFBFBF), color-stop(0.5, #EBEBEB), color-stop(0.5, #DEDEDE)); + color: black; +} +.mblButtonDisabled-styles () { + border-color: grey; + background-image: none; + color: grey; +} + +// CheckBox.less +.mblCheckBox-styles () { + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + border: #9CACC0 1px outset; + -webkit-border-radius: 5px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#FDFDFD), to(#CECECE), color-stop(0.5, #F8F8F8), color-stop(0.5, #EEEEEE)); + font: inherit; + -webkit-transform: translateY(0.45em); +} +.mblCheckBoxSelected-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#F0F0F0), to(#BFBFBF), color-stop(0.5, #EBEBEB), color-stop(0.5, #DEDEDE)); +} +.mblCheckBoxChecked-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7A9DE9), to(#2362DD), color-stop(0.5, #366EDF), color-stop(0.5, #215FDC)); +} +.mblCheckBoxChecked-after-styles () { + position: absolute; + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.3em; + border-color: white; + border-width: 0.15em; + border-style: none solid solid none; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblCheckBoxChecked-mblCheckBoxSelected-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#8EA4C1), to(#4A6C9B), color-stop(0.5, #5877A2), color-stop(0.5, #476999)); +} +.mblCheckBoxChecked-mblCheckBoxSelected-after-styles () { + border-color: #9CACC0; +} + +// ComboBox.less +.dijitPopup-styles () { + -webkit-box-shadow: 0px 0px 50px black; + -webkit-border-radius: 0px; +} +.mblComboBoxMenu-styles () { + border: 1px solid black; + -webkit-border-radius: 0px; + background-color: white; +} +.mblComboBoxMenuItemSelected-styles () { + background-color: black; + background-image: -webkit-gradient(linear, left top, left bottom, from(#048BF4), to(#005CE5)); + color: white; +} +.mblComboBoxMenuItem-styles () { + padding: .1em .2em; + border-width: 1px 0 1px 0; + border-style: solid; + border-color: #ffffff; + color: inherit; + text-align: left; +} +.mblComboBoxMenuPreviousButton-styles () { + font-style: italic; + overflow: hidden; +} + +// IconContainer.less +.mblIconContainer-styles () { + margin: 20px 0px 0px 10px; + padding: 0px 0px 40px 0px; +} + +// IconItem.less +.mblIconItemTerminator-styles () { + height: 20px; +} +.mblIconItemSub-styles () { + margin-left: -10px; + background-color: white; +} +.mblIconArea-styles () { + margin-bottom: 10px; + height: 78px; + width: 74px; + font-family: Helvetica; + font-size: 12px; + text-align: center; +} +.mblContent-styles () { + padding-bottom: 20px; +} +.mblIconContentHeading-styles () { + margin-top: 0px; + padding-left: 40px; + height: 25px; + border-top: 1px solid #F1F3F4; + border-bottom: 1px solid #717D85; + background-image: -webkit-gradient(linear, left top, left bottom, from(#E0E4E7), to(#B4BEC6), color-stop(0.5, #C4CCD2), color-stop(0.5, #BFC8CE)); + font-family: Helvetica; + font-size: 14px; + color: white; + line-height: 26px; + text-shadow: rgba(0,0,0,0.6) 0px -1px 0px; +} + +// RadioButton.less +.mblRadioButton-styles () { + margin: -0.5em 3px 0.3em 4px; + width: 1em; + height: 1em; + border: #9CACC0 1px outset; + -webkit-border-radius: 0.5em; + background-image: -webkit-gradient(linear, left top, left bottom, from(#FDFDFD), to(#CECECE), color-stop(0.5, #F8F8F8), color-stop(0.5, #EEEEEE)); + font: inherit; + -webkit-transform: translateY(0.45em); +} +.mblRadioButtonChecked-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#7A9DE9), to(#2362DD), color-stop(0.5, #366EDF), color-stop(0.5, #215FDC)); +} +.mblRadioButtonChecked-after-styles () { + content: ""; + width: 0.3em; + height: 0.6em; + top: 0; + left: 0.25em; + border-color: white; + border-width: 0.15em; + border-style: none solid solid none; + border-color: white; + -webkit-transform: rotate(45deg); + -webkit-transform-origin: 50% 50%; +} +.mblRadioButtonChecked-Selected-styles () { + border-color: #9CACC0; + background-image: -webkit-gradient(linear, left top, left bottom, from(#8EA4C1), to(#4A6C9B), color-stop(0.5, #5877A2), color-stop(0.5, #476999)); +} +.mblRadioButtonChecked-Selected-after-styles () { + border-color: white; +} + +// Slider.less +.mblSlider-styles () { + margin: 15px; /* 1/2 handle width for hanging off the ends of the bar */ + border: #B0B0B0 1px inset; + background-image: -webkit-gradient(linear, left top, left bottom, from(#ABABAB), to(#FEFEFE)); + -webkit-border-radius: 8px; +} +.mblSliderProgressBar-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#0D48A8), to(#68A6F8)); + -webkit-border-radius: 8px; +} +.mblSliderHandle-styles () { + margin: -10px 0 0 -10px; + width: 18px; + height: 18px; + border: #9D9D9D 1px outset; + -webkit-border-radius: 10px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#A6A6A6), to(#FCFCFC)); +} + +// TabBar.less +.mblTabBar-styles () { + margin: 0px; + padding: 0px; + height: 48px; + border-top: 1px solid #000000; + background-color: #000000; + background-image: -webkit-gradient(linear, left top, left bottom, from(#2D2D2D), to(#000000), color-stop(0.5, #141414), color-stop(0.5, #000000)); + color: white; + text-align: center; +} +.mblTabBar-TabBarButton-styles () { +} +.mblTabBar-TabBarButton-Selected-styles () { + -webkit-border-radius: 3px; + background-color: #404040; + background-image: -webkit-gradient(linear, left top, left bottom, from(#484848), to(#242424), color-stop(0.5, #353535), color-stop(0.5, #242424)); +} +.mblTabBarButtonDiv-styles () { + height: 34px; + width: 29px; +} +.mblTabBarButtonIcon-styles () { + left: 0px; + top: 2px; +} +.mblTabBarButtonTextBox-styles () { + color: #979797; + font-family: "Helvetica Neue", Helvetica; + font-size: 11px; +} +.mblTabBarNoIcons-TabBarButtonTextBox-styles () { + line-height: 34px; + font-size: 20px; +} +.mblTabButton-styles () { + width: 100px; + height: 28px; + border-width: 1px 1px 1px 0px; + border-style: inset; + border-color: #9CACC0; + border-right-color: #5E708A; + background-image: -webkit-gradient(linear, left top, left bottom, from(#ABB9CA), to(#788DA9), color-stop(0.5, #8297AF), color-stop(0.5, #768BA7)); + font-family: Helvetica; + font-size: 13px; + color: white; + text-align: center; + line-height: 29px; +} +.mblTabButton-TabBarButtonAnchor-styles () { + height: 29px; +} +.mblTabBarTop-TabButton-TabBarButtonDiv-styles () { + display: none; +} +.mblTabBarHead-TabButton-TabBarButtonDiv-styles () { +} +.mblTabButton-FirstTabButtom-styles () { + -webkit-border-top-left-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + border-left-width: 1px; +} +.mblTabButton-LastTabButton-styles () { + -webkit-border-top-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + border-right-color: #9CACC0; +} +.mblTabButton-img-styles () { +} +.mblTabBarButtonTextBoxSelected-styles () { + color: white; +} +.mblTabButtonSelected-styles () { +} +.mblTabButtonHighlighted-styles () { +} +.mblTabButtonImgDiv-styles () { + display: none; +} +.mblTabPanelHeader-styles () { + margin: 0px; + padding: 3px 0px 0px 0px; + height: 39px; + border-top: 1px solid #CDD5DF; + border-bottom: 1px solid #2D3642; + background-color: #889BB3; + background-image: -webkit-gradient(linear, left top, left bottom, from(#B0BCCD), to(#6D84A2), color-stop(0.5, #889BB3), color-stop(0.5, #8195AF)); + font-family: Helvetica; + font-size: 20px; + color: white; + text-align: center; + line-height: 44px; + text-shadow: rgba(0,0,0,0.6) 0px -1px 0px; +} +.mblTabPanelHeader-TabButton-styles () { + margin-top: 3px; +} +.mblTabPanelHeader-TabButtonSelected-styles () { + background-color: #5877A2; + background-image: -webkit-gradient(linear, left top, left bottom, from(#8EA4C1), to(#4A6C9B), color-stop(0.5, #5877A2), color-stop(0.5, #476999)); +} +.mblTabPanelHeader-TabButtonDomButton-styles () { + width: 43px; +} +.mblTabPanelHeader-TabButtonDomButtonClass-styles () { + left: 8px; +} +.mblTabPanelHeader-DomButton-styles () { +} +.mblTabPanelHeader-inHeading-styles () { +} +.mblTabPanelHeader-TabButton-inHeading-styles () { + margin-top: 6px; +} +.mblTabPanelHeader-TabButton-FirstTabButtom-inHeading-styles () { +} +.mblTabPanelHeader-TabButton-LastTabButtom-inHeading-styles () { +} +.mblTabPanelHeader-TabButtonSelected-inHeading-styles () { +} + +// TextArea.less +.mblTextArea-styles () { + padding: 4px 1px; + border-color: #9CACC0; + border-width: 1px; + border-style: inset; + -webkit-border-radius: 5px; + font-family: Helvetica; + font-size: 13px; +} +.mblExpandingTextArea-styles () { + margin: 2px; +} + +// TextBox.less +.mblTextBox-styles () { + height: 22px; + border: #9CACC0 1px inset; + -webkit-border-radius: 5px; + font-family: Helvetica; + font-size: 13px; +} + +// ToggleButton.less +.mblToggleButton-styles () { + padding: 0px 10px 0px 25px; + height: 29px; + border-width: 1px 1px 1px 1px; + border-style: outset; + border-color: #9CACC0; + -webkit-border-radius: 5px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#FDFDFD), to(#CECECE), color-stop(0.5, #F8F8F8), color-stop(0.5, #EEEEEE)); + font-family: Helvetica; + font-size: 13px; + color: black; + line-height: 29px; +} +.mblToggleButtonSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#F0F0F0), to(#BFBFBF), color-stop(0.5, #EBEBEB), color-stop(0.5, #DEDEDE)); + color: black; +} +.mblToggleButtonChecked-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#7A9DE9), to(#2362DD), color-stop(0.5, #366EDF), color-stop(0.5, #215FDC)); + color: white; +} +.mblToggleButtonChecked-after-styles () { + content: ""; + top: 6px; + left: 7px; + width: 5px; + height: 10px; + border-color: white; + border-width: 2px; + border-style: none solid solid none; + -webkit-transform: rotate(45deg) skew(10deg); + -webkit-transform-origin: 50% 50%; +} +.mblToggleButtonCheckedSelected-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#8EA4C1), to(#4A6C9B), color-stop(0.5, #5877A2), color-stop(0.5, #476999)); + color: white; +} +.mblToggleButtonCheckedSelected-after-styles () { + border-color: white; +} +.mblToggleButtonDisabled-styles () { + border-color: grey; + background-image: none; + color: grey; +} + +// Overlay.less +.mblOverlay-styles () { + background-image: -webkit-gradient(linear, left top, left bottom, from(#FDFDFD), to(#CECECE)); +} + +// Tooltip.less +.mblTooltip-styles () { + padding: 5px; + border: #5A5A5A 1px solid; + background-color: #121B2F; + background-image: -webkit-gradient(linear, left top, left bottom, from(#656872), to(#121B2F), color-stop(0.1,#2C3345),color-stop(0.1,#161F32)); + -webkit-border-radius: 8px; + opacity: .97; +} +.mblTooltipBubble-styles () { + background-color: #f9f7ba; + background-image: none; +} +.mblTooltipInnerArrow-Bubble-Above-styles () { + border-bottom-color: #f9f7ba; +} +.mblTooltipInnerArrow-Bubble-Below-styles () { + border-top-color: #f9f7ba; +} +.mblTooltipInnerArrow-Bubble-After-styles () { + border-left-color: #f9f7ba; +} +.mblTooltipInnerArrow-Bubble-Before-styles () { + border-right-color: #f9f7ba; +} +.mblTooltipArrow-styles () { + border: 11px solid transparent; +} +.mblTooltipArrow-Before-styles () { + border-left-width: 0; + border-right-color: #5A5A5A; +} +.mblTooltipArrow-After-styles () { + border-right-width: 0; + border-left-color: #5A5A5A; +} +.mblTooltipArrow-Above-styles () { + border-top-width: 0; + border-bottom-color: #5A5A5A; +} +.mblTooltipArrow-Below-styles () { + border-bottom-width: 0; + border-top-color: #5A5A5A; +} +.mblTooltipInnerArrow-Before-styles () { + border-left-width: 0; + border-right-color: #192235; +} +.mblTooltipInnerArrow-After-styles () { + border-right-width: 0; + border-left-color: #192235; +} +.mblTooltipInnerArrow-Above-styles () { + border-top-width: 0; + border-bottom-color: #656872; +} +.mblTooltipInnerArrow-Below-styles () { + border-bottom-width: 0; + border-top-color: #172035; +} +.mblTooltip-Heading-styles () { + border-top: 3px solid #4F5055; + border-bottom: 1px solid #2D3642; + border-left: 1px solid #2A2D47; + -webkit-border-radius: 3px 3px 0 0; + background-color: #889BB3; + background-image: -webkit-gradient(linear, left top, left bottom, from(#5E6167), to(#1A1D24), color-stop(0.5, #2E322B)); + font-weight: normal; +} +.mblTooltip-Heading-ToolbarButton-styles () { + border: 1px inset #434450; + background-image: -webkit-gradient(linear, left top, left bottom, from(#686F80), to(#000924), color-stop(0.5, #000B29)); + font-weight: normal; +} + diff --git a/js/dojo/dojox/mobile/transition.js b/js/dojo/dojox/mobile/transition.js new file mode 100644 index 0000000..c4f032a --- /dev/null +++ b/js/dojo/dojox/mobile/transition.js @@ -0,0 +1,20 @@ +//>>built +define("dojox/mobile/transition", [ + "dojo/_base/Deferred", + "dojo/_base/config" +], function(Deferred, config){ + /* summary: this is the wrapper module which load + * dojox/css3/transit conditionally. If mblCSS3Transition + * is set to 'dojox/css3/transit', it will be loaded as + * the module to conduct the view transition. + */ + if(config['mblCSS3Transition']){ + //require dojox/css3/transit and resolve it as the result of transitDeferred. + var transitDeferred = new Deferred(); + require([config['mblCSS3Transition']], function(transit){ + transitDeferred.resolve(transit); + }); + return transitDeferred; + } + return null; +}); diff --git a/js/dojo/dojox/mobile/uacss.js b/js/dojo/dojox/mobile/uacss.js new file mode 100644 index 0000000..525adc4 --- /dev/null +++ b/js/dojo/dojox/mobile/uacss.js @@ -0,0 +1,16 @@ +//>>built +define("dojox/mobile/uacss", [ + "dojo/_base/kernel", + "dojo/_base/lang", + "dojo/_base/window", + "dojox/mobile/sniff" +], function(dojo, lang, win, has){ + win.doc.documentElement.className += lang.trim([ + has("bb") ? "dj_bb" : "", + has("android") ? "dj_android" : "", + has("iphone") ? "dj_iphone" : "", + has("ipod") ? "dj_ipod" : "", + has("ipad") ? "dj_ipad" : "" + ].join(" ").replace(/ +/g," ")); + return dojo; +}); |
