﻿jQuery(function(){
	var gmapObject=new GMapObject({'buildingsArray' : buildingsArray,'filter' : filter});
	gmapObject.filter($(".filter-checkbox:input"));
	jQuery.each($(".filter-checkbox:input"), function(){
		$(this).click(function(){
			gmapObject.filter($(".filter-checkbox:input"));
		});
	});
});

//
// GMAPOBJECT CLASS:
//
function GMapObject(paramsHash){
	
	// PRIVATE VARIABLES:
	var map,filter;
	var allMarkers=[];
	
	// CONSTRUCTOR:
	function GMapObject(ph){
		if (GBrowserIsCompatible()) {
			createMap();
			filter=ph['filter'];
			initMarkers(ph['buildingsArray']);
			displayAllMarkers();
		}
	}
	GMapObject(paramsHash);
	// CONSTRUCTOR.
	
	// PRIVATE METHODS:
	function createMap(){
		var gSize=new GSize(550,420);
		var mapOptions={'size':gSize};
		map=new GMap2(document.getElementById("map"),mapOptions);
		map.setCenter(new GLatLng(59.9385, 30.3168), 10.0000);
		var map_ctrl=new GLargeMapControl();
		map.addControl(map_ctrl);
		var map_type_ctrl=new GMapTypeControl();
		map.addControl(map_type_ctrl);
		var map_scale_ctrl=new GScaleControl();
		map.addControl(map_scale_ctrl);
		map.enableScrollWheelZoom();
	}
	
	// Markers initialization functions begin:
	function initMarkers(arrBuildings){
		for(var i in arrBuildings){
			var marker={};
			marker['site']=arrBuildings[i]['site'];
			marker['type']=arrBuildings[i]['type'];
			marker['status']=arrBuildings[i]['status'];
			marker['sales']=arrBuildings[i]['sales'];
			marker['onScreen']=false;
			marker['toView']=true;
			marker['GMarker']=getGMarker(arrBuildings[i]);
			allMarkers.push(marker);
		}
	}
	
	function getGMarker(building){
		var markerOptions=getMarkerOptions(building);
		var gpoint=new GLatLng(building['lat'], building['lng']);
		var gmarker=new GMarker(gpoint,markerOptions);
		addPopupForMarker(gmarker,building);
		return gmarker;
	}
	
	function getMarkerOptions(building){
		var Icon = getIcon(building);
		var markerOptions = { icon:Icon };
		return markerOptions;
	}

	function getIcon(building){
		var Icon = new GIcon();
		Icon.iconSize=new GSize(33,33);
		Icon.iconAnchor=new GPoint(20,27);
		Icon.infoWindowAnchor=new GPoint(13,0);
		Icon.image=getMarkerImage(building);
		return Icon;
	}

	function getMarkerImage(marker){
		var res=null;
		var rbi=filter.getTemplate()['site']['rbi'];
		var sg=filter.getTemplate()['site']['sg'];
		var comm=filter.getTemplate()['type']['commercial'];
		var resid=filter.getTemplate()['type']['residential'];
		var compl=filter.getTemplate()['status']['completed'];
		var stand=filter.getTemplate()['status']['standing'];
		if(marker['site']==rbi){
			res="upload/images/type1.png";
		}else if(marker['site']==sg){
			res="upload/images/type3.png";
		}

		if(marker['site']==rbi && marker['type']==comm && marker['status']==compl)  // оранжевый квадратный непрозрачный
			res="/upload/images/type2.png";
		else if(marker['site']==rbi && marker['type']==comm && marker['status']==stand)  // оранжевый квадратный прозрачный
			res="/upload/images/type6.png";//"1";  // неверный маркер. нужен оранжевый квадратный прозрачный
		else if(marker['site']==rbi && marker['type']==resid && marker['status']==compl)  // оранжевый круглый непрозрачный
			res="/upload/images/type1.png";
		else if(marker['site']==rbi && marker['type']==resid && marker['status']==stand)  // оранжевый круглый прозрачный
			res="/upload/images/type5.png";
		else if(marker['site']==sg && marker['type']==comm && marker['status']==compl)  // синий квадратный непрозрачный
			res="/upload/images/type4.png";//"5";  // неверный маркер. нужен синий квадратный непрозрачный
		else if(marker['site']==sg && marker['type']==comm && marker['status']==stand)  // синий квадратный прозрачный
			res="/upload/images/type8.png";
		else if(marker['site']==sg && marker['type']==resid && marker['status']==compl)  // синий круглый непрозрачный
			res="/upload/images/type3.png";
		else if(marker['site']==sg && marker['type']==resid && marker['status']==stand)  // синий круглый прозрачный
			res="/upload/images/type7.png";
			
		return res;
	}

	function addPopupForMarker(marker,building){
		GEvent.addListener(marker, 'click', function(){
			marker.openInfoWindowHtml(building['onclickPopupText']);
		});
	}
	// Markers initialization functions end.

	// Show markers functions begin:
	function displayAllMarkers(){
		for(var i in allMarkers){
			if(allMarkers[i]['toView'] && !allMarkers[i]['onScreen']){
				showMarker(allMarkers[i]);
			}else if(!allMarkers[i]['toView'] && allMarkers[i]['onScreen']){
				hideMarker(allMarkers[i]);
			}
		}
	}

	function showMarker(marker){
		map.addOverlay(marker['GMarker']);
		marker['onScreen']=true;
	}

	function hideMarker(marker){
		map.removeOverlay(marker['GMarker']);
		marker['onScreen']=false;
	}
	// Show markers functions end.
	
	// Filtering functions begin:
	function applyFilterToTheMarkers(filterHash){
		for(var i in allMarkers){
			applyFilterToOneMarker(filterHash,allMarkers[i]);
		}
		displayAllMarkers();
	}

	function applyFilterToOneMarker(filterHash,marker){
		marker['toView']=filter.apply(marker);
	}	
	// Filtering functions end.
	// PRIVATE METHODS.

	// PRIVILEGED METHODS:
	this.filter=function(filterCheckboxes){
		applyFilterToTheMarkers(filter.getHash(filterCheckboxes));
	}
	
	//======================== Dima for cities ==================================
	this.SetNewCenter=function(new_x, new_y){
		map.setCenter(new GLatLng(new_x, new_y), 10.0000);
	}
	//===========================================================================
	// PRIVILEGED METHODS.
}
//
// GMAPOBJECT CLASS.
//

