/*
	Класс, который разбирает XML с объектами/объявлениями и выводит их на экран
*/
function ObjectManager(map){
	// конструктор
	//инициализация
	this.map = map;
	this.pathWeb = 'http://nash.rusavtobus.ru';
	this.siteTheme = 'default';
	this.proj = new GMercatorProjection(20);
	this.currentMarker = null;
	this.points = new Array();
	this.visibility_ = true;
};

ObjectManager.prototype.initialize = function() {
	// хз надо ли это?
};

ObjectManager.prototype.toggleMarkers = function(){
	// показываем/скрываем маркеры на карте (НЕ УДАЛЯЕМ!!!)
	for (point in this.points){
		if(this.points[point].isHidden()){
			this.points[point].show();
		}
		else{
			this.points[point].hide();
		}
	}
	if(this.currentMarker){
		if(this.currentMarker.isHidden()){
			this.currentMarker.show();
		}
		else{
			this.currentMarker.hide();
		}
	}
	this.visibility_ = !this.visibility_;
};

ObjectManager.prototype.clearPoints = function(){
	// очищение массива точек
	for (point in this.points){
		this.map.removeOverlay(this.points[point]);
		delete this.points[point];
	}
	this.points = [];
	this.closeCurrentMarker();
};

ObjectManager.prototype.closeCurrentMarker = function(){
	// удаление увеличенного блока-маркера при нажатии на кнопку "закрыть"
	if(this.currentMarker){
		this.map.removeOverlay(this.currentMarker);
		this.currentMarker = null;
	}
};

ObjectManager.prototype.showMarkers = function(xml){
	// разбор XML с объектами и объявлениями, и вывод ее на карту
	if(xml && xml[0]){
		// сначала парсим объекты
		var os = xml[0].firstChild;
		var o = os.getElementsByTagName("i");
		for(var i=0;i<o.length;i++){
			// парсим каждый XML-элемент с объектом
			var pointdesc = new Array();
			pointdesc['id'] = o[i].getAttribute('id');
			pointdesc['lat'] = parseFloat(o[i].getAttribute('lat'));
			pointdesc['lng'] = parseFloat(o[i].getAttribute('lng'));
			pointdesc['min'] = this.getElemText(o[i].childNodes[0]); //мини-HTML
			pointdesc['max'] = this.getElemText(o[i].childNodes[1]); //макси-HTML
			
			//добавляем каждый объект на карту
			this.points["_"+pointdesc['id']] = this.createMarker(pointdesc);
			this.map.addOverlay(this.points["_"+pointdesc['id']]);
		}
		
		// потом парсим объявления
		var as = xml[0].lastChild;
		var o = as.getElementsByTagName("i");
		for(var i=0;i<o.length;i++){
			// парсим каждый XML-элемент с объявлением
			var pointdesc = new Array();
			pointdesc['id'] = o[i].getAttribute('id');
			pointdesc['lat'] = parseFloat(o[i].getAttribute('lat'));
			pointdesc['lng'] = parseFloat(o[i].getAttribute('lng'));
			pointdesc['min'] = this.getElemText(o[i].childNodes[0]); //мини-HTML
			pointdesc['max'] = this.getElemText(o[i].childNodes[1]); //макси-HTML
						
			//добавляем каждый объект на карту
			this.points["__"+pointdesc['id']] = this.createMarker(pointdesc);
			this.map.addOverlay(this.points["__"+pointdesc['id']]);
		}
		
		if(this.currentMarker){
			this.map.removeOverlay(this.currentMarker);
			this.map.addOverlay(this.currentMarker);
		}
	}
};

ObjectManager.prototype.createMarker = function(pointdesc) {
	// создаем пустышку-иконку
	var icon = new GIcon();
	var iconurl = this.pathWeb+'/themes/'+this.siteTheme+'/images/transparent.gif';
	icon.image = iconurl;
	icon.iconSize = new GSize(19, 10);
	icon.iconAnchor = new GPoint(16, 16);
	icon.infoWindowAnchor = new GPoint(0, 7);
	
	// заполняем опции
	opts = {
		"id":pointdesc['id'],
		"icon": icon,
		"clickable": true,
		"labelText": pointdesc['min'],
		"labelOffset": new GSize(-23, 15),
		"visibility_": this.visibility_
	};
	var latlng = new GLatLng(pointdesc['lat'], pointdesc['lng']);
	// создаем маркер на карте
	var marker = new LabeledMarker(latlng, opts);
	// назначаем ему обработчик клика
	var handler = this.markerClickHandler(marker,pointdesc,this);
	GEvent.addListener(marker, "click", handler);
	return marker;
};

ObjectManager.prototype.markerClickHandler = function(marker,pointdesc,owner){
	return function() {
		if(owner.currentMarker){
			owner.map.removeOverlay(owner.currentMarker);
		}
		
		opts = {
                "icon": marker.getIcon(),
                "clickable": true,
				"labelClass":"markerLabel bigMarkerLabel",
                "labelText": pointdesc['max'],
                "labelOffset": new GSize(-23, 15),
				"visibility_": owner.visibility_,
				"onTop":true
        };
		owner.currentMarker = new LabeledMarker(marker.getLatLng(), opts);
		owner.map.addOverlay(owner.currentMarker);
		var newcenter = owner.proj.fromLatLngToPixel(owner.currentMarker.getLatLng(),owner.map.getZoom());
		newcenter.x += 100;
		newcenter.y -= 100;
		newcenter = owner.proj.fromPixelToLatLng(newcenter,owner.map.getZoom());
		owner.map.panTo(newcenter);
		return false;
	};
};

// кроссбраузерная функция для извлечения содержимого из XML-элемента
ObjectManager.prototype.getElemText = function(node){
    return node.text || node.textContent || (function(node){
        var _result = "";
        if (node == null) {
            return _result;
        }
        var childrens = node.childNodes;
        var i = 0;
        while (i < childrens.length) {
            var child = childrens.item(i);
            switch (child.nodeType) {
                case 1: // ELEMENT_NODE
                case 5: // ENTITY_REFERENCE_NODE
                    _result += arguments.callee(child);
                    break;
                case 3: // TEXT_NODE
                case 2: // ATTRIBUTE_NODE
                case 4: // CDATA_SECTION_NODE
                    _result += child.nodeValue;
                    break;
                case 6: // ENTITY_NODE
                case 7: // PROCESSING_INSTRUCTION_NODE
                case 8: // COMMENT_NODE
                case 9: // DOCUMENT_NODE
                case 10: // DOCUMENT_TYPE_NODE
                case 11: // DOCUMENT_FRAGMENT_NODE
                case 12: // NOTATION_NODE
                // skip
                break;
            }
            i++;
        }
        return _result;
    }(node));
};