88 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| var deny = this.isNotPublic(user);
 | |
| if (deny) {
 | |
|    res.message = deny;
 | |
|    user.cache.referrer = this.href();
 | |
|    res.redirect(this.members.href("login"));
 | |
| }
 | |
| 
 | |
| res.skin = "weblog.page";
 | |
| 
 | |
| res.data.action = this.href(req.action);
 | |
| 
 | |
| res.title = "Search " + this.title;
 | |
| 
 | |
| res.body = this.renderSkinAsString("searchform");
 | |
| 
 | |
| if (req.data.q) {
 | |
|     var query = req.data.q;
 | |
| 
 | |
|     // reuse search result container if it already exists
 | |
|     var folder = user.cache["search-"+query];
 | |
|     if (!folder) {
 | |
|         folder = new weblog();
 | |
|         user.cache["search-"+query] = folder;
 | |
|     }
 | |
| 
 | |
|     // break up search string
 | |
|     var qarr = query.split(" ");
 | |
| 
 | |
|     // construct query
 | |
|     var where = "where WEBLOG_ID = "+this._id+" and ISONLINE > 0 and ";
 | |
|     for (var i in qarr) {
 | |
|         where += "(TITLE like '%"+qarr[i]+"%' or TEXT like '%"+qarr[i]+"%') "
 | |
|         if (i < qarr.length-1)
 | |
|             where += "and ";
 | |
|     }
 | |
|     where += "order by CREATETIME desc";
 | |
|     folder.allstories.subnodeRelation = where;
 | |
| 
 | |
|     var found = folder.allstories.size();
 | |
|     if (found == 0)
 | |
|         res.body += "<i>Nothing found for '"+query+"'.</i>";
 | |
|     else {
 | |
|         var start = 0;
 | |
|         var end = found;
 | |
| 
 | |
|         if (found == 1)
 | |
|             res.body += "<i>Found 1 item for '"+query+"'.</i>";
 | |
|         else if (found <= 10)
 | |
|             res.body += "<i>Found "+found+" items for '"+query+"'.<i>";
 | |
|         else {
 | |
|             if (req.data.start)
 | |
|                 start = Math.min (found-1, parseInt (req.data.start));
 | |
|             if (isNaN (start))
 | |
|                 start = 0;
 | |
|             end = Math.min (found, start+10);
 | |
|             res.body += "<i>Found "+found+" items for '"+query+"'. ";
 | |
|             res.body += "Displaying items "+(start+1)+" to "+end+".</i>";
 | |
|         }
 | |
| 
 | |
|         // note: I'm doing this without a "searchbody" skin, since
 | |
|         // I think there's not much need to customize the body of
 | |
|         // search results, esp. since its parts are fully customizable.
 | |
|         // of course, I may be wrong about that.
 | |
| 
 | |
|         // render prev links, if necessary
 | |
|         if (start > 0) {
 | |
|             var sp = new Object();
 | |
|             sp.url = this.href() + "search?q="+escape(query)+"&start="+Math.max(0,start-10);
 | |
|             sp.text = "previous results";
 | |
|             res.body += "<br><br>"+renderSkinAsString("prevpagelink",sp);
 | |
|         }
 | |
| 
 | |
|         // render result
 | |
|         res.body += '<table border="0">';
 | |
|         for (var i=start; i<end; i++)
 | |
|             res.body += folder.allstories.get (i).renderSkinAsString("searchview");
 | |
| 
 | |
|         res.body += '</table>';
 | |
| 
 | |
|         // render next links, if necessary
 | |
|         if (end < found) {
 | |
|             var sp = new Object();
 | |
|             sp.url = this.href() + "search?q="+escape(query)+"&start="+Math.min(found-1,start+10);
 | |
|             sp.text = "next results";
 | |
|             res.body += renderSkinAsString("nextpagelink",sp);
 | |
|         }
 | |
|     }
 | |
| }
 |