/*
function qmCacheElement() {
    this.shortData = array();
    this.fullData = array();
    this.added = 0;
    this.geetted = 0;
}

function qmCache() {
    this.data = new Array();
}

qmCache.prototype.exists = function(who) {
    for(i=0,j=this.data.length; i<j; i++) {
        if(this.data[i].first.id == who) {
            return i;
        }
    }
    return -1;
}

qmCache.prototype.add = function(data) {
    timeNow = new Date();
    var el = new qmCacheElement();
    el.shortData = data;
    el.added = timeNow.getTime();
    alert(el);
}
*/
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Класс работы с картой
////////////////////////////////////////////////////////////////////////////////
function qmMap(holder, where) {
    // Контейнер карты
    this.holder = holder;
    // Объект geocoder
    this.geocoder = new GClientGeocoder();
    this.map = false;
    
    this.what = where;
    // Адрес по умолчанию - Мск, Кремль
    this.address = 'Praha, Czech Republic';
    this.scale = 12;

    this.objectsPerRequest = 12;
    
    this.dataLoaded = false;
    this.mapLocked = false;
    this.oneInstance = true;
    this.transferStarted = false;
//    this.cache = new qmCache();
    
    this.pagingPages = 0;
    this.points = new Array();
    this.fulldata = new Array();

    this.firstShow = true;
}
////////////////////////////////////////////////////////////////////////////////
// Берем иконки
////////////////////////////////////////////////////////////////////////////////
qmMap.prototype.getIcons = function() {
/*
    var jSonRequest = new Json.Remote("/ajax.php?icons",{method: 'GET', encoding: 'UTF-8', onComplete: function(icons){
        if(!icons || !icons.length) {
            return false;
        }
        for(i=0,j=icons.length; i<j; i++) {
            var icon = icons[i].text;
            qmPage.icons[icon.id] = new GIcon();
            qmPage.icons[icon.id].imgSrc = qmPage.front.preload(icon.img);
            qmPage.icons[icon.id].shaSrc = qmPage.front.preload(icon.sha);
            qmPage.icons[icon.id].image = icon.img;
            qmPage.icons[icon.id].shadow = icon.sha;
            qmPage.icons[icon.id].iconSize = new GSize(icon.ico_w, icon.ico_h);
            qmPage.icons[icon.id].shadowSize = new GSize(icon.sha_w, icon.sha_h);
            qmPage.icons[icon.id].iconAnchor = new GPoint(6, 20);
            qmPage.icons[icon.id].infoWindowAnchor = new GPoint(5, 1);
        }
     }}).send();
*/
    qmPage.icons[0] = new GIcon();
    qmPage.icons[0].imgSrc = 'http://gorod.cz/images/map_icon.png';
    qmPage.icons[0].shaSrc = 'http://gorod.cz/images/map_icon_shadow.png';
/*
    qmPage.icons[0].image = icon.img;
    qmPage.icons[0].shadow = icon.sha;
*/
    qmPage.icons[0].iconSize = new GSize(28, 24);
    qmPage.icons[0].shadowSize = new GSize(25, 12);
    qmPage.icons[0].iconAnchor = new GPoint(6, 20);
    qmPage.icons[0].infoWindowAnchor = new GPoint(5, 1);
}
////////////////////////////////////////////////////////////////////////////////
// Отображаем адрес
////////////////////////////////////////////////////////////////////////////////
qmMap.prototype.showAddress = function(address, scale) {
  address = (typeof address == 'undefined' ? this.address : address);
  this.geocoder.getLatLng(
    address,
    function(point, scale) {
      if (!point) {
          return false;
      }
      scale = (typeof scale == 'undefined' ? qmMap.scale   : scale);
      if(scale<1 || scale>19) {
          scale = this.scale;
      }
      if(scale<1 || scale>19) {
          scale = 12;
      }
      qmMap.map.setCenter(point, scale);
    }
  );
}

////////////////////////////////////////////////////////////////////////////////
// Конструктор
////////////////////////////////////////////////////////////////////////////////
qmMap.prototype.construct = function() {
    this.map = new GMap2(this.holder);
    // Включаем элементы управления карты
    this.map.addControl(new GSmallMapControl());
    this.map.addControl(new GMapTypeControl());
    // Включаем зум колесом
    this.map.enableScrollWheelZoom();
    if(!this.address && this.what!='customer') {
      return false; 
    }
    this.dataLoaded = true;
    var x = qmPage.getAncor('x');
    var y = qmPage.getAncor('y');
    var z = qmPage.getAncor('z');
    if(this.what=='customer') {
        this.getPoints();
    }
    if(x && y && z) {
        var point = new GLatLng(y, x);
        this.map.setCenter(point, z-0);
        this.getPoints(qmPage.getAncor('p'));
    }
    else {
        var point = this.showAddress();
    }
    GEvent.addListener(this.map, "moveend", function() {
        qmMap.getPoints(qmPage.getAncor('page'))
//        qmMap.map.savePosition();
        qmPage.setAncor('x', qmMap.map.getCenter().lng())
        qmPage.setAncor('y', qmMap.map.getCenter().lat())
        qmPage.setAncor('z', qmMap.map.getZoom())       
    });
    GEvent.addListener(this.map, "infowindowopen", function() {
        qmPage.mapLocked = false;
    });
}

