/*
* File : CSWClient.js
* Author : Rob van Swol
* Organisation: National Aerospace Laboratory NLR
* Country : The Netherlands
* email : vanswol@nlr.nl
* Description: Simple AJAX based CSW client
* Depends csw-proxy.php
* Tested on : FireFox 3, Safari, IE 7
* Last Change : 2008-10-22
*/
i3GEO = window.parent.i3GEO;
CSWClient = function(cswhost, host){
this.cswhost = null;
this.use_proxy = true;
if (typeof cswhost != "undefined") {
this.cswhost = cswhost;}
this.proxy = "csw-proxy.php";
if (typeof host != "undefined") {
this.proxy = host + "csw-proxy.php";}
this.getrecords_xsl = this.loadDocument("lib/xsl/getrecords.xsl");
this.getrecordbyid_xsl = this.loadDocument("lib/xsl/getrecordbyid.xsl");
this.defaults_xml = this.loadDocument("lib/xml/defaults.xml");
this.defaultschema = this.defaults_xml.selectSingleNode("/defaults/outputschema/text()").nodeValue;
}
CSWClient.prototype.abreINDE = function(id)
{
window.open("http://metadados.inde.gov.br/geonetwork/srv/por/main.home?uuid="+id,"new");
}
CSWClient.prototype.adicionaI3geo = function(wms)
{
i3GEO.mapa.dialogo.listaLayersWms(wms);
}
CSWClient.prototype.setCSWHost = function(host)
{
this.cswhost = host;
}
CSWClient.prototype.useProxy = function(tf)
{
this.use_proxy = tf;
}
CSWClient.prototype.writeClient = function(divId)
{
/*
var client_xml = this.loadDocument("lib/xml/cswclient.xml");
if (this.cswhost == null) {
var cswhosts_xml = this.loadDocument("lib/xml/csw-hosts.xml");
var span = client_xml.selectSingleNode("//span[@id='csw-hosts']");
importNode = client_xml.importNode(cswhosts_xml.documentElement, true);
span.appendChild(importNode);
}
var serializer = new XMLSerializer();
var output = serializer.serializeToString(client_xml);
//alert (output);
var div = document.getElementById(divId);
div.innerHTML = output;
*/
}
CSWClient.prototype.handleCSWResponse = function(request, xml)
{
var stylesheet = "lib/xsl/prettyxml.xsl";
if (request == "getrecords" &
document.theForm.displaymode.value != "xml") {
stylesheet = "lib/xsl/csw-results.xsl";
} else if (request == "getrecordbyid" &
document.theForm.displaymode.value != "xml") {
stylesheet = "lib/xsl/csw-metadata.xsl";
}
xslt = this.loadDocument(stylesheet);
var processor = new XSLTProcessor();
processor.importStylesheet(xslt);
var XmlDom = processor.transformToDocument(xml)
var serializer = new XMLSerializer();
var output = serializer.serializeToString(XmlDom.documentElement);
var outputDiv = document.getElementById("csw-output");
if (request == "getrecordbyid"){
//outputDiv = window.open().document.body;//document.getElementById("metadata");
//output = '
' + output;
//this.positionDiv(document.getElementById('popup'), document.getElementById('results'))
//this.positionPopUp(document.getElementById('popup'), document.getElementById('results'))
//this.positionPopUp(document.getElementById('popup'), document.getElementById('cswclient'))
//this.showDiv(document.getElementById('popup'));
i3GEO.janela.mensagemSimples(""+output+"
","",450);
return;
}
outputDiv.innerHTML = output;
}
CSWClient.prototype.getRecords = function(start)
{
if (typeof start == "undefined") {
start = 1;}
if (typeof document.theForm.cswhosts != "undefined") {
this.setCSWHost(document.theForm.cswhosts.value);}
var queryable = document.theForm.queryable.value;
/*because geonetwork doen not follow the specs*/
if(this.cswhost.indexOf('geonetwork') !=-1 & queryable == "anytext")
queryable = "any";
var operator = document.theForm.operator.value;
var query = trim(document.theForm.query.value);
var bbox = document.theForm.bbox.value;
if (bbox == ""){
var lowerCorner = "";
var upperCorner = ""
}
else{
bbox = bbox.split(" ");
var lowerCorner = bbox[1]+" "+bbox[0];
var upperCorner = bbox[3]+" "+bbox[2];
}
if (operator == "contains" & query != "") {query = "%" + query + "%";}
var schema = "http://www.opengis.net/cat/csw/2.0.2"; // force outputSchema always to csw:Record for GetRecords requests
this.setXpathValue(this.defaults_xml, "/defaults/outputschema", schema + '');
this.setXpathValue(this.defaults_xml, "/defaults/propertyname", queryable + '');
this.setXpathValue(this.defaults_xml, "/defaults/literal", query + '');
//this.setXpathValue(defaults_xml, "/this.defaults/literal", query + '');
this.setXpathValue(this.defaults_xml, "/defaults/startposition", start + '');
var sortby = document.theForm.sortby.value;
this.setXpathValue(this.defaults_xml, "/defaults/sortby", sortby + '');
if (bbox != ""){
this.setXpathValue(this.defaults_xml, "/defaults/lowerCorner", lowerCorner + '');
this.setXpathValue(this.defaults_xml, "/defaults/upperCorner", upperCorner + '');
}
var processor = new XSLTProcessor();
processor.importStylesheet(this.getrecords_xsl);
var request_xml = processor.transformToDocument(this.defaults_xml);
var request = new XMLSerializer().serializeToString(request_xml);
//alert(request);return;
csw_response = this.sendCSWRequest(request);
var results = "";
results_xml = (new DOMParser()).parseFromString(results, "text/xml");
importNode = results_xml.importNode(csw_response.documentElement, true);
results_xml.documentElement.appendChild(importNode);
//alert(new XMLSerializer().serializeToString(results_xml));
//return handleCSWResponse("getrecords", csw_response);
return this.handleCSWResponse("getrecords", results_xml);
}
CSWClient.prototype.getRecordById = function(id)
{
var schema = this.defaultschema;
if (document.theForm.schema != null) {
schema = document.theForm.schema.value;
}
this.setXpathValue(this.defaults_xml, "/defaults/outputschema", schema + '');
this.setXpathValue(this.defaults_xml, "/defaults/id", id + '');
var processor = new XSLTProcessor();
processor.importStylesheet(this.getrecordbyid_xsl);
var request_xml = processor.transformToDocument(this.defaults_xml);
var request = new XMLSerializer().serializeToString(request_xml);
csw_response = this.sendCSWRequest(request);
//alert(new XMLSerializer().serializeToString(csw_response));
return this.handleCSWResponse("getrecordbyid", csw_response);
}
CSWClient.prototype.sendCSWRequest = function(request)
{
var xml = Sarissa.getDomDocument();
xml.async = false;
var xmlhttp = new XMLHttpRequest();
var params;
if (this.use_proxy) {
params = "csw_host=" + this.cswhost + "&csw_request=" + encodeURIComponent(request);
xmlhttp.open("POST", this.proxy, false);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
} else {
params = request;
xmlhttp.open("POST", this.cswhost, false);
xmlhttp.setRequestHeader("Content-type", "application/xml");
}
//xmlhttp.open("POST", this.proxy, false);
//xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//xmlhttp.open("POST", this.cswhost, false);
//xmlhttp.setRequestHeader("Content-type", "application/xml");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.send(params); // POST
//xmlhttp.send(''); //GET
xml = xmlhttp.responseXML;
return xml;
}
CSWClient.prototype.loadDocument = function(uri)
{
var xml = Sarissa.getDomDocument();
var xmlhttp = new XMLHttpRequest();
xml.async = false;
xmlhttp.open("GET", uri, false);
xmlhttp.send('');
xml = xmlhttp.responseXML;
return xml;
}
CSWClient.prototype.setXpathValue = function(_a,_b,_c)
{
var _e=_a.selectSingleNode(_b);
if(_e){
if(_e.firstChild){
_e.firstChild.nodeValue=_c;
}else{
dom=Sarissa.getDomDocument();
v=dom.createTextNode(_c);
_e.appendChild(v);
}
return true;
}else{
return false;
}
};
CSWClient.prototype.clearResposta = function()
{
var outputDiv = document.getElementById("csw-output");
outputDiv.innerHTML = "Aguarde...";
this.hideDiv(document.getElementById('popup'))
}
CSWClient.prototype.clearPage = function()
{
document.theForm.query.value = "";
var outputDiv = document.getElementById("csw-output");
outputDiv.innerHTML = "";
this.hideDiv(document.getElementById('popup'))
}
CSWClient.prototype.overlayDiv = function(div)
{
div = document.getElementById("popup2");
while (div.tagName !="DIV") {
div = div.parentNode
}
_width = div.offsetWidth
_height = div.offsetHeight
_top = this.findPosY(div);
_left = this.findPosX(div);
//overlay = document.createElement("div")
//overlay.setAttribute("id", "overlay")
var overlay = document.getElementById('overlay');
overlay.style.width = _width + "px"
overlay.style.height = _height + "px"
overlay.style.position = "absolute"
overlay.style.background = "#555555"
overlay.style.top = _top + "px"
overlay.style.left = _left + "px"
overlay.style.filter = "alpha(opacity=70)"
overlay.style.opacity = "0.7"
overlay.style.mozOpacity = "0.7"
overlay.style.visibility="visible";
document.getElementsByTagName("body")[0].appendChild(overlay)
}
CSWClient.prototype.removeDiv = function(div)
{
document.getElementsByTagName("body")[0].removeChild(div)
}
CSWClient.prototype.hideDiv = function(div)
{
if(div){
document.getElementById('overlay').style.visibility="hidden";
div.style.visibility="hidden";
}
}
CSWClient.prototype.showDiv = function(div)
{
//this.overlayDiv(document.getElementById('results-container'));
this.overlayDiv(document.getElementById('cswclient'));
div.style.visibility="visible";
}
CSWClient.prototype.positionDiv = function(div1, div2)
{
var width = div2.offsetWidth-100
var height = div2.offsetHeight-100
var top = this.findPosY(div2)+50;
var left = this.findPosX(div2)+50;
div1.style.width = width + "px"
div1.style.position = "absolute"
div1.style.background = "#ffffff"
div1.style.top = top + "px"
div1.style.left = left + "px"
}
CSWClient.prototype.positionPopUp = function(div1, div2)
{
var top = this.findPosY(div2)+50+getScrollY();
div1.style.top = top + "px"
}
CSWClient.prototype.findPosX = function(obj)
{
return 0;
var curleft = 0;
if(obj.offsetParent)
while(1) {
curleft += obj.offsetLeft;
if(!obj.offsetParent)
break;
obj = obj.offsetParent;
}
else if(obj.x)
curleft += obj.x;
return curleft;
}
CSWClient.prototype.findPosY = function(obj)
{
return 0;
var curtop = 0;
if(obj.offsetParent)
while(1) {
curtop += obj.offsetTop;
if(!obj.offsetParent)
break;
obj = obj.offsetParent;
}
else if(obj.y)
curtop += obj.y;
return curtop;
}
function getScrollY()
{
var scrollY = 0;
if (typeof window.pageYOffset == "number") scrollY = window.pageYOffset;
else if (document.documentElement && document.documentElement.scrollTop)
scrollY = document.documentElement.scrollTop;
else if (document.body && document.body.scrollTop)
scrollY = document.body.scrollTop;
else if (window.scrollY) scrollY = window.scrollY;
return scrollY;
}
function trim(value) {
value = value.replace(/^\s+/,'');
value = value.replace(/\s+$/,'');
return value;
}