OT = {};
$D = YAHOO.util.Dom;
$E = YAHOO.util.Event;
$W = YAHOO.widget;
$A = YAHOO.util.Anim;
$Easing = YAHOO.util.Easing;

google.load("maps", "2");
window.unload = google.maps.GUnload;
markerHandlers = [];

geocoder = map = icon = null;
mapOptions = { minZoom: 15, maxZoom: 15 };

function pop(id,link,evt) {
    if (typeof(link.popup) == 'undefined') {
	var underlay = (navigator.appVersion.indexOf('MSIE 6') != -1) ? 'none' : 'shadow';
	link.popup = new $W.Dialog(id, {
		buttons: [ { text:'Send', isDefault:true }, { text: 'Cancel' } ],
		postmethod: 'form',
		context: [link, "tl","tl"],
		constraintoviewport: true,
		underlay: underlay
	    });
	$D.removeClass($D.get(id),'popup');
	link.popup.render();
    } else {
	link.popup.show();
    }
}

$E.onDOMReady((function() {
	    OT.galleries = [];
	    $D.getElementsByClassName('gallery','div','content',OT.createGallery);
            
            var blanks = $D.getElementsByClassName('blank');
            for (var i=0; i < blanks.length; i++) {
                blanks[i].target = '_blank';
            }
            
            var flickr = $D.getElementsByClassName('flickr_badge_image');           
            for (var i=0; i < flickr.length; i++) {
                flickr[i].getElementsByTagName('a')[0].target = '_blank';
            }

            var directions = $D.getElementsByClassName('directions');
            for (var i=0; i < directions.length; i++) {
                directions[i].getElementsByTagName('a')[0].target = 'directions';
            } 
	}));

OT.createGallery  = function(g) {
    OT.galleries[g.id] = new OT.Gallery(g);
}

OT.Gallery = function(g) {

    var first = true;
    var current;
    var current_id;
    var currentThumb;

    var processThumbLink = function(link) {
	link.full = $D.getElementsBy(function(o) { return (o.src == link.href) },'img',g);
	link.full_id = $D.generateId(link.full);
	if (first) {
	    current_id = link.full_id;
	    current = $D.get(current_id);
	    currentThumb = link;
	    $D.addClass(currentThumb,'hi');
	    first = false;
	}
	$E.addListener(link,'click',showFull,null,this);
    }
    
    var showFull = function(e) {
	$E.stopEvent(e);
	var link = $E.getTarget(e);	
	if (link.tagName.toLowerCase() != 'a') {
	    link = $D.getAncestorByTagName(link,'a');
	}

	var full = $D.get(link.full_id);	

	if (current_id != link.full_id) {

	var a = new $A(full, { opacity: { from: 0.0, to: 1.0 }}, 1, $Easing.easeBoth);
	a.onStart.subscribe(function() {
		$D.setStyle(current,'z-index',1);
		$D.setStyle(full,'z-index',2);
		$D.setStyle(full,'opacity',0);
		$D.addClass(full,'gallery-full-show');
		$D.removeClass(full,'gallery-full-hide');
		$D.removeClass(currentThumb,'hi');
		$D.addClass(link,'hi');
	    });
	a.onComplete.subscribe(function() {
		$D.addClass(current,'gallery-full-hide');
		$D.removeClass(current,'gallery-full-show');
		$D.setStyle(full,'z-index',1);
		current_id = link.full_id;
		current = $D.get(current_id);
		currentThumb = link;
	    });
	a.animate();

	}
    }

    var thumbs = $D.getElementsByClassName('gallery-thumb-link','a',g,processThumbLink);
    
    return this;    
}

function bookmark() {
    if (window.external && typeof(window.external.AddFavorite) == 'function') { 
	window.external.AddFavorite(self.location.href,document.title);
    } else {
	alert('Press Control-D to bookmark this page');
    }
}

