/**
 * @author Marco Alionso Ramirez, marco@onemarco.com
 * @url http://onemarco.com
 * This code is public domain
 */

//load and unload the map
//GEvent.addDomListener(window,'load',createMap);
GEvent.addDomListener(window,'unload',GUnload);


//create the marker
function createMarker(map,lat,lng,title,icon,content){
	
	var marker = new GMarker(new GLatLng(lat,lng),{icon:icon});
	marker.tooltip = new Tooltip(marker,jsonToDom(content),5);
	createTab(marker,content);
	marker.isInfoWindowOpen = false;
	
	var sidebarLink = jsonToDom({
		el:'li',ch:[
			{txt:title}
		]});
	//list.appendChild(sidebarLink);
	
	var ttmover = GEvent.callbackArgs(marker,tooltipMouseover,sidebarLink);
	var ttmout = GEvent.callbackArgs(marker,tooltipMouseout,sidebarLink);
	var mclick = GEvent.callback(marker,markerClick);
	
	//GEvent.addDomListener(sidebarLink,'mouseover',ttmover);
	//GEvent.addDomListener(sidebarLink,'mouseout',ttmout);
	//GEvent.addDomListener(sidebarLink,'click',mclick);	
	GEvent.addListener(marker,'mouseover',ttmover);
	GEvent.addListener(marker,'mouseout',ttmout);
	//GEvent.addListener(marker,'click',mclick);
	//GEvent.addListener(marker,'infowindowopen',GEvent.callbackArgs(marker,infoWindowOpen,sidebarLink));
	//GEvent.addListener(marker,'infowindowclose',GEvent.callbackArgs(marker,infoWindowClose,sidebarLink));
	
	map.addOverlay(marker);	
	map.addOverlay(marker.tooltip);
	map.setCenter(marker.getPoint());
	
	return marker;
}

//create the tab(s) for the GInfoWindow
function createTab(marker,content){
	var element = jsonToDom(
		{el:'div',att:{Class:'googleMarkerTab'},ch:[
			{el:'div',att:{Class:'content'},ch:[
				content
			]}
		]});
	marker.tab = [new GInfoWindowTab('Address',element)];
}

//makrer,sidebar mouseover handler
function tooltipMouseover(sidebarLink){
	if(!(this.isInfoWindowOpen) && !(this.isHidden())){
		this.tooltip.show();
	}
}

//marker,sidebar mouseout handler
function tooltipMouseout(sidebarLink){
	this.tooltip.hide();
}

//marker click handler
function markerClick(){
	this.tooltip.hide();
	this.openInfoWindowTabs(this.tab);
}

//infowindowopen handler
function infoWindowOpen(sidebarLink){
	this.isInfoWindowOpen = true;	
}

//infowindowclose handler
function infoWindowClose(sidebarLink){
	this.isInfoWindowOpen = false;
}

//@cc_on IS_IE = true;
//@cc_on IS_LT_IE7 = @_jscript_version < 5.7;

/**
 * @param {Object} e A JSON Object literal representing a DOM node and optionally,
 * its children
 * @return {HTMLElement}
 */
function jsonToDom(e){
	if(null != e.txt) return document.createTextNode(e.txt);
	if(null == e.el) return null;
	var node = document.createElement(e.el.toUpperCase());
	if(null != e.att){
		for(var i in e.att){
			if(IS_IE){		
				node = applyAttribute(node,i,e.att[i]);
			}else{
				applyAttribute(node,i,e.att[i]);
			}
		}
	}
	if(null != e.ch){
		for(var j in e.ch){
			var childNode = jsonToDom(e.ch[j]);
			if(null !== childNode) node.appendChild(childNode);
		}
	}
	return node;
}

/**
 * @param {HTMLElement} node
 * @param {string} attribute
 * @param {string} value
 * @return {HTMLElement}
 */
function applyAttribute(node,attribute,value){
	if(IS_IE){
		return ieApplyAttribute(node,attribute,value);
	}else{
		node.setAttribute(attribute,value);
	}	
}

/**
 * @param {HTMLElement} node
 * @param {String} attribute
 * @param {String} value
 * @return {HTMLElement}
 */
function ieApplyAttribute(node,attribute,value){
	switch(attribute.toLowerCase()){
		case 'for':
			node.htmlFor = value;
			break;
		case 'class':
			node.className = value;
			break;
		case 'style':
			node.style.textCss = value;
			break;
		case 'name':
			node = document.createElement(node.outerHTML.replace(">"," name=" + value + ">"));
			break;
		default:
			node.setAttribute(attribute,value);
	}
	return node;
}

/**
 * @param {HTMLElement} element
 * @param {String} className
 */
function addClassToElement(element, className){
	if((new RegExp('\\b' + className + '\\b')).test(element.className)) return;
	element.className += ' ' + className;
}

/**
 * @param {HTMLElement} element
 * @param {String} className
 */
function removeClassFromElement(element, className){
	element.className = element.className.replace(
		new RegExp('(\\W+)?\\b' + className + '\\b(\\W+)?','g'),' ');
}

/**
 * @param {HTMLElement} node
 */
function clearChildren(node){
	while(node.childNodes.length > 0){
		node.removeChild(node.childNodes[0]);
	}
}

/**
 * @param {Object} args
 */
function argsToArray(args){
	var ret = [];
	for(var i = 0; i < args.length; i++){
		ret.push(args[i]);
	}
	return ret;
}

/**
 * @param {Object} evt
 */
function standardizeEvent(evt){
	if(!evt) evt = window.event;
	if(evt.srcElement) evt.target = evt.srcElement;
	if(!evt.stopPropagation) evt.stopPropagation = function(){this.cancelBubble = true};
	if(!evt.preventDefault) evt.preventDefault = function(){this.returnValue = false;};
	return evt;
}

function createPngElement(src){
	var img = document.createElement('img');
	img.setAttribute('src',src);	
	/*
	if(IS_IE && IS_LT_IE7){
		img.style.visibility = 'hidden';
		var div = document.createElement('div');
		div.appendChild(img);
		div.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + '\',sizingMethod=\'crop\')';
		return div;
	}
	*/
	return img;	
}
