// Locoos Map for Blogger by Didier Durand
//
// http://www.locoos.com


/**
 * Class to store all single map related parameters: markers, geo position,
 * map type, map options, overlays, HTML element to hook to, style etc.
 */

function MapData(elem, defaultW, defaultH) {
	// DOM related stuff
	this.elem=elem;
	this.inheritedStyle=null;
	this.className=null;
	this.inheritedID=null;
	this.defaultW=defaultW;
	this.defaultH=defaultH;

	// Map related stuff
	this.geoCoord=null;
	this.zoom=null;
	this.overviewMapControl=true;
	this.controls=true;
	this.showMarkers=true;

}


/**
 * This is the method that effectively creates the Google Map based
 * on the MapData object.
 */

MapData.prototype.createGoogleMap = function() {
	var realMap;
	var mapNode;

	mapNode = document.createElement("div");

	if (this.className) mapNode.className = "map " + this.className;
	else mapNode.className = "map";

	if (this.inheritedStyle) mapNode.style.cssText = this.inheritedStyle;

	mapNode.style.display = "block";
	if (mapNode.style.visibility == "hidden")
		 mapNode.style.visibility="inherit";

	alert('thie.elem: ' + this.elem.toString());
	this.elem.appendChild(mapNode);
	


	if (mapNode.style.width == 0) {
		if (this.defaultW.toString().indexOf("%")!=-1)
			mapNode.style.width = this.defaultW;
		else mapNode.style.width = this.defaultW + "px";
	}

	if (mapNode.style.height == 0) {
		if (this.defaultH.toString().indexOf("%")!=-1)
			mapNode.style.height = this.defaultH;
		else mapNode.style.height = this.defaultH + "px";
	}
    
	iframeHTML ='<iframe src ="http://www.locoos.com/BloggerMaps.htm" height="100%" width="100%" frameborder="0"></iframe>';
	mapNode.update(iframeHTML);
}


/**
 * Walks through html source looking for {{locoosmap}} tag
 */

MapPlugin.prototype.spotMapContainers = function() {

	var body = $$('body').reduce();
	var html = body.innerHTML;
	
	var newHtml = html.replace(/{{locoosmap}}/ig, '<div class="locoosmap"></div>');
	body.update(newHtml);
	
	var mapContainers = $$('.locoosmap');
	var createMapData = function (elem) {
		return new MapData(elem,this.defaultW,this.defaultH);
	}
	
	this.maps = mapContainers.collect(createMapData.bind(this));
	return;
	
}
		


/**
 * After parsing and creating all MapData objects, efficiently create
 * the found maps.
 */

MapPlugin.prototype.createMaps = function() {
	var map;

	while ((map=this.maps.pop())) {
		map.createGoogleMap();
	}
}




/*
 * Object created by window.onload() event, contains global maps options as
 * sizes etc, starts and finishes all maps fetching and creation proccess.
 *
 */
function MapPlugin(_defaultWidth, _defaultHeight) {
	this.defaultW = _defaultWidth;
	this.defaultH = _defaultHeight;

	this.maps=new Array;

	this.spotMapContainers();
	this.createMaps();
}



/**
 * Creates triggers on page loading/unloading events for plugin initialization.
 */

function BloggerMapInit() {
	
	//if (! GBrowserIsCompatible()) return;

	var oldOnLoad = window.onload;
	var oldOnUnload = window.onunload;

	var _defaultWidth = 400;
	var _defaultHeight = 400;
	var instantiate = function() {
		new MapPlugin(_defaultWidth, _defaultHeight);
	}
	
	//alert('Locoos Plugin for Blogger activated');
	document.write('<script id="Prototype-Locoos" src="http://www.locoos.com/scriptaculous/lib/prototype.js" type="text/javascript" charset="utf-8"></script>');
	var script = document.getElementById('Prototype-Locoos');
	html = script.innerHTML;
	Locoos.evalScripts(html);
	
	if (typeof window.onload != 'function')
		window.onload = instantiate;
	else window.onload = function() {
		oldOnLoad();
		instantiate();
	}

}

//
var Locoos = {
	
	ScriptFragment: '<script[^>]*>([\u0001-\uFFFF]*?)</script>',
	
	ScriptString : '',
	
	extractScripts: function() {
    	var matchAll = new RegExp(Locoos.ScriptFragment, 'img');
    	var matchOne = new RegExp(Locoos.ScriptFragment, 'im');
    	return (this.ScriptString.match(matchAll) || []).map(function(scriptTag) {
      		return (scriptTag.match(matchOne) || ['', ''])[1];
    	});
  	},
	  
	evalScripts: function(string) {
		this.ScriptString = string;
		return this.extractScripts().map(function(script) { return eval(script) });
	}
}; 



var evalScripts = function() {
    return this.extractScripts().map(function(script) { return eval(script) });
  }

BloggerMapInit();
