/**
* infoWindow的template
* @author Liuyl
* @date 2015/11/9
*/
define([
"base/BaseControl", "base/AppEvent",
"dojo",
"dojo/_base/declare",
"dojo/_base/array",
"dojo/text!controls/searchbox/SearchBox.html",
"dojo/_base/lang",
"dojo/_base/connect",
"dojo/query",
"dojo/dom-construct",
"dojo/dom-style",
"dojo/dom-attr",
"dojo/dom-geometry",
"dojo/on",
"dojo/dom-class",
"dojo/domReady!"
], function(
BaseControl, AppEvent,
dojo,
declare,
arrayUtil,
template,
lang,
connect,
query,
domConstruct,
domStyle,
domAttr,
domGeometry,
on,
domClass
) {
var Widget = declare("SearchBox", [BaseControl], {
templateString: template,
baseClass: "searchbox",
constructor: function(options, srcRefNode) {
this.currentKeyword = null;
if (!this.suggestCount)
this.suggestCount = 10;
this.currentStart = 0;
this.currentCount = 0;
this.mouseOverSuggest = false;
},
getInputValue: function() {
return this.inputTextDom.value.trim();
},
startup: function() {
on(this.inputButton, "click", lang.hitch(this, function(evt) {
var value = this.getInputValue();
if (value) {
AppEvent.dispatchAppEvent(AppEvent.SEARCHBOX_QUERY, {
hockId: this.id,
type: "search",
args: {
keyword: value,
}
});
}
this.hideSuggest();
}));
on(this.inputClearDom, "click", lang.hitch(this, function(evt) {
this.clear();
AppEvent.dispatchAppEvent(AppEvent.SEARCHBOX_QUERY, {
hockId: this.id,
type: "clear"
});
}));
on(this.inputTextDom, "input", lang.hitch(this, function(evt) {
var value = this.getInputValue();
domStyle.set(this.inputClearDom, "display", "block");
if (!value) {
domStyle.set(this.inputClearDom, "display", "none");
this.hideSuggest();
} else if (this._checkChanged(value, 0)) {
this.querySuggest(value, 0);
}
this.currentKeyword = value;
AppEvent.dispatchAppEvent(AppEvent.SEARCHBOX_QUERY, {
hockId: this.id,
type: "input",
args: {
keyword: value,
}
});
}));
on(this.inputTextDom, "keypress", lang.hitch(this, function(evt) {
if (evt.keyCode == 13) {
var value = this.getInputValue();
if (value) {
AppEvent.dispatchAppEvent(AppEvent.SEARCHBOX_QUERY, {
hockId: this.id,
type: "search",
args: {
keyword: value,
}
});
}
this.hideSuggest();
}
}));
on(this.inputTextDom, "focus", lang.hitch(this, function(evt) {
//点击菜单项有可能导致触发该事件,未知原因,relatedTarget为空时为正常触发
if (evt.relatedTarget) {
return;
}
var value = this.getInputValue();
if (!value) {
this.hideSuggest();
} else if (this._checkChanged(value, 0)) {
this.querySuggest(value, 0);
} else if (this.currentCount) {
this.showSuggest();
}
this.currentKeyword = value;
}));
on(this.inputTextDom, "blur", lang.hitch(this, function(evt) {
if (!this.mouseOverSuggest)
this.hideSuggest();
}));
this.suggestDom = domConstruct.create("div", {
className: "searchbox-suggest-container",
"data-searchbox": this.id,
innerHTML: "
"
}, document.body);
this.suggestUlDom = query("ul", this.suggestDom)[0];
on(this.suggestDom, "mouseover", lang.hitch(this, function(evt) {
this.mouseOverSuggest = true;
}));
on(this.suggestDom, "mouseleave", lang.hitch(this, function(evt) {
this.mouseOverSuggest = false;
}));
AppEvent.addAppEventListener(AppEvent.QUERY_SUCCESS, lang.hitch(this, function(evt) {
if (evt.hockId == this.id) {
this.updateSuggest(evt);
}
}));
AppEvent.addAppEventListener(AppEvent.QUERY_ERROR, lang.hitch(this, function(evt) {
if (evt.hockId == this.id) {
this.updateSuggest(evt);
}
}));
AppEvent.addAppEventListener(AppEvent.CHANGE_SEARCHBOX_STATE, lang.hitch(this, this.onChangeStateHandler));
if (this.placeholder) {
domAttr.set(this.inputTextDom, "placeholder", this.placeholder);
}
if (this.disableButton) {
domStyle.set(this.inputButton, "display", "none");
}
this.inherited(arguments);
},
onChangeStateHandler: function(evt) {
if (evt.hockId == this.id) {
if (evt.type == "clear") {
this.clear();
} else if (evt.type == "update") {
if (evt.data && evt.data.hasOwnProperty("keyword")) {
domAttr.set(this.inputTextDom, "value", evt.data.keyword.trim());
if (evt.data.keyword.trim()) {
domStyle.set(this.inputClearDom, "display", "block");
}
}
}
}
},
postCreate: function() {
this.inherited(arguments);
},
_checkChanged: function(keyword, start) {
return !(this.currentKeyword == keyword && this.currentStart == start);
},
querySuggest: function(keyword, start) {
if (!this.disableSuggest) {
AppEvent.dispatchAppEvent(AppEvent.RUN_SMART_QUERY, {
hockId: this.id,
args: {
keyword: keyword,//encodeURIComponent(keyword),
start: start,
count: this.suggestCount
}
});
}
},
updateSuggest: function(evt) {
if (evt.error) {
console.log(evt.error);
}
if (evt.result) {
domConstruct.empty(this.suggestUlDom);
if (evt.result.data.count)
this.currentCount = parseInt(evt.result.data.count);
else {
this.currentCount = 0;
}
if (this.currentCount == 0) {
this.hideSuggest();
} else if (this.currentCount == 1) {
this._buildSuggestItem(evt.result.data.items[0]||evt.result.data.items);
this.showSuggest();
} else {
arrayUtil.forEach(evt.result.data.items, lang.hitch(this, function(item, index) {
this._buildSuggestItem(item);
}));
this.showSuggest();
}
return;
}
this.hideSuggest();
},
_buildSuggestItem: function(item) {
var li = domConstruct.create("li", {
innerHTML: "" + item.name + "" + item.adress + "",
className: "searchbox-suggest-item",
"data-poi-id": item.id,
"data-poi-type": item.poitype,
"data-pac": item.pac
}, this.suggestUlDom)
on(li, "click", lang.hitch(this, function(evt) {
var value = query("i", evt.currentTarget)[0].innerHTML;
domAttr.set(this.inputTextDom, "value", value);
var value = this.inputTextDom.value.trim();
// AppEvent.dispatchAppEvent(AppEvent.SEARCHBOX_QUERY, {
// hockId: this.id,
// type: "suggest",
// args: {
// keyword: value,
// poiId: domAttr.get(evt.currentTarget, "data-poi-id"),
// poiName: domAttr.get(evt.currentTarget, "data-poi-type"),
// pac: domAttr.get(evt.currentTarget, "data-pac")
// }
// });
AppEvent.dispatchAppEvent(AppEvent.SEARCHBOX_QUERY, {
hockId: this.id,
type: "search",
args: {
keyword: value,
poiType: null,
poiName: "全部"
}
});
this.hideSuggest();
}));
},
showSuggest: function() {
if (!this.disableSuggest && $(this.inputDom).is(":visible")) {
var pos = domGeometry.position(this.inputDom, true);
domStyle.set(this.suggestDom, "left", pos.x + "px");
domStyle.set(this.suggestDom, "top", pos.y + pos.h + "px");
domStyle.set(this.suggestDom, "width", (pos.w - 14) + "px");
domStyle.set(this.suggestDom, "display", "block");
}
},
hideSuggest: function() {
if (!this.disableSuggest) {
domStyle.set(this.suggestDom, "display", "none");
}
},
clear: function() {
this.currentKeyword = null;
this.currentStart = 0;
this.currentCount = 0;
this.mouseOverSuggest = false;
domConstruct.empty(this.suggestUlDom);
this.hideSuggest();
domAttr.set(this.inputTextDom, "value", "");
domStyle.set(this.inputClearDom, "display", "none");
},
show: function() {
domStyle.set(this.domNode, "display", "block");
},
hide: function() {
domStyle.set(this.domNode, "display", "none");
}
});
return Widget;
});