summaryrefslogtreecommitdiff
path: root/js/dojo/dojox/mobile/IconItem.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo/dojox/mobile/IconItem.js')
-rw-r--r--js/dojo/dojox/mobile/IconItem.js332
1 files changed, 332 insertions, 0 deletions
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;
+ }
+ });
+});