var myMap=null;
var myMapLarge=null;
var mapLDP={};
var mapSRPSmall={};
var mapSRPLarge={};
var mapTabDescription={};;
var mapTabMap={};
var mapTabPhotoVideo={};
var mapTabfloorPlan={};
var mapTabSchool={};
var listingCollection=new MQA.ShapeCollection();
var entityCollection=new MQA.ShapeCollection();
var poiCollection=new MQA.ShapeCollection();
var boundaryCollection=new MQA.ShapeCollection();
var parcelCollection=new MQA.ShapeCollection();
var mapCollection=new MQA.ShapeCollection();
var mapInitState;
var listingCollectionBounds=new MQA.LatLng("0","0");
var mapInit=new MQA.MapInit();
var zeroLL=new MQA.LatLng("0","0");
var poiCount=0;
var currentMapObj=null;

var mapIcons={"small":{},"medium":{},"large":{},"entity":{},"school":{},"hospital":{},"grocery":{},"gas":{},"bank":{},"restaurant":{}};
mapIcons.small.icon={"url":"http://o.aolcdn.com/art/realestate_maps/smallicon1.png","width":32,"height":41};
mapIcons.small.altIcon={"url":"http://o.aolcdn.com/art/realestate_maps/smalliconalt.png","width":32,"height":41};
mapIcons.medium.icon={"url":"http://o.aolcdn.com/art/realestate_maps/mediumicon.png","width":36,"height":46};
mapIcons.medium.altIcon={"url":"http://o.aolcdn.com/art/realestate_maps/mediumicon.png","width":36,"height":46};
mapIcons.large.icon={"url":"http://o.aolcdn.com/art/realestate_maps/largeicon.png","width":46,"height":66};
mapIcons.large.altIcon={"url":"http://o.aolcdn.com/art/realestate_maps/largeicon.png","width":46,"height":66};
mapIcons.entity.icon={"url":"http://o.aolcdn.com/art/realestate_maps/map_icon_green.png","width":26,"height":33};
mapIcons.school.icon={"url":"http://o.aolcdn.com/art/realestate_maps/poi-schools.png","width":28,"height":33};
mapIcons.hospital.icon={"url":"http://o.aolcdn.com/art/realestate_maps/poi-hospitals.png","width":28,"height":33};
mapIcons.grocery.icon={"url":"http://o.aolcdn.com/art/realestate_maps/poi-groceries.png","width":28,"height":33};
mapIcons.gas.icon={"url":"http://o.aolcdn.com/art/realestate_maps/poi-gas.png","width":28,"height":33};
mapIcons.bank.icon={"url":"http://o.aolcdn.com/art/realestate_maps/poi-banks.png","width":28,"height":33};
mapIcons.restaurant.icon={"url":"http://o.aolcdn.com/art/realestate_maps/poi-restaurants.png","width":28,"height":33};

var bLoader;
var pLoader;
var boundaryConfig=[];
var $smallMap=$jq("#smallMapHolder");
var $largeMapLink=$jq("#largeMapLink");
var $smHolder=$jq("#smallMapHolder");
var $largeMap=null;
var $smallMapLink=$jq("#smallMapLink");
var $lmHolder=$jq("#largeMapHolder");
var activePOI=null;
var $mapPos=$smallMap.offset();
var $pageContainer=$jq("#pageContainer");

