Project

General

Profile

1
/*
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
}
83

    
(2-2/13)