function setupMap(id,callback) {
    window.onunload = GUnload;
    google.setOnLoadCallback((function() {
		map = new google.maps.Map2(document.getElementById(id));
		map.setCenter(new google.maps.LatLng(41.910486999999996,-87.63662500000001), mapOptions.minZoom);
		map.addControl(new GSmallZoomControl());
		map.enableDoubleClickZoom();
		//map.enableScrollWheelZoom();

		mapBounds = new GLatLngBounds();

		geocoder = new GClientGeocoder();

		icon = new GIcon();
		icon.image = OTMRA_BASE + 'static/img/pin.png';
		icon.iconSize = new GSize(39, 31);
		icon.iconAnchor = new GPoint(0, 0);
		icon.infoWindowAnchor = new GPoint(16, 3);	   

		featIcon = new GIcon();
		featIcon.image = OTMRA_BASE + 'static/img/pin-feat.png';
		featIcon.iconSize = new GSize(39, 31);
		featIcon.iconAnchor = new GPoint(0, 0);
		featIcon.infoWindowAnchor = new GPoint(16, 3);	   

		if (typeof(callback) == 'function') callback();

		
	    }));      
}
var centered = false;
function centerMap() {
    newzoom = map.getBoundsZoomLevel(mapBounds);
    newcenter = mapBounds.getCenter();
    map.setCenter (newcenter,newzoom);
    fixOverlaps();
    GEvent.addListener(map,'zoomend',fixOverlaps);
}


var markerLabels = null;
function fixOverlaps() {    
    var $D = YAHOO.util.Dom;
    var lastzi = null;
    markerLabels = $D.getElementsByClassName('markerLabel','div','gmap',function(ml) { 
	    ml._markerIcon = $D.getPreviousSibling(ml);
	    if (lastzi != null) {
		lastzi++;
		ml._markerIcon.style.zIndex = lastzi;
		lastzi++;
		ml.style.zIndex = lastzi;
	    }	    
	    lastzi = ml.style.zIndex;
	});
    if (map.getZoom() < 15) return;
    var reg, reg2, intersect;
    for (var i=0; i<markerLabels.length; i++) {
	reg1 = $D.getRegion(markerLabels[i]._markerIcon);
	for (var k=0; k<markerLabels.length; k++) {
	    if (k != i) {
		reg2 = $D.getRegion(markerLabels[k]._markerIcon);
		intersect = reg1.intersect(reg2);
		if (intersect) {
		    intersect.width = intersect.right - intersect.left - 18;
		    intersect.height = intersect.bottom - intersect.top - 12;
		    if (intersect.width > 0) {
			markerLabels[i].style.left = markerLabels[i]._markerIcon.style.left = (parseInt(markerLabels[i]._markerIcon.style.left) - (intersect.width/2)) + 'px';			
			markerLabels[k].style.left = markerLabels[k]._markerIcon.style.left = (parseInt(markerLabels[k]._markerIcon.style.left) + (intersect.width/2)) + 'px';
		    }
		    if (intersect.height > 0) {
			markerLabels[i].style.top = markerLabels[i]._markerIcon.style.top = (parseInt(markerLabels[i]._markerIcon.style.top) - (intersect.height/2)) + 'px';
			markerLabels[k].style.top = markerLabels[k]._markerIcon.style.top = (parseInt(markerLabels[k]._markerIcon.style.top) + (intersect.height/2)) + 'px';
		    }
		}
	    }
	}
    }
}

function addMarkers(markers) {
    for (i=0; i<markers.length; i++) {
	if (i == markers.length-1) markers[i].setCenter = true;
	addMarker(markers[i].address,markers[i]);
    }
}