function mapRestoreInitState(){currentMapObj.map.restoreState(currentMapObj.mapInitState);}
function initMapping(mapObj){
	if(typeof mapObject!="object"){return false;}
	loadMapObj(mapObj);
	loadCollections(mapObj);
	mapObj.map=loadMap(mapObj);
	if(mapObj.map==false){
		mapObj.map=null;
		return;
	}
	showCollections(mapObj);
	loadBoundary(mapObj);
	loadParcel(mapObj);
	showBoundaries(mapObj);
	mapObj.mapInitState=mapObj.map.saveState();
	currentMapObj=mapObj;
	$jq("#"+mapObject.mapWindow+" > .mapCover").toggleClass("hide");
}
function loadMapObj(mapObj){
	if(typeof mapObj.controls=="undefined"){
		mapObj.controls=mapObject.controls;
	}
	if(typeof mapObj.zoom=="undefined"){
		mapObj.zoom=mapObject.zoom;
	}
	if(typeof mapObj.type=="undefined"){
		mapObj.type=mapObject.type;
	}
	if(typeof mapObj.mapInit=="undefined"){
		mapObj.mapInit=mapInit;
	}
	if(typeof mapObj.mapSize=="undefined"){
		mapTabMap.mapSize=mapObject.mapSize;
	}
	if(typeof mapObj.boundary=="undefined"){
		mapTabMap.boundary=mapObject.boundary;
	}
	mapObj.LL=new MQA.LatLng(mapObject.lat,mapObject.lng);
	mapObj.listingCollection=new MQA.ShapeCollection();
	mapObj.entityCollection=new MQA.ShapeCollection();
	mapObj.poiCollection=new MQA.ShapeCollection();
	mapObj.boundaryCollection=new MQA.ShapeCollection();
	mapObj.parcelCollection=new MQA.ShapeCollection();
	mapObj.mapWindow="mapWindow";
	mapObj.window=ge(mapObj.mapWindow);
	mapObj.mapInitState=""
	return;	
}
function loadMap(mapObj){
    if(!mapObj.LL.equals(zeroLL)){
        if(typeof mapObj.type!="string"){
            mapObj.type="map";
        }
        mapObj.mapInit.setBestFitMargin(15);
        if(mapObj.listingCollection.getSize()>1){
            mapObj.mapInit.setBestFitRect(mapObj.listingCollection.getBoundingRect());
        }
	var theMap=new MQA.TileMap(mapObj.window,mapObj.zoom,mapObj.LL,mapObj.type,mapObj.mapInit);
	switch(mapObj.controls){
	        case 1:
			theMap.addControl(new MQA.LargeZoomControl(),new MQA.MapCornerPlacement(MQA.MapCorner.TOP_LEFT,new MQA.Size(5, 5)));
			theMap.addControl(new MQA.ViewControl(),new MQA.MapCornerPlacement(MQA.MapCorner.TOP_RIGHT,new MQA.Size(5, 5)));
			theMap.setLogoPlacement(MQA.MapLogo.MAPQUEST,new MQA.MapCornerPlacement(MQA.MapCorner.BOTTOM_LEFT, new MQA.Size(0,0)));
			theMap.setLogoPlacement(MQA.MapLogo.SCALES,new MQA.MapCornerPlacement(MQA.MapCorner.BOTTOM_RIGHT, new MQA.Size(0,20)));
			theMap.setLogoPlacement(MQA.MapLogo.MAPQUEST_COPYRIGHT,new MQA.MapCornerPlacement(MQA.MapCorner.BOTTOM_RIGHT, new MQA.Size((theMap.getSize().getWidth()/2)-51,0)));
			break;
	        case 0:
			theMap.addControl(new MQA.ZoomControl(),new MQA.MapCornerPlacement(MQA.MapCorner.TOP_RIGHT,new MQA.Size(-3, 0)));
			theMap.setLogoPlacement(MQA.MapLogo.SCALES,new MQA.MapCornerPlacement(MQA.MapCorner.TOP_RIGHT, new MQA.Size(-70,0)));
            	break;
        }
        MQA.EventManager.addListener(theMap,'dblclick',mapRestoreInitState);

        return theMap;
    }
    return false;
}
var myIcon=new MQA.Icon("http://o.aolcdn.com/art/realestate_maps/map_icon_green.png",26,33);

