﻿var ie = (document.all)? true:false;
var ns = (document.layers)? true:false;
var ns6 = document.getElementById && !document.all; 

// false: IE 7, mozilla, safari, opera 9 , true: IE6, older browsers
var oldBrowser = window.XMLHttpRequest ? false : true;

var IExplore = (navigator.appName == "Microsoft Internet Explorer");
var BrowserVer = parseInt(navigator.appVersion);
var NetScape = (navigator.appName=="Netscape")?1:0;	


function TractaTxt(camp) {
	var rExp = //gi;
	camp.value = camp.value.replace(rExp,"'");
}
	
function replaceCharacters(conversionString,inChar,outChar) {
	var convertedString = conversionString.split(inChar);
	convertedString = convertedString.join(outChar);
	return convertedString;
}
	
function Imprimir() {
	window.print(); 
}
	

// Example: showHideLayers(Layer1,'','show',Layer2,'','hide');
function showHideLayers() { 
  var i, visStr, obj, args = showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) {
    if ((obj = findObj(args[i])) != null) {
      visStr = args[i+2];
      if (obj.style) {
        obj = obj.style;
        if(visStr == 'show') visStr = 'visible';
        else if(visStr == 'hide') visStr = 'hidden';
      }
      obj.visibility = visStr;
    }
  }
}

function showHideLayers2() { 
  var i, visStr, obj, args = showHideLayers2.arguments;
  for (i=0; i<(args.length-2); i+=3) {
    if ((obj = findObj(args[i])) != null) {
      visStr = args[i+2];
      if (obj.style) {
        obj = obj.style;
        if(visStr == 'show') {
			obj.visibility = 'visible';
			obj.display = 'block';
		}
        else if(visStr == 'hide') {
			obj.visibility = 'hidden';
			obj.display = 'none';
		}
      }
    }
  }
}

// Example: obj = findObj("image1");
function findObj(theObj, theDoc)
{
  	var p, i, foundObj;
  
  	if(!theDoc) theDoc = document;
  	if( (p = theObj.indexOf("?")) > 0 && parent.frames.length) {
		theDoc = parent.frames[theObj.substring(p+1)].document;
		theObj = theObj.substring(0,p);
  	}
  	if(!(foundObj = theDoc[theObj]) && theDoc.all) foundObj = theDoc.all[theObj];
  	for (i=0; !foundObj && i < theDoc.forms.length; i++) 
		foundObj = theDoc.forms[i][theObj];
  	for(i=0; !foundObj && theDoc.layers && i < theDoc.layers.length; i++) 
		foundObj = findObj(theObj,theDoc.layers[i].document);
  	if(!foundObj && document.getElementById) foundObj = document.getElementById(theObj);
  
  	return foundObj;
}


function Fixselect(param) {
	if (oldBrowser&&ie) {
		if (param == 1) {
			if (document.all) document.body.className = "fix";		
		} else {
			if (document.all) document.body.className = "";
		}
	}
}


function MM_preloadImages() { //v3.0
  	var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  	var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  	var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  	if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  	for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  	if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
	var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   	if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}


function DoModal(pag, wi, he) {
	var seleccio;	
	var w = 800, h = 600;
	var popW = wi, popH = he;
	
	/* Centrem la finestra a la pantalla */
	if (document.all || document.layers) {
	   w = screen.availWidth;
	   h = screen.availHeight;
	}
	
	var leftPos = (w-popW)/2;
	var topPos = (h-popH)/2;	
			
	winpop = window.open(pag,"Modal","status=0,top=" + topPos + ",left=" + leftPos + ",toolbar=0,scrollbars=no,menubar=0,directories=0,height="+ he + ",width=" + wi);
	if (!winpop.opener)
		winpop.opener = self;
	self.name = "opener";
	winpop.focus();
}
		