function addMarker(address,opts) {
	if (geocoder) {
		if (opts == null) opts = {};	
		geocoder.getLatLng(address,
			function(point) {
				if (!point) {
					// alert(address + " not found");
				} else {
				    //				    augmentMapArea(point);
				    
				    if (!centered) {
					//					map.setCenter(point, 15);
					//					centered = true;
				    }
				    var markerOpts = {};
				    if (opts.title) markerOpts.title = opts.title;
				    if (opts.label) markerOpts.labelText = opts.label;
				    if (opts.pin) markerOpts.icon = eval(opts.pin);
				    else markerOpts.icon = icon;
				    
				    //var marker = new GMarker(point,markerOpts);			   
				    var marker = new LabeledMarker(point,markerOpts);
				    map.addOverlay(marker);
				    
				    var infoHTML = '';
				    infoHTML += '<div'+(opts.infoClass ? ' class="'+opts.infoClass+'"' : '')+'>';
				    if (opts.title) {
              if (opts.url) {
                infoHTML += '<h4><a href="'+opts.url+'">'+opts.title+'</a></h4>';
              } else {
                infoHTML += '<h4>'+opts.title+'</h4>';
              }
            }
				    if (opts.description) infoHTML += '<div>'+opts.description+'</div>';
				    if (opts.disp_address) infoHTML += '<div>'+opts.disp_address+'</div>';
				    else infoHTML += '<div>'+address+'</div>';
				    if (opts.phone) infoHTML += '<div>'+opts.phone+'</div>';
				    infoHTML += '</div>';
				    
				    $E.addListener('maplink_'+opts.id,'mouseover',function(e) {
      					    var li = $D.getAncestorByTagName($E.getTarget(e),'li');
					    $D.addClass(li,'hi');
					    if (marker.isHidden()) marker.show();
					    marker.openInfoWindowHtml(infoHTML);							
					    if (opts.popOver) {

					    } else {
						//map.setZoom(mapOptions.minZoom);
						//map.panTo(marker.getPoint());
					    }
					}
					);
				    
				    $E.addListener('maplink_'+opts.id,'mouseout',function(e) {
					    var li = $D.getAncestorByTagName($E.getTarget(e),'li');
					    $D.removeClass(li,'hi');
					});
				    
				    if (opts.openInfo) marker.openInfoWindowHtml(infoHTML);
				    else marker.bindInfoWindowHtml(infoHTML);
				    
				    mapBounds.extend(point);


				    
				}
				    if (opts.setCenter) {
					centerMap();
				    }
				   }
				   );
	}
}

var mapArea = {
    n: null,
    s: null,
    e: null,
    w: null
};

var mapPoints = [];

function augmentMapArea(point) {
    mapPoints.push(point);
    if (mapArea.n == null || point.y < mapArea.n) mapArea.n = point.y;
    if (mapArea.s == null || point.y > mapArea.s) mapArea.s = point.y;
    if (mapArea.e == null || point.x < mapArea.e) mapArea.e = point.x;
    if (mapArea.w == null || point.x > mapArea.w) mapArea.w = point.x;
}



function showAddress(address) {
    addMarker(address,true);
}



function drawPoly(points, center) {
	if (center == null) center = true;
	if (points.length > 0) {
		if (typeof(points[0]) == 'number') {
			var point = null;
			var zoom = 12;
			if (points.length == 2) {
				point = new GLatLng(points[0], points[1]);
			} else {
				var ne = new GLatLng(points[0], points[2]);
				var sw = new GLatLng(points[1], points[3]);
				var outerBounds = new GLatLngBounds();
				outerBounds.extend(ne);
				outerBounds.extend(sw);
				zoom = map.getBoundsZoomLevel(outerBounds);
				point = outerBounds.getCenter();
			}		
			boundaryLine = new GMarker(point, icon);
			map.addOverlay(boundaryLine);
			mapOptions.minZoom = zoom;
			if (centerMap) {
				map.setZoom(zoom);
				map.panTo(point);
			}
		} else {
			var p = [];
			var outerBounds = new GLatLngBounds();
			for (var i=0; i<points.length; i++) {
				p[i] = new GLatLng(points[i][0], points[i][1]);
				outerBounds.extend(p[i])
			}
			if (points.length > 2) {
				p[p.length] = new GLatLng(points[0][0], points[0][1]);
			}	
			boundaryLine = new GPolygon(p, "#990000", 5, 0.5, "#990000", 0.1);
			map.addOverlay(boundaryLine);
			//zoom = map.getBoundsZoomLevel(outerBounds);
			//mapOptions.minZoom = zoom;
			zoom = mapOptions.minZoom;
			if (center) {
				map.setCenter(outerBounds.getCenter(), zoom);
			}
		}
	}
}


function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}

function getScrollTop() {
	return getScrollXY()[1];
}