//
// FILTER CLASS:
//
function Filter(paramsHash){

	// PRIVATE VARIABLES:
	var templateHash;
	var filterHash={};

	// CONSTRUCTOR:
	function Filter(ph){
		templateHash=ph;
	}
	Filter(paramsHash);
	// CONSTRUCTOR.

	// PRIVATE METHODS:
	function applySalesFilter(marker){
		var key='sales';
		var siteParamHash=templateHash[key];
		var siteKeys=getKeysOfParam(key);
		var yes=siteKeys[0];
		var no=siteKeys[1];
		if(marker[key]==templateHash[key][no] && filterHash[key][yes]==true){
			return false;
		}
		return true;
	}

	// (Hardcoded function)
	// HARDCODE: 
	function applyUniversalFilter(key,marker){
		var siteParamHash=templateHash[key];
		var siteKeys=getKeysOfParam(key);
		var key1=siteKeys[0];
		var key2=siteKeys[1];
		var cond1=(marker[key]==templateHash[key][key1] && filterHash[key][key1]==false && filterHash[key][key2]==true);
		var cond2=(marker[key]==templateHash[key][key2] && filterHash[key][key1]==true && filterHash[key][key2]==false);
		if(cond1 || cond2){
			return false;
		}
		return true;
	}

	var cachedKeysOfParam={};
	function getKeysOfParam(param){
		var keys=new Array();
		if(cachedKeysOfParam[param]!=null){
			keys=cachedKeysOfParam[param];
		}else{
			var debugMsg="function getKeysOfParam(key) called.\n";
			for(var i in templateHash[param]){
				keys.push(i);
				debugMsg+="added "+i+" key of site param\n";
			}
			cachedKeysOfParam[param]=keys;
			//alert(debugMsg);
		}
		return keys;
	}

	function findElementByName(filterElements,name){
		for(var i in filterElements){
			if(filterElements[i].name==name){
				return filterElements[i];
			}
		}
	}
  // PRIVATE METHODS.

	// PRIVILEGED METHODS:
	this.getTemplate=function(){
		return templateHash;
	}
	
	this.getHash=function(filterElements){
		var name="";
		var e;
		for(var i in templateHash){
			filterHash[i]={};
			for(var j in templateHash[i]){
				// HARDCODE: !!!
				if(i=="sales" && j=="no"){
					j="yes";
				}
				name=i+"-"+j;
				e=findElementByName(filterElements,name);
				filterHash[i][j]=(e.checked ? true : false);
			}
		}
		return filterHash;
	}
	
	this.apply=function(marker){
		return applyUniversalFilter('site',marker) && applyUniversalFilter('type',marker) && applyUniversalFilter('status',marker) && applySalesFilter(marker);
	}
	// PRIVILEGED METHODS.
}
//
// FILTER CLASS.
//