1 |
4307
|
leinfelder
|
/*
|
2 |
|
|
* $Id: FlickrRest2Wfs.js 3883 2008-02-27 15:42:01Z gjvoosten $
|
3 |
|
|
*/
|
4 |
|
|
|
5 |
|
|
// Ensure this object's dependancies are loaded.
|
6 |
|
|
mapbuilder.loadScript(baseDir+"/tool/ToolBase.js");
|
7 |
|
|
|
8 |
|
|
/**
|
9 |
|
|
* ad-hoc tool to load flickr rest feed with a single xsl transformation.
|
10 |
|
|
* this tool populates its model on init.
|
11 |
|
|
* @constructor
|
12 |
|
|
* @param toolNode config node for this tool
|
13 |
|
|
* @param model model that contains this tool
|
14 |
|
|
*/
|
15 |
|
|
function FlickrRest2Wfs(toolNode, model) {
|
16 |
|
|
ToolBase.apply(this, new Array(toolNode, model));
|
17 |
|
|
|
18 |
|
|
this.url = this.getProperty('mb:url');
|
19 |
|
|
this.stylesheet = this.getProperty('mb:stylesheet');
|
20 |
|
|
|
21 |
|
|
model.addListener('init', this.safeTransform, this);
|
22 |
|
|
}
|
23 |
|
|
|
24 |
|
|
/**
|
25 |
|
|
* XSL transformation, works also on IE with external documents and proxy.
|
26 |
|
|
* @param objRef reference to this tool
|
27 |
|
|
*/
|
28 |
|
|
FlickrRest2Wfs.prototype.safeTransform = function(objRef) {
|
29 |
|
|
var url = config.proxyUrl+"?url="+escape(objRef.url);
|
30 |
|
|
if (MB_IS_MOZ) {
|
31 |
|
|
var xmlHttp = new XMLHttpRequest();
|
32 |
|
|
xmlHttp.open("GET", url, false);
|
33 |
|
|
xmlHttp.send('');
|
34 |
|
|
var doc = xmlHttp.responseXML;
|
35 |
|
|
var stylesheet = new XslProcessor(objRef.stylesheet, objRef.model.namespace);
|
36 |
|
|
stylesheet.setParameter('proxyUrl', config.proxyUrl);
|
37 |
|
|
objRef.model.doc = stylesheet.transformNodeToObject(doc);
|
38 |
|
|
} else {
|
39 |
|
|
var progids = {domdoc: ['Msxml2.DOMDocument.3.0', 'Msxml2.DOMDocument.6.0'],
|
40 |
|
|
freethreaded: ['Msxml2.FreeThreadedDOMDocument.3.0', 'Msxml2.FreeThreadedDOMDocument.6.0'],
|
41 |
|
|
xsltpl: ['MSXML2.XSLTemplate.3.0', 'MSXML2.XSLTemplate.6.0'],
|
42 |
|
|
xmlhttp: ['Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP.6.0']};
|
43 |
|
|
var xml;
|
44 |
|
|
for (var i in progids.domdoc) {
|
45 |
|
|
try {
|
46 |
|
|
xml = new ActiveXObject(progids.domdoc[i]);
|
47 |
|
|
break;
|
48 |
|
|
} catch (e) {}
|
49 |
|
|
}
|
50 |
|
|
var xsl = new ActiveXObject(progids.freethreaded[i]);
|
51 |
|
|
var docCache = new ActiveXObject(progids.xsltpl[i]);
|
52 |
|
|
|
53 |
|
|
var xmlHttp = new ActiveXObject(progids.xmlhttp[i]);
|
54 |
|
|
xmlHttp.open('GET', objRef.stylesheet, false);
|
55 |
|
|
xmlHttp.send(null);
|
56 |
|
|
var xslText = xmlHttp.responseText;
|
57 |
|
|
|
58 |
|
|
// replace url-encoded "%"s in urls to %25, so they get
|
59 |
|
|
// double-escaped. Ugly hack, but IE needs that.
|
60 |
|
|
var regex = new RegExp("/\?url=(.[^']*)'/g");
|
61 |
|
|
var toReplace = xslText.match(/\?url=(.[^']*)'/g);
|
62 |
|
|
for (var i=0; i<toReplace.length; i++) {
|
63 |
|
|
xslText = xslText.replace(toReplace[i], toReplace[i].replace(/%/g,'%25'));
|
64 |
|
|
}
|
65 |
|
|
|
66 |
|
|
xml.validateOnParse = false;
|
67 |
|
|
xsl.validateOnParse = false;
|
68 |
|
|
xsl.resolveExternals = true;
|
69 |
|
|
xsl.setProperty("AllowDocumentFunction",true);
|
70 |
|
|
xsl.async = false;
|
71 |
|
|
xml.async = false;
|
72 |
|
|
xsl.loadXML(xslText);
|
73 |
|
|
xml.load(url);
|
74 |
|
|
docCache.stylesheet = xsl;
|
75 |
|
|
var docProcessor = docCache.createProcessor();
|
76 |
|
|
docProcessor.input = xml;
|
77 |
|
|
docProcessor.addParameter('proxyUrl', config.proxyUrl, '');
|
78 |
|
|
docProcessor.transform();
|
79 |
|
|
objRef.model.doc = (new DOMParser()).parseFromString(docProcessor.output, "text/xml");
|
80 |
|
|
}
|
81 |
|
|
objRef.model.callListeners('refresh');
|
82 |
|
|
}
|