/*Collections*/
function cleanCollections(){
    if(listingCollection.getSize()>0){listingCollection.removeAll();}
    if(entityCollection.getSize()>0){entityCollection.removeAll();}
    if(boundaryCollection.getSize()>0){boundaryCollection.removeAll();}
    if(parcelCollection.getSize()>0){parcelCollection.removeAll();}
}
function loadCollections(mapObj){
    if(typeof listingsObject!="undefined"){loadListingCollection(mapObj);}
    if(typeof entityObject!="undefined"){loadEntityCollection(mapObj);}
}
function showCollections(mapObj){
    if(mapObj.listingCollection.getSize()>0){mapObj.map.addShapeCollection(mapObj.listingCollection);}
    if(mapObj.entityCollection.getSize()>0){mapObj.map.addShapeCollection(mapObj.entityCollection);}
}
function showBoundaries(mapObj){
    if(mapObj.boundaryCollection.getSize()>0){mapObj.map.addShapeCollection(mapObj.boundaryCollection);}
    if(mapObj.parcelCollection.getSize()>0){
    	mapObj.map.addShapeCollection(mapObj.parcelCollection);
	mapObj.map.zoomToRect(mapObj.parcelCollection.getBoundingRect());
    }
}
function loadListingCollection(mapObj){
    mapObj.listingCollection.Name="Listings";
    mapObj.listingCollection.collectionName="Listings";
    var myIT="listing";
    buildCollection(mapObj.listingCollection,listingsObject,myIT);
    return;
}
function loadEntityCollection(mapObj){
    mapObj.entityCollection.Name="Entitys";
    mapObj.entityCollection.collectionName="Entitys";
    var myIT="entity";
    buildCollection(mapObj.entityCollection,entityObject,myIT);
    return;
}
function buildCollection(myC,myO,myIT){
	poiCount=0;
	var myL=myO.length;
	if(myL>0){
		for(var i=0;i<myL;i++){
			poiCount=i+1;
			addIcon(myC,myO[i],myIT);
		}
	}
	return;
}
function addIcon(myCollection,myObj,iconType){
    var myLL=new MQA.LatLng(myObj.lat,myObj.lng);
    if(!myLL.equals(zeroLL)){
		var myPOI = new MQA.Poi(myLL);
		myPOI.setValue("rolloverEnabled",true);
		switch(iconType){
			case "listing":
				switch(mapObject.mapSize){
					case "small":
						var iconBase=mapIcons.small;
						break;
					case "medium":
						var iconBase=mapIcons.medium;
						break;
					case "large":
						var iconBase=mapIcons.large;
						break;
				}
				break;
			case "entity":
				var iconBase=mapIcons.entity;
				var labelText=poiCount.toString();
				if(poiCount<10){
					labelText=" "+labelText;	
				}
				myPOI.setValue("labelText",labelText);
				break;		
			case "poi":
				
				break;
		}
		var myIcon= new MQA.Icon(iconBase.icon.url,iconBase.icon.width,iconBase.icon.height);
		switch(iconType){
			case "listing":
				var myAltIcon= new MQA.Icon(iconBase.altIcon.url,iconBase.altIcon.width,iconBase.altIcon.height);
				break;
			case "entity":
				var myAltIcon=myIcon;
				break;
		}
		var iconOffset= new MQA.Point(-(iconBase.icon.width/2),-(iconBase.icon.height/2));
		myPOI.setValue("icon",myIcon);
		myPOI.setValue("iconOffset",iconOffset);
		myPOI.setValue("altIcon", myAltIcon);
		myPOI.setValue("altIconOffset", iconOffset);
		myPOI.setValue("declutterIcon",myIcon);
		myPOI.setValue("declutterIconOffset",iconOffset);        
	
		if(!myObj.details){
			myPOI.setValue("rolloverEnabled","false");
		}else{
			if(myObj.id!=""){
				myPOI.setValue("key","l"+myObj.id);
				var dObj=buildInfoContentObject(myObj);
				myPOI.setValue("infoTitleHTML",dObj.title);
				if(myObj.details){
					myPOI.setValue("infoContentHTML",dObj.info);
				}
			}
		}
		myCollection.add(myPOI);
	}
}
function buildInfoContentObject(myObj){
    var detailObject=new Object();
    detailObject.title=myObj.street;
    if(detailObject.title=="N/A" || detailObject.title==""){
        detailObject.title=myObj.csz;
    }
    if(myObj.details){
        var myInfo="";
        if(myObj.photo!=""){
            if(myObj.url!=""){
                myInfo+="<a href='"+myObj.url+"' class='inner_left'><img src='"+myObj.photo+"' class='image'/></a>";
            }else{
                myInfo+="<img src='"+myObj.photo+"' class='image inner_left'/>";
            }
        }else{
            myInfo+="<img src='http://o.aolcdn.com/art/ch_realestate/no_image.gif' class='image inner_left'/>";
        }
        myInfo+="<div class='info'>";
            myInfo+="<span class='price'>"+myObj.price+"</span>";
            var bb="";
            if(myObj.beds!="N/A" && myObj.beds!=""){
                bb+=myObj.beds+" br ";
            }
            if(myObj.baths!="N/A" && myObj.baths!=""){
                bb+=myObj.baths+" ba ";
            }
            if(bb.length>0){
                myInfo+="<span class='bb'>"+bb+"</span>";
            }
            if(myObj.sqft!="N/A" && myObj.sqft!=""){
                myInfo+="<span class='sqft'>"+myObj.sqft+" sqft.</span>";
            }
            if(myObj.type!=""){
                myInfo+="<span class='prop_type'>"+myObj.type+"</span>";
            }
        myInfo+="</div><div class='clear'></div>";
        if(myObj.url!=""){
            myInfo+="<a href='"+myObj.url+"' class='more'>View more details ></a>";
        }
        detailObject.info=myInfo;
    } 
    return detailObject;
}
/*changes state of POI to switch icon*/
function hoverPOI(){
    var altStateFlag=this.getValue("altStateFlag");
    if(altStateFlag){
        altStateFlag=false;
    }else{
        altStateFlag=true;
    }
    this.setValue("altStateFlag",altStateFlag);
}
/*Infowindow*/
function distroyInfoBase(){
    $jq("#infoBase").remove();
    activePOI.setValue("altStateFlag",false);
}
function createInfoWindow(tObj){
    if(tObj.getShowable()){
        if(activePOI!=null){
            activePOI.setValue("altStateFlag",false);
        }
        activePOI=tObj;
        tObj.setValue("altStateFlag",true);
        var infoPosition=createInfoPosition(tObj);
        var $infoBase=$jq(createInfoBase());
        $infoBase.attr("style","top:"+infoPosition.top+"px;left:"+infoPosition.left+"px;");
        $infoBase.empty();
        $infoBase.append(createInfoClose());
        $infoBase.append(createInfoContent(tObj));
        $jq("body").append($infoBase);
    }
}
function createInfoPosition(tObj){
    var theXY=tObj.getXY();
    var top=$mapPos.top+theXY.y+21;
    var left=$mapPos.left+theXY.x;
    if(left<0){left=0;}
    var right=($pageContainer.position()).left+$pageContainer.width();
    var w1=left+230;
    if((left+230)>right){
        left=left-((left+230)-right);
    }
    return {"top":top,"left":left}
}
function createInfoContent(tObj){
    var $iT=$jq(document.createElement("div"));
    $iT.attr("id","infoTitle");
    $iT.html(tObj.infoTitleHTML);
    var $iC=$jq(document.createElement("div"));
    $iC.attr("id","infoContent");
    $iC.html(tObj.infoContentHTML);
    var $iW=$jq(document.createElement("div"));
    $iW.attr("id","infoWindow");
    $iW.append($iT);
    $iW.append($iC);
    return $iW;
}
function createInfoBase(){
    var $infoBase=$jq("#infoBase");
    if($infoBase.length==0){
        var $infoBase=document.createElement("div");
        $infoBase.setAttribute("id","infoBase");
    }
    return $infoBase;
}
function createInfoClose(){
    var a=document.createElement("div");
    a.setAttribute("id","infoClose");
    a.onclick=distroyInfoBase;
    return a;
}

