
	function isIExplorer(){
		return navigator.appName.indexOf("Microsoft") != -1;
	}
	
	function isFirefox() {
		return navigator.appName.indexOf("Netscape") != -1;
	}
	
	function thisMovie(movieName) {
	    if (isIExplorer()) {
	        return window[movieName];
	    } else {
	        return document[movieName];
	    }
	}

	/**
	 * Funcion que regresa una coordenada especifica para un lugar
	 */
	function getLatFor ( place ) {
		switch (place) {
			case "mdz":
				return -32.8896684102;
				break;
			
			default:
				return -32.8896684102;
		}
	}
	
	/**
	 * Funcion que regresa una coordenada especifica para un lugar
	 */
	function getLngFor ( place ) {
		switch (place) {
			case "mdz":
				return -68.8446776429;
				break;
			
			default:
				return -68.8446776429;
		}
	}
	
	function isUndefined( value ) {
		try {
			return ((value+'') == 'undefined');
		} catch (e) {
			return false;
		}
	}
	
	// === Returns the bearing in degrees between two points. ===
	// North = 0, East = 90, South = 180, West = 270.
	var degreesPerRadian = 180.0 / Math.PI;

	function bearing( from, to ) {
		/*
		var lat1 = from.latRadians();
		var lon1 = from.lngRadians();
		var lat2 = to.latRadians();
		var lon2 = to.lngRadians();
		
		// Compute the angle.
	    var angle = - Math.atan2( Math.sin( lon1 - lon2 ) * Math.cos( lat2 ), Math.cos( lat1 ) * Math.sin( lat2 ) - Math.sin( lat1 ) * Math.cos( lat2 ) * Math.cos( lon1 - lon2 ) );
	    if ( angle < 0.0 )
		angle  += Math.PI * 2.0;
		
		// And convert result to degrees.
		angle = angle * degreesPerRadian;
		//angle = angle.toFixed(1);
		
		return angle;
		*/
		
		var y = to.lng() - from.lng();
		var x = to.lat() - from.lat();
		var angle;
		
		if (x) angle = Math.atan(y/x);
		else angle = Math.PI;

		angle = angle * degreesPerRadian;

		if (x < 0) angle += 180;
		if (angle > 360) angle -= 360;
		if (angle < 0) angle += 360;
		
		return angle;
    }
    
	// === A function to create the arrow head at the end of the polyline ===
	function arrowHead(from, to, size, point, type) {
		var typeArrow;

		// == obtain the bearing between the last two points
		var dir = bearing(from,to);

		/*
		if (type == 0) typeArrow="sm";
		else if (type == 1) {
			typeArrow="dm"; 
			if (dir > 179) dir -= 180;
		}
		*/
		switch (parseInt(type)) {
			case 0: typeArrow="sm"; break;
			
			case 1: 
				typeArrow="dm"; 
				if (dir > 179) dir -= 180;
				break;
				
			case 3: 
				typeArrow="rm"; 
				break;
		}
		
		// == round it to a multiple of 3 and cast out 120s
		var dir = Math.round(dir/3) * 3;

		size = 15;
		var arrowIcon = new GIcon();
		arrowIcon.iconSize = new GSize(size,size);
		arrowIcon.iconAnchor = new GPoint(size/2, size/2);
		arrowIcon.image = "files/flechas/"+ typeArrow +"/"+ typeArrow +"_"+dir+".png";
		var arrowMarker = new GMarker(point, arrowIcon);
		
		return arrowMarker;
	}
	
	function isIELower7 (){
		return isIExplorer() && !(navigator.appVersion.indexOf("MSIE 7") != -1);
	}

	function buildTransparentImage(src) {
		var image = new Image();
		if(isIELower7 ()){
			image.src = "files/pacontrol/blank.gif";
			image.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='image')";
		} else {
			image.src = src;
		}
		return image;
	}
	
	function makeTransparentImage(image, src) {
		if(isIELower7 ()){
			image.src = "files/pacontrol/blank.gif";
			image.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='image')";
		} else {
			image.src = src;
		}
	}
	
	function makeTransparentBackground(div, src) {
		if(isIELower7 ()){
			div.runtimeStyle.backgroundImage= "none";
			div.runtimeStyle.filter= "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='image')";
		} else {
			div.style.backgroundImage = "url(" + src + ")";
		}
		
	}
	

	/**
	 * Verifica si dos segmentos se intersectan en el plano xy.
	 * Los segmentos estan identificados por A y B de la siguiente forma:
	 * Segmento A = punto a1 y punto a2 => A=(a1x, a1y)-(a2x, a2y)
	 * Segmento B = punto b1 y punto b2 => B=(b1x, b1y)-(b2x, b2y)
	 */
	function seIntersectan(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {
		return (seSolapan(a1x, a2x, b1x, b2x) && seSolapan(a1y, a2y, b1y, b2y));
	}
	
	/**
	 * Identifica si dos segmentos lineales sobre un mismo eje se solapan.
	 * Condiciones, a1 debe ser menor o igual que a2 y b1 debe ser menor o igual que b2);
	 */
	function seSolapan(a1, a2, b1, b2) {
		var swap;
		if (a2 < a1) {
			swap = a2;
			a2 = a1;
			a1 = swap;
		}
		if (b2 < b1) {
			swap = b2;
			b2 = b1;
			b1 = swap;
		}
		return (a1 <= b1 && a2 >= b1) || (b1 <= a1 && b2 >= a1);
	}
	
	/**
	 * Verifica si un plano identificado por dos punto, contiene a otro punto
	 */
	function puntoContenido(southWestLat, southWestLong, northEastLat, northEastLong, pLat, pLong){
		return (northEastLat >= pLat && northEastLong >= pLong && 
			    southWestLat <= pLat && southWestLong <= pLong);
	}
	
	function porArribaAlert(message){
		alert(message);
	}
	
	
	/**
	 * Regresa el valor de una variable que se ha pasado como parametro a la pagina.
	 * Si no existe la variable regresa 'undefined'
	 */
	function getParams() {
		var direccion = new String(self.location);
		var variables = (new String(direccion.split("?")[1])).split("&");
		
		var params = new Object();		// Mapa con nombre de variable y valor
		
		// No hay variables
		if (variables.length == 0) params;
		
		// Crea el mapa con los nombres de variables y valores.
		var i = variables.length;
		while (i--){
			var varValue = variables[i].split("=");
			params[varValue[0]] = varValue[1];
		}
		
		return params;
	}
		
	/**
	 * Convierte un string a integer
	 */
	function strToInt(value) {
		if (isUndefined(value)) return 0;
		if (value == "NaN" || value == "" || value == null) return 0;
		return parseInt(value);
	}
	

	fileLoaded("Utils.js");
	

