/** Y!SnapMap beta.2
    author: jr conlin
	url: http://unitedheroes.net/hacks/snapmap/
    description: The easiest way to put an AJAX map on a page.
 	TODO:
	Add logic for multiple maps: getElementsByClassName() ?
	Add additional optional args for map size, tools, settings

    Elements:
       address: where you want the map centered
       addressimg: what to draw at the address       
       zoom: level to zoom into
       nearby: look for stuff nearby the address
       nearbyimg: what to draw at those locations
*/
var ysnapmap = document.getElementById('ysnapmap');
var zoomLevels = { world:16, country: 14, state:11, city:5, street:2, house: 1 }; 
var appId = 'uhsnapmap';
{
    // Add the required libs and CSS items to the page.
    var head =  document.getElementsByTagName('head')[0];
    //This will automatically create YAHOO, bring in dom,event,dragdrop and animation
    document.write ('<scr'+'ipt src="http://api.maps.yahoo.com/ajaxymap?v=3.7&appid='+appId+'" type="text/javascript"><'+'/script>');
    
    var parseArgsIn = function (o) {
        YAHOO.ysnapmap.args = {};
		// get attributes first
		var args = ['address','zoom','nearby','nearbyimg','homeimg','title','url'];
		for (var i in args)
		{
			if (o.getAttribute(args[i]))
				YAHOO.ysnapmap.args[args[i]] = o.getAttribute(args[i]);
		}
		// else try script tag content
        var rawArgs = o.textContent;
        if (!rawArgs)
            rawArgs = o.text;
		if (rawArgs.length)
		{
	        rawArgs = rawArgs.replace(/<!\-+/,'').replace(/\-+>/,'').replace(/\cM/,'');
    	    rawArgs = rawArgs.split('\n');
            try {
        	for (var i in rawArgs) {
                if (!rawArgs[i].search) continue;
            	if (!rawArgs[i].search(/:/)) continue;
	            var kv =  rawArgs[i].replace(/^\s+/,'').split(":");
    	        var key = kv.shift();
        	    var val = kv.join(':');
            	YAHOO.ysnapmap.args[key] = val.replace(/^\s+/,'');
	        }
            }
            catch (e) {}
		}
		// set defaults
    	if (!YAHOO.ysnapmap.args.address) 
		   YAHOO.ysnapmap.args['address'] = '701 First Ave. Sunnyvale CA';
	    if (!YAHOO.ysnapmap.args.zoom) 
			YAHOO.ysnapmap.args['zoom'] = 'city';
        return YAHOO.ysnapmap.args;
    }

    var ysm_locSearch = function (e) {
        if (e.Data) {
            for (var locNum in e.Data.ITEMS) {
                var loc = e.Data.ITEMS[locNum];
                if (loc.TITLE) {
                    var yPt = new YGeoPoint(loc.LATITUDE,loc.LONGITUDE);
                    var yImg;
                    if (YAHOO.ysnapmap.args.nearbyimg)
                        yImg = new YImage(YAHOO.ysnapmap.args.nearbyimg);
                    var yMk = new YMarker(yPt,yImg);
                    var aexp ='<b>'+loc.TITLE+'</b><br>';
                    if (!isNaN(loc.RATING.AVERAGERATING))
                        aexp += loc.RATING.AVERAGERATING+' of 5 stars<br>';
                    if (loc.PHONE)
                        aexp  += '<i>'+loc.PHONE+'</i><br>';
                    aexp += loc.ADDRESS+'<br>';
                    aexp += loc.CITY+', '+loc.STATE+'<br>';
                    yMk.addAutoExpand(aexp);
                    yMk.setSmartWindowColor('blue');
                    YAHOO.ysnapmap.map.addOverlay(yMk);
                }
            }
        }
    }

    var ysm_updateGeoCode = function (e) {
        if (e.success) {
            YAHOO.ysnapmap.home = e;
            var yPt = new YGeoPoint(e.GeoPoint.Lat,e.GeoPoint.Lon);
            var yImg;
            if (YAHOO.ysnapmap.args.addressimg)
                yImg = YImage(YAHOO.ysnapmap.args.addressimg);
            var yMk = new YMarker(yPt,yImg);
            var title;
            if (YAHOO.ysnapmap.args.title)
                title = YAHOO.ysnapmap.args.title;
            else
                title = e.Address;
            if (YAHOO.ysnapmap.args.url)
                title = '<a href="'+YAHOO.ysnapmap.args.url+'">'+title+'</a>';
            yMk.addAutoExpand(title);
            e.ThisMap.addOverlay(yMk);
            e.ThisMap.drawZoomAndCenter(yPt,zoomLevels[YAHOO.ysnapmap.args.zoom]);
            if (YAHOO.ysnapmap.args.nearby){
                YEvent.Capture(YAHOO.ysnapmap.map, EventsList.onEndLocalSearch,ysm_locSearch);
                YAHOO.ysnapmap.map.searchLocal(yPt,YAHOO.ysnapmap.args.nearby,5,10);
            }
        }
    }

    var map_init = function (e) {
        // Do the YAHOO initializations.
        YAHOO.namespace('ysnapmap');
        var ysnapmap = document.getElementById('ysnapmap');
        var args = parseArgsIn(ysnapmap);
		// create wrapper
        var yDiv = document.createElement('div');
        yDiv.id = 'ysnapmap';
		// kill the load script
        if (window.removeEventListener)
            window.removeEventListener('load',map_init,true);
        else
            window.detachEvent('onload',map_init);
        ysnapmap.parentNode.replaceChild(yDiv,ysnapmap);
        YAHOO.ysnapmap.map = new YMap(document.getElementById('ysnapmap'));
		YAHOO.ysnapmap.map.addTypeControl();
		YAHOO.ysnapmap.map.setMapType(YAHOO_MAP_REG);
        YAHOO.ysnapmap.map.addPanControl();
        YAHOO.ysnapmap.map.addZoomLong();
        YAHOO.ysnapmap.args = args;
		// zoom to the home address
        if (args.address){
            YEvent.Capture(YAHOO.ysnapmap.map, EventsList.onEndGeoCode, ysm_updateGeoCode);
            YAHOO.ysnapmap.map.geoCodeAddress(args.address);
        }
    }

	// Add load script
    if (window.addEventListener)
        window.addEventListener('load',map_init,true);
    else
        window.attachEvent('onload',map_init);
    
}
