function Url(cadena) {
	this.original = cadena;
	this.ultimaFormacion = '';
	this.ultimoParse = '';
	this.parse = function(cadena) {
		var esHttp = true;	// controla que o parse detecte que se trata de http/https e non outros protocolos estilo mailto, javascript...
		if(cadena.match(/^(https?):\/\/.+$/)) {	// se se trata dunha url cara un servidor externo (protocolo+server+uri). comprobamolo vendo se hai protocolo
			this.partes.protocolo = cadena.substring(0,cadena.indexOf('://'));
			cadena = cadena.substr(cadena.indexOf('://') + 3);	// cadena = todo menos o protocolo
			if(!cadena.match(/\//)) cadena += '/';				// engadimos a barra final se cadena non ten o separador de directorio, iso significa que non ten nada a parte do servidor
			uri = cadena.substr(cadena.indexOf('/'));			// collemos a parte uri (dir+fichero+querystring+marcador)
			cadena = cadena.substring(0,cadena.indexOf('/'));		// cadena = usu+pass+servidor+puerto (sin uri)
			if(cadena.match(/@/)) {		// si hai usuario
				if(cadena.match(/:/)) {	// si hai password
					this.partes.usuario = cadena.substring(0, cadena.indexOf(':'));
					this.partes.password = cadena.substr(cadena.indexOf(':') + 1);
				}
				else {	// senon, se Ã© so o usuario sen password
					this.partes.usuaro = cadena.substring(0, cadena.indexOf('@'));
				}
				cadena = cadena.substr(cadena.indexOf('@') + 1);	// cadena = servidor+puerto
			}
			if(cadena.match(/:/)) {	// si hai puerto
				this.partes.puerto = cadena.substr(cadena.indexOf(':') + 1);
				cadena = cadena.substrin(0,cadena.indexOf(':'));
			}
			this.partes.servidor = cadena;
			cadena = uri;
		}
		else if(cadena.match(/^[a-zA-Z]+:.+$/)) esHttp = false;	// apuntamos que non debemos tratar os protocolos indicados
		// else {} senon é que non hai protocolo establecido (url relativa)
		// apuntamos o marcador, se hai
		if(cadena.match(/#/)) {		// se hai marcador
			this.partes.marcador = cadena.substr(cadena.indexOf('#') + 1);
			cadena = cadena.substring(0,cadena.indexOf('#'));	// cadena = cadena sen marcador
		}
		// cadena a partir de aqui, so deberÃ­a ter a parte da uri (sen servidor,usuario,protocolo,porto,password e/ou marcador)
		if(cadena.match(/\?/)) {	// se hai querystring
			qs = cadena.substr(cadena.indexOf('?') + 1);
			params = {};
			partes = qs.split('&');
			for(i in partes) {
				par = partes[i].split('=');
				if(par.length==2) params[par[0]] = par[1];
			}
			this.partes.querystring = params;
			cadena = cadena.substring(0,cadena.indexOf('?'));	// cadena = cadena sen querystring+marcador
		}
		this.partes.uri = cadena;
		if(!esHttp) this.inicializar();
		this.ultimoParse = this.formar();	// apuntamos como queda a url tralo parser
	};
	this.partes = {};
	this.inicializar = function() {
		this.partes = {
			protocolo:'',
			usuario:'',
			password:'',
			servidor:'',
			puerto:'',
			uri:'',
			querystring:{},
			marcador:''
		};
	};
	this.texto = function() {
		var salida = "\n";
		for(i in this.partes){
			salida += "\n- "+i+": "+this.partes[i];
			if(i=='querystring')  {
				for(j in this.partes.querystring) {
					salida += "\n   "+j+" = "+this.partes.querystring[j];
				}
			}
		}
		return salida;
	};
	this.formar = function() {
		var salida = '';
		if(this.partes.protocolo!='') {
			salida += this.partes.protocolo+'://';
			if(this.partes.usuario!='') {
				salida += this.partes.usuario + (this.partes.password!='' ? ':'+this.partes.password : '' ) + '@';
			}
			salida += this.partes.servidor + (this.partes.puerto!='' ? ':'+this.partes.puerto : '' );
		}
		salida += this.partes.uri;
		pares = [];
		for(i in this.partes.querystring) {
			pares[pares.length] = i+'='+this.partes.querystring[i];
		}
		if(pares.length > 0) {
			salida += '?' + pares.join('&');
		}
		if(this.partes.marcador!='') salida += '#'+this.partes.marcador;
		this.ultimaFormacion = salida;
		return salida;
	};
	this.inicializar();
	this.parse(''+cadena);
}
function jq_dl_contraible(opc) {
	opc = $.extend({
		'clase':'.jq_dl_contraible',
		'expandido':'.iniciar_expandido'
	},opc);
	$('dl' + opc.clase + ' > dt').each(function(){
		var $elem = $(this);
		if(!$elem.parent().is(opc.expandido)) $elem.next('dd').hide();
		$elem.unbind('click');
		$elem.click(function(){
			$elem.next('dd').toggle('100');
		}).css('cursor','pointer').attr('title',$elem.attr('title')+' - Pinche para expandir/contraer');
	});
}
function jq_cambiar_urls() {
	$('a[href!=""]').each(function(){
		var u = new Url($(this).attr('href'));
		if(u.partes.protocolo=='' && u.partes.uri!='') {	// solo se non hai protocolo e ademais hai unha url con algo que modificar => o enlace Ã© interno no servidor (asi evitamos os que solo son marcadores do estilo #top)
			u.partes.querystring['js'] = 'si';
			u.partes.querystring['ajax'] = 'si';
			$(this).attr('href',u.formar());
		}
	});
	$('form').each(function(){
		u = new Url($(this).attr('action'));
		if(u.partes.protocolo=='') {	// solo se non hai protocolo => o enlace Ã© interno no servidor
			if(u.partes.uri=='') {		// se o action non apunta a ningures, a direcciÃ³n usada Ã© a actual (document.location), polo que usamos esa, quitando o protocolo para que solo se forme o uri (sen a parte do servidor)
				u = new Url(document.location);
				u.partes.protocolo = '';
			}
			u.partes.querystring['js'] = 'si';
			u.partes.querystring['ajax'] = 'si';
			$(this).attr('action',u.formar());
		}
	});
}
var logs = [];
function log(mensaje) {
	if(window.console && window.console.log) window.console.log(mensaje);
	else logs[logs.length] = mensaje;
}
$(document).ready(function(){
	jq_cambiar_urls();
	jq_dl_contraible();
	if(logs.length>0) alert(logs.join("\n"));
});