/*Boundaries*/
function reLoadBoundary(){
    boundaryCollection.removeAll();
    bLoader.loadByRectLL(myMap.getBounds());
}
function loadBoundary(mapObj){
    if(typeof mapObject.boundary=="object" && mapObject.boundary.length>0){
        if(configureBoundaryLoader()){
            var rectangle = mapObj.map.getBounds();
            bLoader.loadByRectLL(mapObj.map.getBounds());
            MQA.EventManager.addListener(mapObj.map,'zoomend',reLoadBoundary);
            MQA.EventManager.addListener(mapObj.map,'dragend',reLoadBoundary);

        }
    }
}
function configureBoundaryLoader(){
    var boundaryType=[];
    switch(mapObject.boundary[0]){
    case 'City':
        boundaryType.push(16);
        boundaryConfig.push({"key":16,"color":"#000000","border":"2px","fill":"#000000","trans":"0.4","altColor":"#000000","altBorder":"2px","altFill":"#000000","altTrans":"0.7"});
        break
    case 'Block':
        boundaryType.push(15);
        boundaryConfig.push({"key":15,"color":"#000000","border":"2px","fill":"#000000","trans":"0.4","altColor":"#000000","altBorder":"2px","altFill":"#000000","altTrans":"0.7"});
        break
    case 'Congressional District':
        boundaryType.push(6);
        boundaryConfig.push({"key":6,"color":"#000000","border":"2px","fill":"#000000","trans":"0.4","altColor":"#000000","altBorder":"2px","altFill":"#000000","altTrans":"0.7"});
        break
    case 'State':
        boundaryType.push(2);
        boundaryConfig.push({"key":2,"color":"#000000","border":"2px","fill":"#000000","trans":"0.4","altColor":"#000000","altBorder":"2px","altFill":"#000000","altTrans":"0.7"});
        break
    case 'Metro Areas':
        boundaryType.push(14);
        boundaryConfig.push({"key":14,"color":"#000000","border":"2px","fill":"#000000","trans":"0.4","altColor":"#000000","altBorder":"2px","altFill":"#000000","altTrans":"0.7"});
        break
    case 'County':
        boundaryType.push(4);
        boundaryConfig.push({"key":4,"color":"#000000","border":"2px","fill":"#000000","trans":"0.4","altColor":"#000000","altBorder":"2px","altFill":"#000000","altTrans":"0.7"});
        break
    case 'Neighborhood':
        boundaryType.push(36);
        boundaryConfig.push({"key":36,"color":"#000000","border":"2px","fill":"#000000","trans":"0.4","altColor":"#000000","altBorder":"2px","altFill":"#000000","altTrans":"0.7"});
        break
    case 'School District':
        boundaryType.push(19);
        boundaryConfig.push({"key":19,"color":"#000000","border":"2px","fill":"#000000","trans":"0.4","altColor":"#000000","altBorder":"2px","altFill":"#000000","altTrans":"0.7"});
        break
    case 'Zipcode':
        boundaryType.push(8);
        boundaryConfig.push({"key":8,"color":"#000000","border":"2px","fill":"#000000","trans":"0.4","altColor":"#000000","altBorder":"2px","altFill":"#000000","altTrans":"0.7"});
        break
    default:
        return false;
    }
    bLoader=new MQA.BoundaryLoader()
    bLoader.setMaxResults(1000);
    MQA.EventManager.addListener(bLoader, "complete", onBoundariesLoaded);
    bLoader.addType(boundaryType);
    return true;
}
function onBoundariesLoaded(event){
    boundaryCollection.removeAll();
    var bObj=boundaryConfig[0];
    var loops=event.srcObject.getBoundaries().length;
    for(var i=0;i<event.srcObject.getBoundaries().length;i++){
        var boundary = event.srcObject.getBoundaries()[i];
        var bOverlay=new MQA.PolygonOverlay()
        bOverlay.shapePoints=new MQA.LatLngCollection();
        bOverlay.setValue('key',bObj.key+"-"+i);
        bOverlay.setValue('color',bObj.color);
        bOverlay.setValue('borderWidth',bObj.border);
        bOverlay.setValue('fillColor',bObj.fill);
        bOverlay.setValue('fillColorAlpha',bObj.trans);
        bOverlay.setValue('altColor',bObj.altColor);
        bOverlay.setValue('altBorderWidth',bObj.altBorder);
        bOverlay.setValue('altFillColor',bObj.altFill);
        bOverlay.setValue('altFillColorAlpha',bObj.altTrans);
        var vertices = event.srcObject.getBoundaries()[i].getValue('vertices')[0];
        for (var ii = 0; ii < vertices.getSize(); ii++) {
            bOverlay.getShapePoints().add(new MQA.LatLng(vertices.get(ii).lat, vertices.get(ii).lng));
        }
        MQA.EventManager.addListener(bOverlay, "mouseOver", onBoundaryMouseOver)
        MQA.EventManager.addListener(bOverlay, "mouseOut", onBoundaryMouseOut)
        boundaryCollection.add(bOverlay);
    }
}
function onBoundaryMouseOver(event){this.setValue('altStateFlag',true);}
function onBoundaryMouseOut(event){this.setValue('altStateFlag',false);}

