/*
* server.js : public domain
*/
var debug = true;
function log(text){
if (debug) opera.postError(text);
}
function httpGet(url, onload, onerror) {
var xhr = new XMLHttpRequest;
xhr.open('GET', url, false);
if (onload) xhr.onload = function(){onload(xhr.responseText)}
if (onerror) xhr.onerror = function(){onerror()}
xhr.send(null);
}
/* server */
// dispatcher
var webserver = opera.io.webserver;
window.onload = function () {
if (webserver){
webserver.addEventListener('_index', index, false);
webserver.addEventListener('get', get,false);
getSiteinfo();
}
}
var Siteinfo = [];
var Microformats = [];
var cache = {};
// request handler (view)
function get(e) {
var req = e.connection.request;
var url = req.getItem('url');
if (!url) return not_found(e);
url = url[0];
if (!url) return not_found(e);
var info = search_siteinfo(url);
log(info.map(function(e){return [e.url.toString(), e.nextLink, e.pageElement].join(' , ')}).join('\n'));
info = info.concat(Microformats);
var res = e.connection.response;
res.setResponseHeader('Content-type', 'application/javascript; charset=utf-8');
res.write('window.AutoPagerizeCallbackSiteinfo(' + JSON.stringify(info) + ');');
res.close();
}
function not_found(e) {
var res = e.connection.response;
res.setStatus('404', 'Not Found');
res.close();
}
function index(e) {
var res = e.connection.response;
res.write('<!DOCTYPE html>'+
'<title>AutoPagerize SITEINFO Server</title>'+
'<p>Welcome to AutoPagerize SITEINFO Server</p>');
res.close();
}
// controller
function search_siteinfo(url) {
if (cache[url]) return cache[url];
var results = [];
var n = Siteinfo.length;
while(--n) {
var re = Siteinfo[n][0];
if (re.test(url)) results.push(Siteinfo[n][1]);
}
cache[url] = results;
return results;
}
function getSiteinfo() {
httpGet('http://ss-o.net/json/wedataAutoPagerizeSITEINFO.json',function(t){
if(t.length < 1000) return;
var _siteinfo = JSON.parse(t);
var n = _siteinfo.length;
while(--n) {
var info = _siteinfo[n];
var re = new RegExp(info.url);
if (re.test('http://a')) {
// isolate siteinfo that matches any url
Microformats.push(info);
} else {
Siteinfo.push([re, info]);
}
}
});
}