//Example: preloadImages('file.gif', 'http://www.x.com/y.gif');
function preloadImages()
{
  if(document.images)
  {
    if(!document.imageArray) document.imageArray = new Array();
    var i,j = document.imageArray.length, args = preloadImages.arguments;
    
    for(i=0; i<args.length; i++)
    {
      if (args[i].indexOf("#")!=0)
      {
        document.imageArray[j] = new Image;
        document.imageArray[j++].src = args[i];
      }
    }
  }
}

// FUNCIONS DE GMAPS
// Objecte GMaps
function Mapa(lat,long,zoom,nom_map) {
	if (!GBrowserIsCompatible()) return;
	
	// ***  Atributs
	this.div_map= null;
	this.map=null;
	this.mgr=null;
	this.contador=0;
	this.gmarkers=[];
	this.grups = [];
	this.i_markers=0;
	this.bounds=null;
	this.mgoverlay=null; //Utilitzat per overlay del cercador
	this.geocoder=new GClientGeocoder(); //Utilitzat per al cercador
	this.zoom_control=new GSmallZoomControl();
	
	this.div_map = document.getElementById(nom_map);
	
	// Inicialitza els atributs
	if (this.div_map) {
		this.map = new GMap2(this.div_map); 
		this.map.setCenter(new GLatLng(lat, long), zoom);
		//window.setTimeout(this.addMarkers, 0);
		this.map.addControl(this.zoom_control);
		this.mgr = new GMarkerManager(this.map);
	}
	
	
	this.addGrup = function(grup) {
		this.grups.push(grup);
	}
	
	// ****  Mètodes
	// Afegeif un marcador en l'array gmarkers
	this.addMark = function(lat, long, text, icona, tipus, nobounds, zoom) {
		var marker = null;
		var posn = new GLatLng(lat, long);
	
		var icon = new GIcon();
		if (icona=='')
			icon.image="/img/google.png";
		else
			icon.image = "/images/"+icona+".jpg";
		
		icon.shadow = "/img/google_shadow.png";
		icon.iconSize = new GSize(20, 34);
		icon.shadowSize = new GSize(40, 34);
		icon.iconAnchor = new GPoint(12, 34);
		icon.infoWindowAnchor = new GPoint(5, 1);
		
		if (!nobounds) {
			if (this.bounds) 
				this.bounds.extend(posn);
			else 
				this.bounds = new GLatLngBounds(posn);
		}
		
		marker = createMarker(posn, text, icon, zoom);
		
		if (tipus!='') {
			this.gmarkers[tipus].push(marker);
		} else {
			this.gmarkers[this.i_markers] = marker;
			this.i_markers++;
		}
	}
	
	// Mostra els icones en el mapa
	this.showMarkers = function() {
		if (this.mgr) {
			for (var i=0; i<this.i_markers; i++)
				this.mgr.addMarker(this.gmarkers[i], 3);
			if (this.bounds && this.gmarkers.length>1) {
				this.map.setCenter(this.bounds.getCenter(), this.map.getBoundsZoomLevel(this.bounds)-1);
			}
			
			this.mgr.refresh();
		}
	}
	
	
	this.addGeocoderToMap = function(response) {
		this.map.clearOverlays();
  		if(!response || response.Status.code != 200) {
			  alert('Adreça no existent o no trobada.');
		  }
		  else {
			  var place = response.Placemark[0];
			  var point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
			  var marker = new GMarker(point);
			  this.map.addOverlay(marker);
			  marker.openInfoWindowHtml(place.address);
		  }
	}
	
	this.Mostra_elements_grup = function (grup, visible) {	
		
		// Recorre els markers del grup per fer-los visibles o amagar-los
		for (var i = 0; i < this.gmarkers[grup].length; i++) {
			var marker = this.gmarkers[grup][i];
			if (visible) {
				marker.show();
				
				if (this.bounds) 
					this.bounds.extend(marker.getPoint());
				else 
					this.bounds = new GLatLngBounds(marker.getPoint());

			} else 
				marker.hide();
		}
		
		// Recorre tots els grups i en funció de si es mostra el marker o no, l'afegeix en els bounds
		var bounds = new GLatLngBounds();
		var marker_zoom = null; // Guarda el zoom de l'últim marker
		for (var j=0; j<this.grups.length; j++) {
			for (var i=0; i<this.gmarkers[this.grups[j]].length; i++) {
				if (!this.gmarkers[this.grups[j]][i].isHidden()) {
					bounds.extend(this.gmarkers[this.grups[j]][i].getPoint());
					marker_zoom = this.gmarkers[this.grups[j]][i].zoom;
				}
			}	
		}
		
		// Comprova que hagi algun marker visible (afegit en els bounds)
		if (!bounds.isEmpty()) {
			// En el cas de que nomésd hi hagi un Marker aplica el zoom especificat en aquest marker
			if (this.grups.length==1&&marker_zoom) {
				this.map.setCenter(bounds.getCenter(), marker_zoom);
			} else {
			// En el cas de que n'hi hagi més de un aplica el zoom per tal que es vegin tots els elements
				this.map.setCenter(bounds.getCenter(), this.map.getBoundsZoomLevel(bounds)-1);
			}
		}
		
		this.mgr.refresh();
	}
}