/*Parcels*/
function loadParcel(mapObj){
    if(typeof mapObj.boundary=="object" && mapObj.boundary.length>0){
        if(mapObj.boundary[0]=="parcels"){
            var myPoint=mapObj.LL;
            configureParcelLoader();
            pLoader.loadByPointLL(myPoint);
        }
    }
}
function configureParcelLoader(){
    pLoader=new MQA.ParcelLoader();
    pLoader.addProperty("bounds")
    MQA.EventManager.addListener(pLoader, "complete", onParcelLoad);
}
function onParcelLoad(event) {
    for(var i=0;i<event.srcObject.getParcels().length;i++){
        var parcel = event.srcObject.getParcels()[i];
        var bOverlay=new MQA.PolygonOverlay()
        bOverlay.shapePoints=new MQA.LatLngCollection();
        bOverlay.setValue('key',i+"P");
        bOverlay.setValue('color','#C47042');
        bOverlay.setValue('borderWidth','2px');
        bOverlay.setValue('fillColor','#000000');
        bOverlay.setValue('fillColorAlpha','0.4');
        bOverlay.setValue('altColor','#C47042');
        bOverlay.setValue('altBorderWidth','2px');
        bOverlay.setValue('altFillColor','#000000');
        bOverlay.setValue('altFillColorAlpha','0.7');
        var vertices = parcel.getValue('vertices')[0];
        for (var ii = 0; ii < vertices.getSize(); ii++) {
            bOverlay.getShapePoints().add(new MQA.LatLng(vertices.get(ii).lat, vertices.get(ii).lng));
        }
        MQA.EventManager.addListener(bOverlay, "mouseOver", onParcelMouseOver)
        MQA.EventManager.addListener(bOverlay, "mouseOut", onParcelMouseOut)
        parcelCollection.add(bOverlay);
    }
}
function onParcelMouseOver(event){this.setValue('altStateFlag',true);}
function onParcelMouseOut(event){this.setValue('altStateFlag',false);}
function reloadCollections(){
    cleanCollections();
    loadCollections();
    showCollections();
    if(listingCollectionBounds!=listingCollection.getBoundingRect()){
        myMap.zoomToRect(listingCollection.getBoundingRect());
    }
    listingCollectionBounds=listingCollection.getBoundingRect();
    loadBoundary();
    loadParcel();
}