////////////////////////////////////////////////////////////////////////////////
// Получение данных
////////////////////////////////////////////////////////////////////////////////
qmMap.prototype.getPoints = function(page) {
    if(typeof page == 'undefined' || !page) {
        page = 1;
    }
    if(this.dataLoaded && !this.mapLocked && !(this.oneInstance && this.transferStarted)) {
        this.transferStarted = true;
        point = this.map.getBounds();
        
        if(typeof p1 == 'undefined') {
            p1 = point.getSouthWest();
        }
        if(typeof p2 == 'undefined') {
            p2 = point.getNorthEast();
        }
        nocache = new Date();
        nocache = nocache.getTime();
        what = '';
        if(this.what == 'apartmans') {
            what += '&part=rent&what=apartmans';
        }
        else if(this.what == 'customer') {
            what += '&what=customer&request_id='+this.request_id;
        }
        else {
            what += '&part=' + (document.location.pathname.indexOf('rent') > -1 ? 'rent' : 'sell');
			// Обычный поиск
			if(document.getElementById('searchAdvancedForm')) {
     		document.getElementById('searchAdvancedForm').style.display == 'none'
            if((document.location.search.indexOf('&what=') > -1) || (document.location.search.indexOf('?what=') > -1)) {
                var re = new RegExp('what=([a-zA-Z0-9\-_\.]+)');
                var found = document.location.search.match(re);
                if(typeof found[1] != 'undefined') {
                    what += '&what=' + found[1];
                }
/*
                re = new RegExp('priceFrom=([0-9]+)');
                found = document.location.search.match(re);
                if(typeof found[1] != 'undefined') {
                    what += '&priceFrom=' + found[1];
                }
                re = new RegExp('priceTo=([0-9]+)');
                found = document.location.search.match(re);
                if(typeof found[1] != 'undefined') {
                    what += '&priceTo=' + found[1];
                }
                re = new RegExp('currency=([a-z]{2})');
                found = document.location.search.match(re);
                if(typeof found[1] != 'undefined') {
                    what += '&currency=' + found[1];
                }
*/
            }
				}
				// Расширенный поиск
				else {
/*
    				what += '&what='+document.getElementById('searchAdvancedFormWhat').value;
    				what += '&region='+document.getElementById('searchAdvancedFormRegion').value;
    				var inputs = document.getElementById('searchAdvancedForm').getElementsByTagName('input');
    				for(i=0,j=inputs.length; i<j; i++) {
    				    if(inputs[i].type == 'checkbox' && inputs[i].checked && inputs[i].id.indexOf('safRegion_') > -1) {
    						    what += '&okres[]=' + inputs[i].value;
    						}
    				    if(inputs[i].type == 'checkbox' && inputs[i].checked && inputs[i].id.indexOf('safRooms_') > -1) {
    						    what += '&rooms[]=' + inputs[i].value;
    						}
    				    if(inputs[i].type == 'checkbox' && inputs[i].checked && inputs[i].id.indexOf('safArea_') > -1) {
    						    what += '&area[]=' + inputs[i].value;
    						}
    				}
    				var text = document.getElementById('safPriceFrom').value;
    				if(text) {
    				    what += '&priceFrom='+text;
    				}
    				var text = document.getElementById('safPriceTo').value;
    				if(text) {
    				    what += '&priceTo='+text;
    				}
    				var text = document.getElementById('safText').value;
    				if(text) {
    				    what += '&text='+text;
    				}
*/
				}
        }
        //Request.JSON
        //var jSonRequest = new Json.Remote("/ajax.php?list"+what+"&x1="+p1.x+"&y1="+p1.y+"&x2="+p2.x+"&y2="+p2.y+'&page='+page+'&nocache='+nocache,{method: 'GET', encoding: 'UTF-8', onComplete: function(data){
        var jSonRequest = new Request.JSON("/ajax.php?list"+what+"&x1="+p1.x+"&y1="+p1.y+"&x2="+p2.x+"&y2="+p2.y+'&page='+page+'&nocache='+nocache,{method: 'GET', encoding: 'UTF-8', onComplete: function(data){

            var points = new Array();
            qmPage.putFoundCount(data[0].text-0, data[1].text-0);
            for(i=0, j=data.length-2; i<j; i++) {
                points[i] = data[i+2].text;
            }
            qmMap.points = points;
            qmMap.fulldata = new Array(); //!!!!!!!!!!!!!!!!!!
            qmPage.clearList();
            if(qmMap.what == 'customer' && qmMap.firstShow) {
                qmMap.rescale();
            }
            else {
                
//                setTimeout('qmMap.redraw();', 0);
//                setTimeout('qmMap.getFull();', 0);
            }
            qmMap.redraw();
            qmMap.getFull();            
            qmMap.pagingPages = Math.ceil(data[0].text/data[1].text-0);
            qmPage.fillPaging(qmMap.pagingPages, page);
            qmPage.loaderHide();
            qmMap.transferStarted = false;
            
            qmMap.firstShow = false;
         }}).send();
    }
    if(this.mapLocked == true) {
        this.mapLocked = false;
    }
}