function MostraElements(mapa,div_mapa) {
	if (GBrowserIsCompatible()) {
		$("#" + div_mapa + " input").each(function (){
			mapa.Mostra_elements_grup($(this).val(),this.checked);
		});
	}
}
							
function createMarker(point, html, icon, zoom) {
	var marker = new GMarker(point, icon);
	marker.zoom = zoom;  // Crea un nou atribut zoom
								// que l'ultilitzarem per recuperar el zoom de l'element en particular
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(unescape(html));
	});
	return marker;
}

/*
function SeleccionaDia (y,m,d) {
	var formocult = window.document.forms['formocult'];
	formocult.data.value = d + '-' + m + '-' + y;
	formocult.calendari.value = '';
	
	var options2 = {
		success:	DiaSel_Retorn, 
		dataType:	'html',
		type: 		'POST'
	};
	
	$(formocult).ajaxSubmit(options2);
}

		
// Funció que s'executa després rebre la resposta del servidor
function DiaSel_Retorn(respostaHTML) {
	$('#Calendari_Dades').html(respostaHTML); 
}

*/

function AmagaSelect(param) {
	//if (document.all) document.body.className = "fix";		
	if ($.browser.msie && oldBrowser) {
		if (param) 
			document.body.className = "fix";	
		else 
			document.body.className = "";
	}
}

//Funcions per marcar dia actiu en el calendari dels portlets

function MarcaDiaCal (y,m,d,MesActual) {
	// Desmarca els dia seleccionat previament
	if ($("#" + MesActual.getFullYear() + "_"+ (MesActual.getMonth()+1) +"_" + MesActual.getDate())) {
		$("#" + MesActual.getFullYear() + "_"+ (MesActual.getMonth()+1) +"_" + MesActual.getDate()).removeClass("diaSeleccionat");
	}
	
	// Marca el dia seleccionat
	if ($("#" + y + "_"+ m +"_" + d)) {
		$("#" + y + "_"+ m +"_" + d).addClass("diaSeleccionat");
	}
}

// Mostra el error en el formulari sota de l'element que ha provocat l'error i s'amaga automàticament
function MostraError(error, element) {
	//Posiciona el Div Error_msg sota de l'element que ha provocat l'error
	$('#Error_msg').css({'left': (element.offset().left)  + 'px'});
	$('#Error_msg').css({'top': (element.offset().top + element.height() + 4) + 'px'});

	// Inserta el missatge d'error i el mostra
	$('#Error_msg').html(error).show();

	//L'amaga despés de x segons
	//setTimeout("$('#Error_msg').BlindUp(200)",2000);
	setTimeout("$('#Error_msg').hide()",3000);
	
	//Posiciona el focus en l'element
	//element.get(0).focus(); 
}


