function TGeoXml(url, app, options)
{
  // store the parameters
  this.options = options;
  this.url = url;
  this.app = app;

  if (typeof url == "string") {
  	this.urls = [url];
  } else {
  	this.urls = url;
  }

  this.options = options || {};
  this.progress = 0;

}

TGeoXml.prototype.parse = function(layerId, variantId, callBack)
{
  var that = this;
  this.progress = this.urls.length;
  for (i = 0; i < this.urls.length; i++) {
  	GDownloadUrl(this.urls[i], function(document) {
  	  that.processing(document);
  	  callBack();
  	});
  }
}

TGeoXml.prototype.processing = function(document)
{
  var that = this;
  if (document == undefined) {
    return false;
  }
  var xmlDoc = GXml.parse(document);
  var items = xmlDoc.documentElement.getElementsByTagName("item");
  if (items.length > 0) {
  	this.processItems(items);
  }
}

TGeoXml.prototype.processItems = function(items)
{
  var marker;
  var markers = [];
  for (i = 0; i < items.length; i++) {
  	marker = this.processItem(items[i]);
  	markers.push(marker);
  }
  this.app.markerManager.addMarkers(markers, 0);
}

TGeoXml.prototype.processItem = function(item)
{
  if (item.hasChildNodes()) {
  	var title = item.getElementsByTagName("title")[0].firstChild.data;
	  var url = item.getElementsByTagName("link")[0].firstChild.data;
    var description;
    
    if (item.getElementsByTagName("description")[0].firstChild) {
      description = item.getElementsByTagName("description")[0].firstChild.data;
    }
	  var latitude  = this.getElementsByTagNameNSCrossBrowser(item, "http://www.w3.org/2003/01/geo/wgs84_pos#", "geo", "lat")[0].firstChild.data;
	  var longitude = this.getElementsByTagNameNSCrossBrowser(item, "http://www.w3.org/2003/01/geo/wgs84_pos#", "geo", "long")[0].firstChild.data;
	  var layerId   = this.getElementsByTagNameNSCrossBrowser(item, "http://www.tiscover.com/syndication/module/entry/1.0", "tisentry", "layerId")[0].firstChild.data;
	  var iconId    = this.getElementsByTagNameNSCrossBrowser(item, "http://www.tiscover.com/syndication/module/entry/1.0", "tisentry", "iconId")[0].firstChild.data;
	  var nrOfAcc;
	  if (this.getElementsByTagNameNSCrossBrowser(item, "http://www.tiscover.com/syndication/module/entry/1.0", "tisentry", "totalNrOfAccommodations")[0]) {   
      nrOfAcc = this.getElementsByTagNameNSCrossBrowser(item, "http://www.tiscover.com/syndication/module/entry/1.0", "tisentry", "totalNrOfAccommodations")[0].firstChild.data;
    }
	  var marker;
	  if (description) {
	    marker = this.app.createMarker(latitude, longitude, title, iconId, description, nrOfAcc);
	  } else {
	    marker = this.app.createMarkerCallback(latitude, longitude, title, iconId, url);
	  }
	  this.app.addPointToBounds(latitude, longitude);
	  marker.layerId = layerId;
	  marker.sublayers = [];
	  marker.variants = [];
	  
	  var sublayers;
	  var sublayerId;
	  sublayers = this.getElementsByTagNameNSCrossBrowser(item, "http://www.tiscover.com/syndication/module/entry/1.0", "tisentry", "sublayer");
	  for (var i = 0; i < sublayers.length; i++) {
	    sublayerId = sublayers[i].firstChild.data;
	    marker.sublayers.push(sublayerId);
	  }
	  
	  var variants;
	  var variantId;
	  variants = this.getElementsByTagNameNSCrossBrowser(item, "http://www.tiscover.com/syndication/module/entry/1.0", "tisentry", "variant");
	  for (var i = 0; i < variants.length; i++) {
	    variantId = variants[i].firstChild.data;
	    marker.variants.push(variantId);
	  }
	  return marker;
  }
  return null;
}

TGeoXml.prototype.getElementsByTagNameNSCrossBrowser = function(domElem, strNsURI, strNsId, lName) 
{
  if (domElem.getElementsByTagNameNS) {
    return domElem.getElementsByTagNameNS(strNsURI, lName);
  } else {
    // for IE ns is stored in tagUrn property
    // ugh!! ugly hack for IE which does not understand default namespace
    if (strNsURI == "http://www.w3.org/1999/xhtml") {
      strNsURI = "";
    }

    var arrElems = domElem.getElementsByTagName(strNsId + ":" + lName);
    var allElems = new Array();
    //for (var i = 0, len = arrElems.length; i < len; i++) {
    //  var elem = arrElems[i];
    //  if (elem.tagUrn == strNsURI) {
    //    allElems.push(elem);
    //  }
    // }
    return arrElems;
  }
}
