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; }