/*
Script: URI.js
	Provides methods useful in managing the window location and uris.

	License:
		MIT-style license.

	Authors:
		Sebastian Markb�ge, Aaron Newton
*/

var URI = new Class({

	Implements: Options,

	/*
	options: {
		base: false
	},
	*/

	regex: /^(?:(\w+):)?(?:\/\/(?:(?:([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)?(\.\.?$|(?:[^?#\/]*\/)*)([^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
	parts: ['scheme', 'user', 'password', 'host', 'port', 'directory', 'file', 'query', 'fragment'],
	schemes: { http: 80, https: 443, ftp: 21, rtsp: 554, mms: 1755, file: 0 },

	initialize: function(uri, options){
		this.setOptions(options);
		var base = this.options.base || URI.base;
		uri = uri || base;
		if (uri && uri.parsed)
			this.parsed = $unlink(uri.parsed);
		else
			this.set('value', uri.href || uri.toString(), base ? new URI(base) : false);
	},

	parse: function(value, base){
		var bits = value.match(this.regex);
		if (!bits) return false;
		bits.shift();
		return this.merge(bits.associate(this.parts), base);
	},

	merge: function(bits, base){
		if ((!bits || !bits.scheme) && (!base || !base.scheme)) return false;
		if (base){
			this.parts.every(function(part){
				if (bits[part]) return false;
				bits[part] = base[part] || '';
				return true;
			});
		}
		bits.port = bits.port || this.schemes[bits.scheme.toLowerCase()];
		bits.directory = bits.directory ? this.parseDirectory(bits.directory, base ? base.directory : '') : '/';
		return bits;
	},

	parseDirectory: function(directory, baseDirectory) {
		directory = (directory.substr(0, 1) == '/' ? '' : (baseDirectory || '/')) + directory;
		if (!directory.test(URI.regs.directoryDot)) return directory;
		var result = [];
		directory.replace(URI.regs.endSlash, '').split('/').each(function(dir){
			if (dir == '..' && result.length > 0) result.pop();
			else if (dir != '.') result.push(dir);
		});
		return result.join('/') + '/';
	},

	combine: function(bits){
		return bits.value || bits.scheme + '://' +
			(bits.user ? bits.user + (bits.password ? ':' + bits.password : '') + '@' : '') +
			(bits.host || '') + (bits.port && bits.port != this.schemes[bits.scheme] ? ':' + bits.port : '') +
			(bits.directory || '/') + (bits.file || '') +
			(bits.query ? '?' + bits.query : '') +
			(bits.fragment ? '#' + bits.fragment : '');
	},

	set: function(part, value, base){
		if (part == 'value'){
			var scheme = value.match(URI.regs.scheme);
			if (scheme) scheme = scheme[1];
			if (scheme && !$defined(this.schemes[scheme.toLowerCase()])) this.parsed = { scheme: scheme, value: value };
			else this.parsed = this.parse(value, (base || this).parsed) || (scheme ? { scheme: scheme, value: value } : { value: value });
		} else if (part == 'data') {
			this.setData(value);
		} else {
			this.parsed[part] = value;
		}
		return this;
	},

	get: function(part, base){
		switch(part){
			case 'value': return this.combine(this.parsed, base ? base.parsed : false);
			case 'data' : return this.getData();
		}
		return this.parsed[part] || undefined;
	},

	go: function(){
		document.location.href = this.toString();
	},

	toURI: function(){
		return this;
	},

	getData: function(key, part){
		var qs = this.get(part || 'query');
		if (!$chk(qs)) return key ? null : {};
		var obj = qs.parseQueryString();
		return key ? obj[key] : obj;
	},

	setData: function(values, merge, part){
		if ($type(arguments[0]) == 'string'){ 
			values = this.getData(); 
			values[arguments[0]] = arguments[1]; 
		} else if (merge) {
			values = $merge(this.getData(), values);
		}
		return this.set(part || 'query', Hash.toQueryString(values));
	},

	clearData: function(part){
		return this.set(part || 'query', '');
	}

});

['toString', 'valueOf'].each(function(method){
	URI.prototype[method] = function(){
		return this.get('value');
	};
});


URI.regs = {
	endSlash: /\/$/,
	scheme: /^(\w+):/,
	directoryDot: /\.\/|\.$/
};

URI.base = new URI($$('base[href]').getLast(), { base: document.location });

String.implement({

	toURI: function(options){ return new URI(this, options); }

});



var Site = {
		
	start: function(){
		
		if( $$('.external') ) Site.setExternals($$('.external'));
		if( $$('.texthover') ) Site.overText($$('.texthover'));
		if( $('accordeon_axe') ) Site.showAxe();
		if( $('lexique') || $('carnet-adresses') ) Site.scrollTo();
		
		if( $('ressources')) Site.docs();
		
		Site.fixExplorer();

		var carnet = $$('#carnet-adresses div.carnet_item') || '';
		var carnet_large = $$('#carnet-adresses div.large') || '';
		
		if( carnet!='' && carnet_large=='' ) {

			var height = 0;
			$$('div.carnet_item').each(function(el){
				
				var size = el.getSize();
				if( size.y>height ) height = size.y;
			});
			
			$$('div.carnet_item').setStyle('height', height);
		}
		
		
		if( $('sitemap_list')) {
			$$('#sitemap_list li:first-child').addClass('first-child');
		}
	},
		
	setExternals: function(els){
		els.addEvent('click', function(ev){ window.open(this.href); new Event(ev).stop(); return; });
	},

	fixExplorer: function() {
		$('container').getElements('input[type=radio]').setStyle('border', '0');
		$('container').getElements('input[type=checkbox]').setStyle('border', '0');
		
		$$('textarea').addEvents({
			'focus': function(){ this.addClass('highlight');},
			'blur': function(){ this.removeClass('highlight');}
		});
		
		$$('select').addEvents({
			'focus': function(){ this.addClass('highlight');},
			'blur': function(){ this.removeClass('highlight');}
		});
	},
	
	overText: function(els) {

		els.addEvents({

			'focus': function(){ 
				this.store('defaultvalue', this.value);
				this.value = ''; 
			},
			
			'blur': function(){ 
				if( this.value=='' ) {
					this.value = this.retrieve('defaultvalue');
				}
			}
		});	
	},

	showAxe: function(){

		var myAccordion = new Accordion($('accordeon_axe'), '.toggler', 'div.element', {
			opacity: false,
			alwaysHide: true,
			display: -1,
			onActive: function(toggler, element){
				toggler.getElement('span').set('html', '>> Fermer');
			},
			onBackground: function(toggler, element){
				toggler.getElement('span').set('html', '>> Voir le détail');
			}
		});
		
	},
	
	scrollTo: function(){

		var el = $('liste') || '';
		
		if (el != '') {
			var el_pos = el.getPosition();
			
			el.setStyles({
				'position': 'absolute',
				'top': 15,
				'left': 520
			});
			
			var ss = new ScrollSpy({
			
				min: 200,
				
				onTick: function(position, enters){
					y = position.y + 20;
					el.setStyle('top', y);
				},
				onLeave: function(position, leaves){
					el.setStyle('top', 15);
				},
				container: window
			});
		}
	},
	
	docs: function() {
		var myURI = new URI(document.location.href);
		var fragment = myURI.get('fragment');
		if( $(fragment) ) {
			$(fragment).addClass('selected');
		}
	},
	
	ie6: function() {
		
		var div = new Element('div', {
		    'id': 'message-ie6',
			'class': 'message-ie6',
		    'styles': {
		        'display': 'block',
				'background': '#000',
				'width': '100%',
				'color': '#fff',
				'text-align': 'center',
				'padding': '5px 0 10px 0',
		        'border': '1px solid black'
		    }
		});
		
		var message = new Element('p', {
			'html': 'Vous utilisez actuellement le navigateur Internet Explorer 6. Pour des raisons de sécurité, nous vous conseillons de mettre à jour votre navigateur.<br />Utiliser un navigateur de dernière génération tel que <a href="http://www.microsoft.com/france/windows/ie/" target="_blank" style="color:#fff;text-decoration:underline">Internet Explorer 7</a>, <a href="http://www.mozilla-europe.org/fr/firefox/" target="_blank" style="color:#fff;text-decoration:underline">Firefox</a>, <a href="http://www.opera.com/" target="_blank" style="color:#fff;text-decoration:underline">Opéra</a>, <a href="http://www.apple.com/fr/safari/" target="_blank" style="color:#fff;text-decoration:underline">Safari</a>.',
			'styles': {
				'line-height': '15px'
			}
		});
		
		var close = new Element('a', {
			'html': '&raquo; Fermer ce message',
		    'styles': {
				'color': '#ccc',
				'padding-left': '10px',
				'cursor': 'pointer'
		    },
		    'events': {
		        'click': function(){
		           $('message-ie6').set({'styles': {'display':'none'}});
				   var cookie = Cookie.write('closeMessage', 'ok', {duration: 1});
				   
				   alert(Cookie.read('closeMessage'));
		        }
		    }
		});
		
		message.inject(div);
		close.inject(message);
		
		alert(Cookie.read('closeMessage'));
		
		if (Cookie.read('closeMessage') != 'ok') div.inject($(document.body), 'top');

	}	
	
};

window.addEvent('domready', function(){ Site.start(); });

