
/*
Obiekt MapType przyjmuje następujące argumenty:
  map - obiekt Mapy Google na którym dodaje nową mapę / warstwę
  address - adres serwisu WMS, cache, albo fragment adresu serwisu kafelkowego Google
  name - nazwa serwisu albo nazwa serwisu w cache
  layers - lista warstw oddzielona przecinkami
  label - etykieta na kontrolce map albo id Diva z legendą
  mapTypeName - id mapy, która jest dodawana
  minScale - minimalna obsługiwana wartość zoom Google
  maxScale - maksymalna obsługiwana wartość zoom Google
  type - rodzaj źródła danych: 'cache', 'google', 'live'
  overlay - czy dana mapa jest nakładką na inne mapy
  format - typ MIME obrazów mapy (domyślnie image/jpeg)
  outputTileSize - wielkość kafelka mapy (domyślnie 256)
  inputTileSize - wielkość kafelka mapy pobierana z serwera (domyślnie 512)
  transparent - czy mapa obsługuje przezroczystość (domyślnie false)
  legendID - id elementu HTML gdzie trzeba umieścić legendę i sterowanie danym seriwsem
*/

function MapType(map, address, name, layers, label, mapTypeName, minScale, maxScale,
                 type, overlay, format, outputTileSize, inputTileSize, transparent, legendID, layersLegend, opacityInput) {
    if (typeof format == 'undefined' ) format = 'image/jpeg';
    if (typeof outputTileSize == 'undefined' ) outputTileSize = 256;
    if (typeof inputTileSize == 'undefined' ) inputTileSize = 512;
    if (typeof transparent == 'undefined' ) transparent = false;
    if (typeof opacityInput == 'undefined') opacityInput = {value: 1.0};
    this.layers = layers.join(",");
    var newMapTypeOptions;
    if (type == 'cache') {
    newMapTypeOptions = {
    getTileUrl: 
	createGetTileFromCache(name,this,address),
	tileSize: new google.maps.Size(outputTileSize, outputTileSize),
	isPng: (format == 'image/png'),
	maxZoom: maxScale,
	minZoom: minScale,
	name: label,
	opacity: opacityInput.value / 1,
	noChange: false
    };
    } else if (type == 'google') {
    newMapTypeOptions = {
    getTileUrl: 
	createGetTileFromGoogle(name,this,address),
	tileSize: new google.maps.Size(outputTileSize, outputTileSize),
	isPng: (format == 'image/png'),
	maxZoom: maxScale,
	minZoom: minScale,
	name: label,
	noChange: true
    };
    } else if (type == 'live') {
    newMapTypeOptions = {
    getTileUrl: 
	createGetTile(map, address, this,  format, outputTileSize, inputTileSize, transparent),
	tileSize: new google.maps.Size(outputTileSize, outputTileSize),
	isPng: (format == 'image/png'),
	maxZoom: maxScale,
	minZoom: minScale,
	name: label,
	opacity: opacityInput.value / 1,
	noChange: false
    };
    }
    var newMapType = new google.maps.ImageMapType(newMapTypeOptions);
    newMapType.setOptions(newMapTypeOptions);
    if (overlay == true) {
	var div = document.createElement('div');
	div.setAttribute('id',label);
	div.style.height = 'auto';
	div.style.overflow = 'hidden';
	div.innerHTML += '<h4><input type="checkbox" name="'+name+'" checked="checked" onclick="switchAll(this);" />'
	    + '<input type="image" name="'+name+'" src="scripts/images/minus_button.png" onclick="contractExpand(this);" />&nbsp;'
	    + label + '</h4>'
	if (type != 'google')
	    div.innerHTML += '<a href="wms?service='+name+'&action=GetCapabilities"><img src="img/xml_info.png" alt=""></a><br />';
	for (var i = 0; i < layers.length; i++) {
	    var input = document.createElement('input');
	    input.setAttribute('type','checkbox');
	    input.setAttribute('name',layers[i]);
	    input.setAttribute('checked','checked');
	    var overlayObj = this;
	    var serviceNo = map.overlayMapTypes.length;
	    div.onclick = function() {
		var inputsArray = div.getElementsByTagName('input');
		var layersArray = [];
		for (var j = 0; j < inputsArray.length; j++) {
		    if (inputsArray[j].type=='checkbox' && inputsArray[j].checked == true && inputsArray[j].getAttribute('name') != name)
			layersArray.push(inputsArray[j].getAttribute('name'));
		}
		if (overlayObj.layers != layersArray.join(",")) {
    		    var opt = newMapType.getOptions();
            	    if (opt.noChange == false) {
                        opt.opacity = opacityInput.value / 1;
                        newMapType = new google.maps.ImageMapType(opt);
                        newMapType.setOptions(opt);
                    }
		    map.overlayMapTypes.setAt(serviceNo,newMapType);
		    overlayObj.layers = layersArray.join(",");
		    if (overlayObj.layers == "") {
			map.overlayMapTypes.setAt(serviceNo, null);
		    }
		}
	    };
	    
	    div.appendChild(input);
	    if (type != 'google')
		div.innerHTML += '<img src="wms?service='+name+'&action=legend&layer='+layers[i]+'" alt="'+ layersLegend[i]+'" /> ';
	    div.innerHTML += layersLegend[i] + '<br />';
	}
	document.getElementById(legendID).appendChild(div);
	map.overlayMapTypes.push(newMapType);
    } else {
	map.mapTypes.set(mapTypeName, newMapType);
    }
}

/*Nadpisana metoda toString zeby mozna bylo bez zmian korzystac z mapUtils.js*/
MapType.prototype.toString = function() {
    return this.layers;
}

google.maps.ImageMapType.prototype.setOptions = function(opt) {
    this.options = opt;
}

google.maps.ImageMapType.prototype.getOptions = function() {
    return this.options;
}

function switchAll(obj) {
    var inputsArray = obj.parentNode.parentNode.getElementsByTagName('input');
    for (var i = 0; i < inputsArray.length; i++) {
	if (inputsArray[i].type == 'checkbox')
	    inputsArray[i].checked = obj.checked;
    }
}

function contractExpand(obj) {
    var div = obj.parentNode.parentNode;
    if (div.style.height == 'auto') {
	obj.setAttribute('src','scripts/images/plus_button.png');
	div.style.height = (obj.parentNode.offsetHeight + 15) + 'px';    
    } else {
	obj.setAttribute('src','scripts/images/minus_button.png');
	div.style.height = 'auto';
    }
    
}

function addKMLLayer(map, address, label, name, layers, layersLabels, legendID){
	var div = document.createElement('div');
	div.setAttribute('id',label);
	div.style.height = 'auto';
	div.style.overflow = 'hidden';
	div.innerHTML += '<h4><input type="checkbox" name="'+name+'" checked="checked" />'
	    + '<input type="image" name="'+name+'" src="scripts/images/minus_button.png" onclick="contractExpand(this);" />&nbsp;'
	    + label + '</h4>';
	for (var i = 0; i < layers.length; i++) {
	    var span = document.createElement('span');
	    span.innerHTML = layersLabels[i];
	    div.appendChild(span);
	    div.innerHTML += '<br />';
	}    
    document.getElementById(legendID).appendChild(div);
//    var kmlOptions = 
    var kml = new google.maps.KmlLayer(address, {preserveViewport: true});
    div.onclick = function() {
	if (document.getElementsByName(name)[0].checked == true && kml.getMap() == null) {
	    kml.setMap(map);
	} else if (document.getElementsByName(name)[0].checked == false && kml.getMap() != null) {
	    kml.setMap(null);
	}
    };
    kml.setMap(map);
                             

}