function ValidaForm(form) {
	var valid=true;
	
	$(".formobj",form).each(function() {
		var vali = Validar($(this));
		
		if (valid)
			valid = vali;
	});
	
	return valid;
}

function Validar(obj) {
	var val = obj.val();
	val = $.trim(val);
	
	var classes = obj.attr("class").split(" ");
	for (var i=0; i<classes.length; i++) {
		var tipus = classes[i];
		
		if (tipus=='Req'&&val=="") {
			MostraError(err_txt_blanc, obj); 
			return false;
		}
	
		if (tipus=='NIF'&&val!="") {
			if (!validarNIF(val)) {
				MostraError(err_txt_NIF, obj);
				return false;
			}
		} else if (tipus=='Hora'&&val!="") {
			if (!validarHora(val)) {
				MostraError(err_txt_Hora, obj);
				return false;
			}
		} else if (tipus=='Data'&&val!="") {
			if (!isDate(val,"dd/mm/yyyy")) {
				MostraError(err_txt_Data, obj);
				return false;
			}
		} else if (tipus=='Moneda'&&val!="") {
			if (!isFloat(val)) {
				MostraError(err_txt_Numeric, obj);
				return false;
			}
			if (!NumDecimalsOk(val,decimalPointDelimiter,2)) {
				MostraError(err_txt_Decimals.replace(/%N%/, "2"), obj);
				return false;
			}
		} else if (tipus=='Numeric'&&val!="") {
			if (!isSignedFloat(val)) {
				MostraError(err_txt_Numeric, obj);
				return false;
			}
		} else if (tipus=='Enter'&&val!="") {
			if (!isInteger(val)) {
				MostraError(err_txt_Enter, obj);
				return false;
			}
		} else if (tipus=='Email'&&val!="") {
			if (!isEmail(val)) {
				MostraError(err_txt_Email, obj);
				return false;
			}
		} else if (tipus=='URL'&&val!="") {
			//if (!isInteger(obj.val()))
			//	MostraError(error_txt, obj);
		} else if (tipus=='UTM'&&val!="") {
			if (!isFloat(val)) {
				MostraError(err_txt_Float.replace(/%1%/, decimalPointDelimiter), obj);
				return false;
			}
		} else {
			//alert(obj.val() + " " + tipus);
		}
	}
	
	return true;
}

function validarNIF(val) {
	abc = val;
	dni = abc.substring(0,abc.length-1);
	let = abc.charAt(abc.length-1);
	if (!isNaN(let)) {
	  return false;
	} else {
		cadena="TRWAGMYFPDXBNJZSQVHLCKET";
	  	posicion = dni % 23;
	  	letra = cadena.substring(posicion,posicion+1);
	  	if (letra!=let.toUpperCase()) {
			return false;
	   }
	}
	
	return true;
}

function validarHora(val) {
	// regular expression to match required time format
    var re = /^(\d{1,2}):(\d{2})([ap]m)?$/;

    if(val != '') {
      if(regs = val.match(re)) {
        if(regs[3]) {
          if(regs[1] < 1 || regs[1] > 12) 
            return false;
        } else {
          if(regs[1] > 23)
            return false;      
        }
        if(regs[2] > 59) 
          return false;      
      } else 
        return false;
    }
	
	return true;
}

function NumDecimalsOk(s,delimitador,numerodecimals) {   

	var i = 0;
    while (i<s.length&&s.charAt(i)!=delimitador)
       i++;
    //Elimina el delimitador
	if (i<s.length)
		i++;
		
	if(s.substring(i, s.length).length<=numerodecimals)
		return true
	else
		return false;
}


// Transforma un node XML a texte
function xml2Str(xmlNode)
{
  try {
    // Gecko-based browsers, Safari, Opera.
    return (new XMLSerializer()).serializeToString(xmlNode);
  }
  catch (e) {
    try {
      // Internet Explorer.
      return xmlNode.xml;
    }
    catch (e)
    {//Strange Browser ??
     alert('Xmlserializer not supported');
    }
  }
  return false;
}