qmMap.prototype.getFullRequest = function(request) {
    var jSonRequest = new Json.Remote("/ajax.php?getfull=1"+request+'&nocache='+nocache,{method: 'GET', encoding: 'UTF-8', onComplete: function(data){
        for(i=0, j=data.length; i<j; i++) {
            qmPage.fillList(data[i].text);
            qmMap.fulldata.push(data[i].text);
        }
    }}).send();
}

qmMap.prototype.getFull = function() {
    var cnt = 0;
    var request = '';
    nocache = new Date();
    nocache = nocache.getTime();
    for(i=0,j=this.points.length; i<j; i++) {
        request += '&obj[]=' + this.points[i].id;
        if((cnt+1) == this.objectsPerRequest || cnt == this.points.length-1) {
            this.getFullRequest(request);
            cnt = 0;
            request = '';
        }
        cnt++;
    }
    if(request.length > 0) {
        this.getFullRequest(request);
    }
}


////////////////////////////////////////////////////////////////////////////////
// Прорисовка
////////////////////////////////////////////////////////////////////////////////
qmMap.prototype.redraw = function(page) {
    var batch = new Array();
    for(i=0,j=this.points.length; i<j; i++) {
        if(this.points[i]) {
            var point = new GPoint(this.points[i].x, this.points[i].y);
            var marker = new GMarker(point);
            //var marker = new GMarker(point, {icon: this.icons[0]});/* {icon: this.icons[this.points[i].type_id]} */
            marker.point_id = this.points[i].id;
            if(this.points[i].is_flat == 1) {
                GEvent.addListener(marker, "click", function() {
                    qmMap.showInfo(marker, this.point_id);
/*
                    if(document.getElementById('list').style.display != 'block') {
                        qmPage.getFull(this.point_id);
                    }
                    qmPage.front.showFlatAddit(this.point_id);
                    qmPage.front.showFlatScroll(this.point_id);               
                    qmPage.front.showFlatInfo(this.point_id);
*/
                });
            }
            else {
/*
                GEvent.addListener(marker, "mouseover", function() {
                    qmPage.front.showInfraPopup(this.point_id, this);
                });
                GEvent.addListener(marker, "mouseout", function() {
                    qmPage.front.hideInfraPopup(this.point_id);
                });
*/
            }
            batch.push(marker);
        }
    }
    if(typeof this.markerManager == 'undefined') {
        this.markerManager = new MarkerManager(this.map);
    }
    else {
        this.markerManager.clearMarkers();
    }   
    this.markerManager.addMarkers(batch, 1, 17);
    this.markerManager.refresh();
}

qmMap.prototype.rescale = function() {
    var minX = 999;
    var minY = 999;
    var maxX = 0;
    var maxY = 0;
	for(var i=0; i<this.points.length; i++) {
        if(this.points[i].x < minX) {
            minX = this.points[i].x;
        }
        if(this.points[i].x > maxX) {
        	maxX = this.points[i].x;
        }
        if(this.points[i].y < minY) {
            minY = this.points[i].y;
        }
        if(this.points[i].y > maxY) {
        	maxY = this.points[i].y;
        }
	}
	if(minX && minY && maxX && maxY) {
		var sw = new GLatLng(minY, minX);
		var ne = new GLatLng(maxY, maxX);
		var bounds = new GLatLngBounds(sw, ne);
		var zoom = this.map.getBoundsZoomLevel(bounds);
		if(zoom > 17) zoom = 17;
		if(zoom < 6) zoom = 6;
		var centerY = (minY-0) + (maxY-minY)/2 - 0;
		var centerX = (minX-0) + (maxX-minX)/2 - 0;
		if(centerY && centerX) {
			this.map.setCenter(new GLatLng(centerY, centerX), zoom);
			qmPage.setAncor('x', centerX);
	        qmPage.setAncor('y', centerY);
	        qmPage.setAncor('z', zoom);
		}
	}
}

qmMap.prototype.showInfo = function(holder, id) {
   this.mapLocked = true;
   var curr = 0;
   var currFull = 0;
   // Берем полную информацию по объекту
   for(i=0,j=this.fulldata.length; i<j; i++) {
       if(this.fulldata[i].id == id) {
           currFull = this.fulldata[i];
           break;
       }
   }
   // Берем краткую информацию по объекту
   for(i=0,j=this.points.length; i<j; i++) {
       if(this.points[i].id == id) {
           surrShort = this.points[i];
           break;
       }
   }
   // Если чего-то не хватает - в хвост
   if(!currFull || !surrShort) {
       return false;
   }
   // Рисуем окошко
   var div = qmPage.fillList(currFull, 1);
   var messagePoint = new GLatLng(surrShort.y, surrShort.x);
   qmPage.markFlat(id);
   qmMap.map.openInfoWindow(messagePoint, div);
}

qmMap.prototype.changePage = function(page) {
    qmPage.loaderShow();
    qmPage.setAncor('page', page);
    this.getPoints(page-0);
}
