138 lines
3.6 KiB
JavaScript
138 lines
3.6 KiB
JavaScript
|
dojo.require("dojo.io.script")
|
||
|
dojo.require("dojox.rpc.Service");
|
||
|
|
||
|
// model that works with Yahoo Search API
|
||
|
dojo.declare("dojox.grid.data.yahooSearch", dojox.grid.data.Dynamic, {
|
||
|
constructor: function(inFields, inData, inSearchNode){
|
||
|
this.rowsPerPage = 20;
|
||
|
this.searchNode = inSearchNode;
|
||
|
this.fieldNames = dojo.map(inFields, "return item.name;");
|
||
|
this.yahoo = new dojox.rpc.Service(
|
||
|
dojo.moduleUrl("dojox.rpc.SMDLibrary", "yahoo.smd")
|
||
|
);
|
||
|
},
|
||
|
// server send / receive
|
||
|
send: function(inAsync, inParams, inOnReceive, inOnError){
|
||
|
var d = this.yahoo.imageSearch(
|
||
|
dojo.mixin({
|
||
|
results: this.rowsPerPage,
|
||
|
query: this.getQuery()
|
||
|
}, inParams)
|
||
|
);
|
||
|
d.addCallbacks(
|
||
|
dojo.hitch(this, "receive", inOnReceive, inOnError),
|
||
|
dojo.hitch(this, "error", inOnError)
|
||
|
);
|
||
|
this.onSend(inParams);
|
||
|
return d;
|
||
|
},
|
||
|
receive: function(inOnReceive, inOnError, inData){
|
||
|
try{
|
||
|
inData = inData.ResultSet;
|
||
|
inOnReceive(inData);
|
||
|
this.onReceive(inData);
|
||
|
}catch(e){
|
||
|
if(inOnError){
|
||
|
inOnError(inData);
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
error: function(inOnError, inErr) {
|
||
|
var m = 'io error: ' + inErr.message;
|
||
|
alert(m);
|
||
|
if (inOnError)
|
||
|
inOnError(m);
|
||
|
},
|
||
|
encodeParam: function(inName, inValue) {
|
||
|
return dojo.string.substitute('&${0}=${1}', [inName, inValue]);
|
||
|
},
|
||
|
getQuery: function(){
|
||
|
return dojo.byId(this.searchNode).value.replace(/ /g, '+');
|
||
|
},
|
||
|
fetchRowCount: function(inCallback){
|
||
|
this.send(true, inCallback);
|
||
|
},
|
||
|
// request data
|
||
|
requestRows: function(inRowIndex, inCount){
|
||
|
inRowIndex = (inRowIndex == undefined ? 0 : inRowIndex);
|
||
|
var params = {
|
||
|
start: inRowIndex + 1
|
||
|
}
|
||
|
this.send(true, params, dojo.hitch(this, this.processRows));
|
||
|
},
|
||
|
// server callbacks
|
||
|
processRows: function(inData){
|
||
|
for(var i=0, l=inData.totalResultsReturned, s=inData.firstResultPosition; i<l; i++){
|
||
|
this.setRow(inData.Result[i], s - 1 + i);
|
||
|
}
|
||
|
// yahoo says 1000 is max results to return
|
||
|
var c = Math.min(1000, inData.totalResultsAvailable);
|
||
|
if(this.count != c){
|
||
|
this.setRowCount(c);
|
||
|
this.allChange();
|
||
|
this.onInitializeData(inData);
|
||
|
}
|
||
|
},
|
||
|
getDatum: function(inRowIndex, inColIndex){
|
||
|
var row = this.getRow(inRowIndex);
|
||
|
var field = this.fields.get(inColIndex);
|
||
|
return (inColIndex == undefined ? row : (row ? row[field.name] : field.na));
|
||
|
},
|
||
|
// events
|
||
|
onInitializeData: function(){ },
|
||
|
onSend: function(){ },
|
||
|
onReceive: function(){ }
|
||
|
});
|
||
|
|
||
|
// report
|
||
|
modelChange = function(){
|
||
|
var n = dojo.byId('rowCount');
|
||
|
if(n){
|
||
|
n.innerHTML = dojo.string.substitute('about ${0} row(s)', [model.count]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// some data formatters
|
||
|
getCellData = function(inCell, inRowIndex, inField){
|
||
|
var m = inCell.grid.model;
|
||
|
return m.getDatum(inRowIndex, inField);
|
||
|
}
|
||
|
|
||
|
formatLink = function(inData, inRowIndex){
|
||
|
if(!inData){ return ' '; }
|
||
|
var text = getCellData(this, inRowIndex, this.extraField);
|
||
|
return dojo.string.substitute(
|
||
|
'<a target="_blank" href="${href}">${text}</a>',
|
||
|
{ href: inData, text: text }
|
||
|
);
|
||
|
};
|
||
|
|
||
|
formatImage = function(inData, inRowIndex){
|
||
|
if(!inData){ return ' '; }
|
||
|
var info = getCellData(this, inRowIndex, this.extraField);
|
||
|
var o = {
|
||
|
href: inData,
|
||
|
src: info.Url,
|
||
|
width: info.Width,
|
||
|
height: info.Height
|
||
|
}
|
||
|
return dojo.string.substitute(
|
||
|
'<a href="${href}" target="_blank"><img border=0 src="${src}" width="${width}" height="${height}"></a>', o);
|
||
|
};
|
||
|
|
||
|
formatDate = function(inDatum, inRowIndex){
|
||
|
if(!inDatum){ return ' '; }
|
||
|
var d = new Date(inDatum * 1000);
|
||
|
return dojo.string.substitute(
|
||
|
"${0}/${1}/${2}",
|
||
|
[ d.getMonth()+1, d.getDate(), d.getFullYear() ]
|
||
|
);
|
||
|
};
|
||
|
|
||
|
formatDimensions = function(inData, inRowIndex){
|
||
|
if(!inData){ return ' '; }
|
||
|
var w = inData, h = getCellData(this, inRowIndex, this.extraField);
|
||
|
return w + ' x ' + h;
|
||
|
}
|