/*un-used hover functions??*/
function flipIcon(e){flipLabel(this);hiLiteIcon(ge(this.getKey()));}
function findIcon(myID){if(typeof myMap=="undefined"){return;}flipLabel(myMap.getByKey(myID));}
function flipLabel(icon){
    var myClass=icon.getHTMLContentClass();
    var myIndex=myClass.indexOf("_hover");
    if(myIndex!=-1){
        var newClass=myClass.substring(0,myIndex);
    }else{
        var newClass=myClass+"_hover";
    }
    icon.setHTMLContentClass(myClass,newClass);
    return;
}

/*large map switcher*/
function showLargeMap(){
    $smHolder.hide();
    if($largeMap==null){
        mapObject.controls=1;
        loadCollections();
        mapIt("mapWindowLarge");
        myMapLarge=myMap;
        showCollections();
        $largeMap=$jq("#mapWindowLarge");
    }
    $lmHolder.show();
    $mapPos=$largeMap.offset();
}
function showSmallMap(){
    $smHolder.show();
    $lmHolder.hide();
    $mapPos=$smallMap.offset();
    myMap=myMap;
}

/*new MQA prototypes*/
MQA.Poi.prototype.getHTMLContentClass=function(){var eObj=this.HTMLContent;var myIndex=eObj.indexOf("class='");if(myIndex!=-1){var objClass=eObj.substring(myIndex+7);myIndex=objClass.indexOf("'");objClass=objClass.substring(0,myIndex);return objClass;}return "";}
MQA.Poi.prototype.setHTMLContentClass=function(oldClass,newClass){var eObj=this.HTMLContent;var eArray=eObj.split(oldClass);eObj=eArray.join(newClass);this.setValue("HTMLContent", eObj);return;}
var overriden = MQA.TileMap.prototype.calculateMapType;
MQA.TileMap.prototype.calculateMapType=function(){var type=overriden.call(this);return(type=="sat" && this.tileMode=="hyb")?"hyb":type;}