function EyeCandies(){}

EyeCandies.HTTP = Class.create();
EyeCandies.HTTP.setLocation =  function(url) {window.location=url;};
EyeCandies.HTTP.setLocationConfirm = function(url,confirmmessage) {if(confirm(confirmmessage)){this.setLocation(url);}};
EyeCandies.HTTP.refuseAccess= function(refusemessage) {alert(refusemessage); return false;};

EyeCandies.Cookie = Class.create();

EyeCandies.Cookie.Jar = Class.create({

	/**
	 * Append before all cookie names to differentiate them.
	 */
	appendString: "_gfw_",

	/**
	 * Initializes the cookie jar with the options.
	 */
	initialize: function(options) {
		this.options = {
			expires: 3600,		// seconds (1 hr)
			path: '',			// cookie path
			domain: '',			// cookie domain
			secure: ''			// secure ?
		};
		Object.extend(this.options, options || {});

		if (this.options.expires != '') {
			var date = new Date();
			date = new Date(date.getTime() + (this.options.expires * 1000));
			this.options.expires = '; expires=' + date.toGMTString();
		}
		if (this.options.path != '') {
			this.options.path = '; path=' + escape(this.options.path);
		}
		if (this.options.domain != '') {
			this.options.domain = '; domain=' + escape(this.options.domain);
		}
		if (this.options.secure == 'secure') {
			this.options.secure = '; secure';
		} else {
			this.options.secure = '';
		}
	},

	/**
	 * Adds a name values pair.
	 */
	put: function(name, value) {
		name = this.appendString + name;
		cookie = this.options;
		var type = typeof value;
		switch(type) {
		  case 'undefined':
		  case 'function' :
		  case 'unknown'  : return false;
		  case 'boolean'  : 
		  case 'string'   : 
		  case 'number'   : value = String(value.toString());
		}
		var cookie_str = name + "=" + escape(Object.toJSON(value));
		try {
			document.cookie = cookie_str + cookie.expires + cookie.path + cookie.domain + cookie.secure;
		} catch (e) {
			return false;
		}
		return true;
	},

	/**
	 * Removes a particular cookie (name value pair) form the Cookie Jar.
	 */
	remove: function(name) {
		name = this.appendString + name;
		cookie = this.options;
		try {
			var date = new Date();
			date.setTime(date.getTime() - (3600 * 1000));
			var expires = '; expires=' + date.toGMTString();
			document.cookie = name + "=" + expires + cookie.path + cookie.domain + cookie.secure;
		} catch (e) {
			return false;
		}
		return true;
	},

	/**
	 * Return a particular cookie by name;
	 */
	get: function(name) {
		name = this.appendString + name;
		var cookies = document.cookie.match(name + '=(.*?)(;|$)');
		if (cookies) {
			return (unescape(cookies[1])).evalJSON();
		} else {
			return null;
		}
	},

	/**
	 * Empties the Cookie Jar. Deletes all the cookies.
	 */
	empty: function() {
		keys = this.getKeys();
		size = keys.size();
		for(i=0; i<size; i++) {
			this.remove(keys[i]);
		}
	},

	/**
	 * Returns all cookies as a single object
	 */
	getPack: function() {
		pack = {};
		keys = this.getKeys();

		size = keys.size();
		for(i=0; i<size; i++) {
			pack[keys[i]] = this.get(keys[i]);
		}
		return pack;
	},

	/**
	 * Returns all keys.
	 */
	getKeys: function() {
		keys = $A();
		keyRe= /[^=; ]+(?=\=)/g;
		str  = document.cookie;
		CJRe = new RegExp("^" + this.appendString);
		while((match = keyRe.exec(str)) != undefined) {
			if (CJRe.test(match[0].strip())) {
				keys.push(match[0].strip().gsub("^" + this.appendString,""));
			}
		}
		return keys;
	}
});

EyeCandies.Form = Class.create();

EyeCandies.Form.ExpandBar = Class.create({
	initialize: function(name,forcedStatus)
	{
		this.cookieName='EyeCandies.Form.ExpandBar';
		this.jar = new EyeCandies.Cookie.Jar({expires:3600,   path: '/'});
		this.name=name;
		
		this.formElement = $$('form[name='+name+'].gfw-form').first();
		this.mainPanelElement  = this.formElement.select('table.gfw-form-mainpanel').first();

		if(!Object.isUndefined(this.formElement) && !Object.isUndefined(this.mainPanelElement))
		{
			this.iconPath='/src/images/icons';
			this.iconExpandOpenUrl=this.iconPath+'/'+'24/gfw-form-expandbar-btn-open.png';
			this.iconExpandCloseUrl=this.iconPath+'/'+'24/gfw-form-expandbar-btn-close.png';


			if(Object.isElement(this.formElement))
			{
				if(!Object.isUndefined(this.mainPanelElement))
				{
					this.expandBarElement = this.mainPanelElement.select('.gfw-form-expandbar').first();
					this.expandBarButton = this.expandBarElement.select('img.gfw-form-expandbar-icon').first();
					this.expandBarElement.observe('click', function(event){
						this.toggleDisplay(event.element());
					}.bindAsEventListener(this));
				}
			}
			
			this.status='expanded';
			var savedStatus = this.loadStatus();
			if(savedStatus!=null) 	this.status=savedStatus;
			if(forcedStatus=='expanded') 	this.expand();
			if(forcedStatus=='shrinked') 		this.shrink();

			
			
			this.refresh();
		}
	},
	toggleDisplay: function(element)
	{
		if(this.status=='expanded') 	this.shrink(element);
		else											this.expand(element);
	},
	expand: function(element)
	{
		this.status='expanded';
		this.saveStatus();
		this.refresh();
	},
	shrink: function(element)
	{
		this.status='shrinked';
		this.saveStatus();
		this.refresh();
	},
	saveStatus: function()
	{
		var storageRoot=this.getStorage();
		if(typeof storageRoot.expandBars[this.name]!='object') storageRoot.expandBars[this.name]=new Object();
		storageRoot.expandBars[this.name].status=this.status;
		this.jar.put(this.cookieName, storageRoot);
	},
	loadStatus: function()
	{
		var storageRoot=this.getStorage();
		if(typeof storageRoot=='object' && typeof storageRoot.expandBars=='object' && typeof storageRoot.expandBars[this.name]=='object')
		{
			return storageRoot.expandBars[this.name].status;
		}
		else return 'expanded';
	},
	getStorage: function()
	{
		var storageRoot = this.jar.get(this.cookieName);
		if(typeof storageRoot !='object' || storageRoot==null) storageRoot=new Object();
		if(typeof storageRoot.expandBars !='object' || storageRoot.expandBars==null) storageRoot.expandBars=new Object();
		return storageRoot;
	},
	refresh: function()
	{
		if(this.status=='expanded')
		{
			this.expandBarButton.src=this.iconExpandCloseUrl;
			this.formElement.select('table.gfw-form-mainpanel tbody').each(function(element){
				element.removeClassName('gfw-shrinked');
			});			
		}
		else
		{
			this.expandBarButton.src=this.iconExpandOpenUrl;
			this.formElement.select('table.gfw-form-mainpanel tbody').each(function(element)
			{
				if(!element.hasClassName('gfw-noshrink')) element.addClassName('gfw-shrinked');
				else element.removeClassName('gfw-shrinked');
			});
		}
	}
});

EyeCandies.Form.Filler=Class.create(
{
	initialize: function(args)
	{
		if(typeof(args.formId)!='undefined') this.form = $(args.formId);
		if(args.usePrefix!==false) this.prefix = this.form.name+'_';
		else this.prefix = '';
	},
	fillFormUsingObject: function (map,data)
	{
		this.data = data;
		if(map && typeof(map)=='object' && this.data && typeof(this.data)=='object' && this.form)
		{
			$H(map).each(function(pair) {this.fillField(pair);},this);
		}
	},
	fillField: function(pair)
	{
		var key = this.prefix + pair.key;
		var value = this.data[pair.value];
		if(this.form)
		{
			var elements = this.form.getElements();
			if(this.form[key] && typeof(value)!='undefined' && elements)
			{
				var element = elements.find(function(elt)	{return elt.name==key;});
				if(element)
				{
					if(element.getValue()!=value)
					{
						element.setValue(value);
						this.fireEvent(element,'change');
					}
				}
			}
		}
	},
	fireEvent: function(element,event)
	{
	    if (document.createEventObject){
	        // dispatch for IE
	        var evt = document.createEventObject();
	        return element.fireEvent('on'+event,evt)
	    }
	    else{
	        // dispatch for firefox + others
	        var evt = document.createEvent("HTMLEvents");
	        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
	        return !element.dispatchEvent(evt);
	    }
	}
});

EyeCandies.Form.Getter=Class.create(
{
	initialize: function(args)
	{
		if(typeof(args.formId)!='undefined') this.form = $(args.formId);
		if(args.usePrefix!==false) this.prefix = this.form.name+'_';
		else this.prefix = '';
	},
	getFormValuesAsObject: function (array)
	{
		if(this.form)
		{
			this.data={};
			if(array)
			{
				for (var i = 0, len = array.length; i < len; ++i)
				{
					var value = array[i];
					this.data[value]=this.getFieldValue(value);
				}
			}
			else
			{
				// Implémenter la récupération de toutes les données du formulaire si aucune map n'est passée en parametre en enlevant le préfixe.
			}
		}
		return this.data;
	},
	getFormElementsAsObject: function (array)
	{
		if(this.form)
		{
			this.data={};
			if(array)
			{
				for (var i = 0, len = array.length; i < len; ++i)
				{
					var value = array[i];
					this.data[value]=this.getField(value);
				}
			}
			else
			{
				// Implémenter la récupération de toutes les données du formulaire si aucune map n'est passée en parametre en enlevant le préfixe.
			}
		}
		return this.data;
	},
	getField: function(key)
	{
		var key = this.prefix + key;
		if(this.form)
		{
			var elements = this.form.getElements();
			if(this.form[key] && elements)
			{
				var element = elements.find(function(elt){return elt.name==key;});
				if(element)
				{
					return element;
				}
			}
			else return false;
		}
		else return false;
	},
	getFieldValue: function(key)
	{
		var field = this.getField(key);
		if(field) return field.getValue();
		else return false;
	}
});

EyeCandies.Form.Updater=Class.create({	
	initialize: function(args)
	{
		if(typeof(args.formId)!='undefined') this.form = $(args.formId);
		this.formId=args.formId;
		this.form.name+'_';
		this.watchFields = [];
		if(args.watchFields) this.watchFields=args.watchFields;
		if(args.saveButtonId)  this.saveButtonElement = $(args.saveButtonId);
		this.url=false;
		if(args.url!==false)  this.url = args.url;
		var urlQueryStringParameters={};
		if(this.url) 
		{
			urlQueryStringParameters = this.url.parseQuery(); // Paramètres qui se trouvent dans la query string de l'url.
			if(this.url.indexOf('?')!=-1)		this.url = this.url.substr(0,this.url.indexOf('?')); // Nettoyage de l'url
		}
		this.urlParameters=$H();
		if(args.urlParameters)  this.urlParameters = $H(args.urlParameters);
		this.urlParameters=this.urlParameters.merge(urlQueryStringParameters);
		this.lastValue=this.getCurrentValue();
		this.addObservers();
	},
	showSaveButton: function()
	{
		if(this.saveButtonElement) Effect.Appear(this.saveButtonElement);
	},
	hideSaveButton: function()
	{
		if(this.saveButtonElement) Effect.Fade(this.saveButtonElement);
	},
	hasChanged: function()
	{
		if(this.getCurrentValue()!=this.lastValue) return true;
		else return false;
	},
	checkForChange: function()
	{
		if(this.hasChanged()) this.showSaveButton();
	},
	getCurrentValue: function()
	{
		var formGetter = new EyeCandies.Form.Getter({formId: this.formId});
		var fields = formGetter.getFormValuesAsObject(this.watchFields);
		return $H(fields).values().join(':');
	},
	addObservers: function()
	{
		var formGetter = new EyeCandies.Form.Getter({formId: this.formId});
		var fields = formGetter.getFormElementsAsObject(this.watchFields);
		$H(fields).each(function(pair){pair.value.observe('change',function(){ this.checkForChange();}.bindAsEventListener(this));}.bind(this));
		if(this.saveButtonElement && this.url!==false)
		{
			this.saveButtonElement.observe('click',function()
			{
				var formGetter = new EyeCandies.Form.Getter({formId: this.formId});
				var values = formGetter.getFormValuesAsObject(this.watchFields);
				var parameters = this.urlParameters.merge(values);
				new Ajax.Request(this.url, {
					parameters: parameters,
					onSuccess: function(response) 	{	this.hideSaveButton(); this.lastValue=this.getCurrentValue();}.bind(this),
					onFailure: function(response) {alert(response.responseText);}
				});
			}.bindAsEventListener(this));
		}
	}
});

EyeCandies.Util = Class.create();
EyeCandies.Util.insertAtCaret = function(field, string)
{
	field.focus();
	if(typeof(document.selection) != 'undefined') //IE
	{
		var range = document.selection.createRange();
		if (range.parentElement() != field) return;
		range.text = string;
		range.select();
	}
	else if (typeof(field.selectionStart) != 'undefined')
	{
		var start = field.selectionStart;
		field.value = field.value.substr(0, start)+string+field.value.substr(field.selectionEnd, field.value.length);
		start += string.length;
		field.setSelectionRange(start, start);
	}
	else	field.value += string;
	field.focus();
}

EyeCandies.getElementsByClass = function(searchClass,node,tag) 
{
	var classElements = new Array();
	if ( node == null )
	node = document;
	if ( tag == null )
	tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

EyeCandies.checkAllByClass = function(c,parentnode,nodetype)
{
	var parentnode=parentnode;
	if(parentnode==null) parentnode=document;
	if(nodetype==null) nodetype='input';
	
	var elements = EyeCandies.getElementsByClass(c,parentnode,nodetype);
	if(elements!=null)
	{
		for(var i = 0; i<elements.length; i++)
		{
			elements[i].checked=true;
		}
	}
}

EyeCandies.uncheckAllByClass = function(c,parentnode,nodetype)
{
	var parentnode=parentnode;
	if(parentnode==null) parentnode=document;
	if(nodetype==null) nodetype='input';
	
	var elements = EyeCandies.getElementsByClass(c,parentnode,nodetype);
	if(elements!=null)
	{
		for(var i = 0; i<elements.length; i++)
		{
			elements[i].checked=false;
		}
	}
}

EyeCandies.checkToggleByClass = function(c,parentnode,nodetype)
{
	var parentnode=parentnode;
	if(parentnode==null) parentnode=document;
	if(nodetype==null) nodetype='input';
	
	var elements = EyeCandies.getElementsByClass(c,parentnode,nodetype);
	if(elements!=null)
	{
		for(var i = 0; i<elements.length; i++)
		{
			if(elements[i].checked==true)
			{
				elements[i].checked=false;
			}
			else
			{
				elements[i].checked=true;
			}
		}
	}
}

EyeCandies.toggleHidableBySelector = function(selector)
{
	$$(selector).each(function(container)
	{
		container.select('.gfw-hidable').each(function(hidable){hidable.toggle();});
	});
}

EyeCandies.checkBySelector = function(selector)
{
	$$(selector).each(function(elt)
	{
		if(elt.visible())
		{
			elt.checked=true;
		}
	});
}

EyeCandies.uncheckBySelector = function(selector)
{
	$$(selector).each(function(elt)
	{
		if(elt.visible())
		{
			elt.checked=false;
		}
	});
}

EyeCandies.checkToggleBySelector = function(selector)
{
	$$(selector).each(function(elt)
	{
		if(elt.visible())
		{
			if(elt.checked==true) elt.checked=false;
			else								elt.checked=true;
		}
	});
}

EyeCandies.checkAllByName = function(n)
{
	var elements = document.getElementsByName(n);
	if(elements!=null)
	{
		for(var i = 0; i<elements.length; i++)
		{
			elements[i].checked=true;
		}
	}
}

EyeCandies.uncheckAllByName = function(n)
{
	var elements = document.getElementsByName(n);
	if(elements!=null)
	{
		for(var i = 0; i<elements.length; i++)
		{
			elements[i].checked=false;
		}
	}
}

EyeCandies.checkToggleByName = function(n)
{
	var elements = document.getElementsByName(n);
	if(elements!=null)
	{
		for(var i = 0; i<elements.length; i++)
		{
			if(elements[i].checked==true)
			{
				elements[i].checked=false;
			}
			else
			{
				elements[i].checked=true;
			}
		}
	}
}

EyeCandies.Center = function(element)
{
    try
    {
        element = $(element);
    }
    catch(e)
    {
        return;
    }

    var my_width  = 0;
    var my_height = 0;

    if ( typeof( window.innerWidth ) == 'number' )
    {

        my_width  = window.innerWidth;
        my_height = window.innerHeight;
    }
    else if ( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
    {

        my_width  = document.documentElement.clientWidth;
        my_height = document.documentElement.clientHeight;
    }
    else if ( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
    {

        my_width  = document.body.clientWidth;
        my_height = document.body.clientHeight;
    }

    element.style.position = 'absolute';
    //element.style.display  = 'block';
    element.style.zIndex   = 99;

    var scrollY = 0;

    if ( document.documentElement && document.documentElement.scrollTop )
    {
        scrollY = document.documentElement.scrollTop;
    }
    else if ( document.body && document.body.scrollTop )
    {
        scrollY = document.body.scrollTop;
    }
    else if ( window.pageYOffset )
    {
        scrollY = window.pageYOffset;
    }
    else if ( window.scrollY )
    {
        scrollY = window.scrollY;
    }

    var elementDimensions = Element.getDimensions(element);

    var setX = ( my_width  - elementDimensions.width  ) / 2;
    var setY = ( my_height - elementDimensions.height ) / 2 + scrollY;

    setX = ( setX < 0 ) ? 0 : setX;
    setY = ( setY < 0 ) ? 0 : setY;

    element.style.left = setX + "px";
    element.style.top  = setY + "px";

}

EyeCandies.getImageSize = function (img)
{
	if(img!=null && typeof(img)=='object')
	{
		// Sauvegarde de l'état original de l'image
		var restoreDisplay=false;
		var restoreVisibility=false;
		var originalPosX=img.style.left;
		var originalPosY=img.style.top;
		var originalPosition=img.style.position;
		if(img.style.visibility=='hidden' || img.style.display=='none')
		{
			// Déplacement hors du champ visuel
			img.style.position='absolute';
			img.style.left='-10000px';
			img.style.top='-10000px';

			// On rend l'image visible
			if(img.style.visibility=='hidden')
			{
				img.style.visibility='visible';
				restoreVisibility=true;
			}
			if(img.style.display=='none')
			{
				img.style.display='block';
				restoreDisplay=true;
			}
			// On récupère ses dimensions
			var imageWidth = img.offsetWidth;
			var imageHeight = img.offsetHeight;
		
			// On restaure l'état original de l'image
			if(restoreVisibility)
			{
				img.style.visibility=='hidden';
			}
			if(restoreDisplay)
			{
				img.style.display='none';
			}
			img.style.left=originalPosX;
			img.style.top=originalPosY;
			img.style.position=originalPosition;
			return [imageWidth,imageHeight];
		}
		else
		{
			var imageWidth = img.offsetWidth;
			var imageHeight = img.offsetHeight;
			return [imageWidth,imageHeight];
		}
	}
}

// Uses Prototype 1.6
EyeCandies.TooltipManager = Class.create();
EyeCandies.TooltipManager.prototype =
{
	initialize: function(classname)
	{
		this.classname=classname;
		this.createTooltips();
	},
	createTooltips: function()
	{
		var elements = document.getElementsByClassName(this.classname);
		for (var i=0; i<elements.length; i++)
		{
			new EyeCandies.Tooltip(elements[i]);
		}
	}
};

// Uses Prototype 1.6	
EyeCandies.Tooltip = Class.create();
EyeCandies.Tooltip.prototype =
{
	initialize: function(elt)
	{
		this.options =  {delta_x: 10, delta_y: 10};
		this.trigger=elt;
		this.tooltip = this.trigger.getElementsByClassName('tooltip')[0];
		this.decorateTooltip();
		this.decorateTrigger();
		this.hideTooltip();
		this.eventMouseOver = this.showTooltip.bindAsEventListener(this);
		this.eventMouseOut = this.hideTooltip.bindAsEventListener(this);
		this.registerEvents();
		
	},
	destroy: function() 
	{
		Event.stopObserving(this.trigger, "mouseover", this.eventMouseOver);
		Event.stopObserving(this.trigger, "mouseout", this.eventMouseOut);
	},
	registerEvents: function() 
	{
		Event.observe(this.trigger, "mouseover", this.eventMouseOver);
		Event.observe(this.trigger, "mouseout", this.eventMouseOut);
	},
	decorateTrigger: function()
	{
		this.trigger.style.cursor='help';
	},
	decorateTooltip: function()
	{
		this.tooltip.style.border='1px dashed #ccc'; 
		this.tooltip.style.position='absolute';
		this.tooltip.style.padding= '2px';
		this.tooltip.style.backgroundColor= '#fffacd';
		this.tooltip.style.zindex= '1000';
	},
	hideTooltip: function(event)
	{
		this.tooltip.hide();
		if(this.currentTimeout)
		{
			window.clearTimeout(this.currentTimeout);
		}
	},
	showTooltip: function(event)
	{
		Event.stop(event);
		// get Mouse position
		var mouse_x = Event.pointerX(event);
		var mouse_y = Event.pointerY(event);
		// decide if we need to switch sides for the tooltip
		var dimensions = this.tooltip.getDimensions();
		var element_width = dimensions.width;
		var element_height = dimensions.height;
		if ( (element_width + mouse_x) >= ( EyeCandies.getWindowWidth() - this.options.delta_x) )
		{
			mouse_x = mouse_x - element_width;
			mouse_x = mouse_x - this.options.delta_x;
		} 
		else mouse_x = mouse_x + this.options.delta_x;
		if ( (element_height + mouse_y) >= ( EyeCandies.getWindowHeight() - this.options.delta_y) )
		{
			mouse_y = mouse_y - element_height;
			mouse_y = mouse_y - this.options.delta_y;
		} 
		else mouse_y = mouse_y + this.options.delta_y;
		this.tooltip.setStyle({ position:'absolute', top:mouse_y + "px", left:mouse_x + "px",zindex:this.options.zindex});
		//this.tooltip.show();
		//EyeCandies.Tooltip.currentObj=this; // sauvegarde de l'objet courant pour IE
		this.currentTimeout = Element.show.delay(1,this.tooltip);
	}
};

EyeCandies.AutoHider = Class.create();
EyeCandies.AutoHider.prototype= 
{
	initialize: function(containerClass,contentClass)
	{
		this.containerClass=containerClass;
		this.contentClass=contentClass;
		this.autoHide();
	},
	autoHide: function()
	{
		if(this.containerClass && this.contentClass)
		{
			var containerClassSelector='.'+this.containerClass;
			var contentClassSelector='.'+this.contentClass;
			$$(containerClassSelector).each(
				function(elt)
				{
					var contentArray = elt.select(contentClassSelector);
					var show=false;
					if(contentArray.length>0)
					{
						for (var index = 0, len = contentArray.length; index < len; ++index) 
						{
								var content = contentArray[index];
								var text = content.cleanWhitespace().innerHTML;
							if(!text.empty() && text!="0" && text!="0.00" && text!="false")  {show=true; break; }
						}
					}
					if(show==false) elt.hide();
				}
			);
		}
	}
}

EyeCandies.getWindowHeight = function()  
{    
	if (navigator.appVersion.indexOf('MSIE')>0) 	return document.body.clientHeight;    
	else 																		return window.innerHeight;
}

EyeCandies.getWindowWidth = function()
{
	if (navigator.appVersion.indexOf('MSIE')>0) 	return document.body.clientWidth;
	else 																		return window.innerWidth;
}

EyeCandies.getCookie = function(name) 
{
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) return null;
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ';', len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}

EyeCandies.setCookie = function(name, value, expires, path, domain, secure) 
{
	var today = new Date();
	today.setTime( today.getTime() );
	if(expires) expires = expires * 1000 * 60 * 60 * 24;
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+'='+escape( value ) +  ( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) +  ( ( path ) ? ';path=' + path : '' ) +  ( ( domain ) ? ';domain=' + domain : '' ) +  ( ( secure ) ? ';secure' : '' );
}

EyeCandies.deleteCookie = function (name, path, domain) 
{
	if ( getCookie( name ) ) document.cookie = name + '=' + ( ( path ) ? ';path=' + path : '') + ( ( domain ) ? ';domain=' + domain : '' ) + ';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}

EyeCandies.ResizingTextAreaManager = Class.create();
EyeCandies.ResizingTextAreaManager.prototype =
{
	initialize: function(classname)
	{
		this.classname=classname;
		this.createResizingTextAreas();
	},
	createResizingTextAreas: function()
	{
		var elements = document.getElementsByClassName(this.classname);
		for (var i=0; i<elements.length; i++)
		{
			new EyeCandies.ResizingTextArea(elements[i]);
		}
	}
};

EyeCandies.ResizingTextArea = Class.create();
EyeCandies.ResizingTextArea.prototype = 
{
    defaultRows: 1,
    initialize: function(field)
    {
        this.defaultRows = Math.max(field.rows, 1);
        this.resizeNeeded = this.resizeNeeded.bindAsEventListener(this);
        Event.observe(field, "click", this.resizeNeeded);
        Event.observe(field, "keyup", this.resizeNeeded);
    },
    resizeNeeded: function(event)
    {
        var t = Event.element(event);
        var lines = t.value.split('\n');
        var newRows = lines.length;
        var oldRows = t.rows;
        for (var i = 0; i < lines.length; i++)
        {
            var line = lines[i];
            if (line.length >= t.cols) newRows += Math.floor(line.length / t.cols);
        }
        if (newRows > t.rows) t.rows = newRows;
        if (newRows < t.rows) t.rows = Math.max(this.defaultRows, newRows);
    }
}

EyeCandies.CheckboxAutochecker = Class.create({
	initialize: function(elementId)
	{
		this.elementId=elementId;
		this.init();
	},
	init: function()
	{
		this.started=false;
		this.checked=false;
		this.firstTarget=null;
		this.el=null;
		this.el=$(this.elementId);
		if(this.el) this.el.observe('mousedown',this.checkInit.bindAsEventListener(this));
	},
	checkInit: function(evt)
	{
		evt = evt || window.event;
		this.firstTarget = $(evt.srcElement || evt.target);
		if(this.firstTarget && this.firstTarget.nodeType == 1 && this.firstTarget.type == 'checkbox' && !this.started)
		{
			this.checked = !this.firstTarget.checked;
			this.firstTarget.observe('mouseout',
			function(evt)
						{
							this.checkFirst(evt);
						}.bindAsEventListener(this));
			this.el.observe('mouseup',this._stop.bindAsEventListener(this));
			this._start();
		}
	},
	checkFirst: function(evt)
	{
		this.firstTarget.checked = this.checked;
	},
	toggleCheckbox: function(e)
	{
		e = e || window.event;
		var target = e.srcElement || e.target;
		if(target && target.nodeType == 1 && target.type == 'checkbox') target.checked = this.checked;
	},
	 _start: function()
	{
		this.started = true;
		this.el.observe('mouseover',this.toggleCheckbox.bindAsEventListener(this));
	},
	_stop: function(e)
	{
		e = e || window.event;
		var target = e.srcElement || e.target;
		if(target === this.firstTarget)
		{
			target.checked = !this.checked;
		}
		this.started = false;
		this.el.stopObserving('mouseup');
		this.el.stopObserving('mouseover');
		this.firstTarget.stopObserving('mouseout');
	},
	start: function()
	{
		this.init();
	},
	stop: function()
	{
		this.el.stopObserving('mousedown');
	}
});

function checkAllByClass(c)
{
	var elements = $$('input.'+c);
	if(elements!=null)
	{
		for(var i = 0; i<elements.length; i++)
		{
			var element = elements[i];
			element.checked=true;
		}
	}
}

function uncheckAllByClass(c)
{
	var elements = $$('input.'+c);
	if(elements!=null)
	{
		for(var i = 0; i<elements.length; i++)
		{
			var element = elements[i];
			element.checked=false;
		}
	}
}

function checkToggleByClass(c)
{
	var elements = $$('input.'+c);
	if(elements!=null)
	{
		for(var i = 0; i<elements.length; i++)
		{
			var element = elements[i];
			if(element.checked==true)
			{
				element.checked=false;
			}
			else
			{
				element.checked=true;
			}
		}
	}
}

function getCheckedOption(ar)
{
	if(ar==null) return false;
	ar = document.getElementsByName(ar);
	for(var i=0; i<ar.length; i++)
	{
		if(ar[i].checked==true)
		{
			return [i,ar[i]];
		}
	}
	return false;
}

function highlightRow(rowName,color)
{
	var rows = document.getElementsByName(rowName);
	var row = rows[0];
	if(row!=null)
	{
		for(var i =0; i< row.cells.length; i++)
		{
			row.cells[i].style.backgroundImage='none';
			row.cells[i].style.backgroundColor=color;
		}
	}
}

function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)    {     curleft += obj.offsetLeft;      obj = obj.offsetParent;   }
	}
	else if (obj.x)   curleft += obj.x;
		return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)    {     curtop += obj.offsetTop;      obj = obj.offsetParent;   }
	}
	else if (obj.y)   curtop += obj.y;
	return curtop;
}

function showElement(elementID,baseElementID,w,h)
{
	var baseElement = document.getElementById(baseElementID);
	var elt = document.getElementById(elementID);
	if(baseElement!=null && elt!=null)
	{
		imageWidth = baseElement.offsetWidth;
		imageHeight = baseElement.offsetHeight;
		elt.style.left=findPosX(baseElement)+(imageWidth/2)-(w/2)+'px';
		elt.style.top=findPosY(baseElement) + imageHeight/2 -(h/2) +'px';
		new Effect.Appear(elt);
		new Draggable(elt,{revert:false});
	}
}

function showElementWithHandle(elementID,baseElementID,handleId,w,h)
{
	var baseElement = document.getElementById(baseElementID);
	var elt = document.getElementById(elementID);
	if(baseElement!=null && elt!=null)
	{
		imageWidth = baseElement.offsetWidth;
		imageHeight = baseElement.offsetHeight;
		elt.style.left=findPosX(baseElement)+(imageWidth/2)-(w/2)+'px';
		elt.style.top=findPosY(baseElement) + imageHeight/2 -(h/2) +'px';
		new Effect.Appear(elt);
		new Draggable(elt,{revert:false, handle:handleId});
	}
}

function ShakeIt(eltID)
{
	new Effect.Shake(eltID,{duration: 2.0});
	new Effect.Highlight(eltID,{duration: 2.0, startcolor:'#ffffff', endcolor:'#ff8800'});
}

function toggleVisibilitySlide(detectId,expandId,openId,closeId)
{
	SlideDur = 0.2 // Panel slide duration

	detectId = $(detectId); // So we can detect if the panel is currently visible or not before we run the condition
	expandId = $(expandId); // The panel we want to expand
	openId = $(openId); // The element we click on to open a panel, in this case the plus icon
	closeId = $(closeId); // The element we click on to close a panel, in this case the plus icon
	if(detectId.visible(detectId))
	{
		openId.style.display='block';
		closeId.style.display='none';
		new Effect.SlideUp(expandId,{duration:SlideDur });
	}
	else
	{
		openId.style.display='none';
		closeId.style.display='block';
		new Effect.SlideDown(expandId,{duration:SlideDur});
	}
}

function toggleVisibilitySlideByClass(detectId,elementClass,openId,closeId)
{
	SlideDur = 0.2 // Panel slide duration
	
	detectId = $(detectId); // So we can detect if the panel is currently visible or not before we run the condition
	openId = $(openId); // The element we click on to open a panel, in this case the plus icon
	closeId = $(closeId); // The element we click on to close a panel, in this case the plus icon
	var show=true;
	if(detectId.style.display=='none')
	{
		openId.style.display='block';
		closeId.style.display='none';
		show=true;
	}
	else
	{
		openId.style.display='none';
		closeId.style.display='block';
		show=false;
	}
	var elements = $$('.'+elementClass);
	if(elements!=null && elements.length>0)
	{
		for(var i =0; i<elements.length;i++)
		{
			expandId=elements[i];
			if(expandId!=null)
			{
				if(show)
				{
					new Effect.SlideUp(expandId,{duration:SlideDur });
				}
				else
				{
					new Effect.SlideDown(expandId,{duration:SlideDur});
				}
			}
		}
	}
}

function fitSquare(img,newsize)
{
	if(newsize==0)
	{
		newsize=64;
	}
	
	var dimensions = EyeCandies.getImageDimensions(img); // on récupère la taille de l'image
	var origWidth=dimensions[0];	
	var origHeight=dimensions[1];	
	var ratio = 1;
	img.style.margin='0px;';
	if(origWidth>origHeight) 
	{
		ratio = origWidth/newsize;  // Calcul du ratio
		img.style.marginTop='auto'; // Centrage Vertical de l'image
		img.style.marginBottom='auto';
	} 
	else 
	{
		ratio = origHeight/newsize;
		img.style.marginLeft='auto'; // Centrage Horizontal de l'image
		img.style.marginRight='auto';
	} 
	var newWidth = newsize; // Initialisation de la nouvelle taille
	var newHeight = newsize; 
	if(ratio>0) // Calcul de la nouvelle taille de l'image
	{
		newWidth = Math.round(origWidth/ratio);
		newHeight = Math.round(origHeight/ratio); 
	}
	img.style.width=newWidth+'px'; 
	img.style.height=newHeight+'px'; 
}

EyeCandies.getImageDimensions = function(img)
{
	var tmpImage = new Image();
	tmpImage.src = img.src;				// Chargement de l'image dans une image temporaire
	var newWidth=tmpImage.width;	// Récupération de la taille reelle de l'image
	var newHeight=tmpImage.height;	
	tmpImage=null;								// Destruction de l'image temporaire
	return new Array(newWidth,newHeight);
}

// Redimensionne un element pour qu'il soit imprimé de la meilleure menière possible sizeW sizeH: taille de la zone d'impression.
function printBestFit(id,sizeW,sizeH,unit)
{
	if(unit==null || unit==0) unit='mm';
	if(sizeW==null || sizeW==0) sizeW=180;
	if(sizeH==null || sizeH==0) sizeH=230;
	var elt = document.getElementById(id);
	var imgDim = EyeCandies.getImageDimensions(elt);
	
	var realWidth = imgDim[0];
	var realHeight = imgDim[1];
	
	if(realWidth>realHeight)
	{
		var ratio = realWidth/sizeW;
	}
	else
	{
		var ratio = realHeight/sizeH;
	}
	var newWidth = realWidth/ratio+unit;
	var newHeight = realHeight/ratio+unit;
	elt.style.width=newWidth;
	elt.style.height=newHeight;
	window.print();
}

function scaleIt(v,max,className) 
{
  	var elements = document.getElementsByClassName(className);
  	if(elements==null || elements.length==0) 
  	{
  		var element = document.getElementById(className);
  		if(element!=null) var elements=[element];
  		else
  		{
  			var elements = document.getElementsByName(className);
  		}
  	}
  	if(elements!=null)
  	{
		for (var i=0; i < elements.length; i++) 
		{
			// value est un entier de 0 a max. max représente le pourcentage de la taille originelle que le slider atteint en fin de course.
		 	var value = (v*max).toFixed();
			if(elements[i]!=null)
	  		{
				if(elements[i].tagName=='IMG')
				{
					var dimensions = EyeCandies.getImageDimensions(elements[i]);
					elements[i].style.width = (dimensions[0] * value/100).toFixed() +'px';
					elements[i].style.height = (dimensions[1] * value/100).toFixed() +'px';
				}
				else
				{
					var dimensions = [elements[i].style.width,elements[i].style.height];
					elements[i].style.width = (dimensions[0] * value/100).toFixed() +'px';
					elements[i].style.height = (dimensions[1] * value/100).toFixed() +'px';
				}
	    	}
	    }
  	}
}

function fluxImageTool()
{
}

fluxImageTool.sizeUp = function (id,increment)
{
	if(increment==null) increment=10;
	var elt = document.getElementById(id);
	if(elt!=null)
	{
		var percentWidth=increment*elt.width/100;
		var percentHeight=increment*elt.height/100;
		elt.style.width=parseInt(elt.width+percentWidth) + 'px';
		elt.style.height=parseInt(elt.height+percentHeight) + 'px';
	}
}

fluxImageTool.sizeDown=function (id,increment)
{
	if(increment==null) increment=10;
	var elt = document.getElementById(id);
	if(elt!=null)
	{
		var percentWidth=increment*elt.width/100;
		var percentHeight=increment*elt.height/100;
		elt.style.width=parseInt(elt.width-percentWidth) + 'px';
		elt.style.height=parseInt(elt.height-percentHeight) + 'px';
	}
}

fluxImageTool.sizeReset = function (id)
{
	var elt = document.getElementById(id);
	var dimensions = EyeCandies.getImageDimensions(elt);
	if(elt!=null)
	{
		elt.style.width=parseInt(dimensions[0]) + 'px';
		elt.style.height=parseInt(dimensions[1]) + 'px';
	}
}

function FluxCheckboxTool()
{
}

FluxCheckboxTool.resolveName = function(name)	
{
	var	object=null;
	if(typeof(name)=="string")
	{
		object=document.getElementsByName(name);
	}
	else if(typeof(name)=="object" &&	name.length==null) //	Object passé par this
	{
		object=document.getElementsByName(name.name);
	}
	else if(typeof(name)=="object" &&	name.length>0) //	Tableau
	{
		object=document.getElementsByName(name[0].name);
	}
	return object;
}

FluxCheckboxTool.countChecked	=	function(name)
{
	var	checkboxArray	=	this.resolveName(name);
	if(checkboxArray!=null)
	{
		var	checkboxes = checkboxArray;
		var	count=0;
		for(var	i=0; i<checkboxes.length;i++)
		{
			if(checkboxes[i].checked==true)
			{
				count++;
			}
		}
		return count;
	}
	else return	0;
}		

FluxCheckboxTool.limitChecked	=	function(elementName,count)
{
	var	checkboxArray	=	this.resolveName(elementName);
	if(checkboxArray!=null)
	{		
		if(this.countChecked(checkboxArray)<=count)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	else return	true;
}

function FluxWidget()
{
	
}

FluxWidget.Select = function()
{
}

FluxWidget.Select.copySelectedOptionToTextField = function (selectFieldName,textFieldName,prefix,suffix)
{
	if(selectFieldName!=null && textFieldName!=null)
	{
		var selectField = document.getElementsByName(selectFieldName);
		var textField = document.getElementsByName(textFieldName);
		if(selectField[0]!=null && textField[0]!=null)
		{
			selectField=selectField[0];
			textField=textField[0];
			
			var index = selectField.selectedIndex;
    		if (index >= 0) 
    		{
      			var opt = selectField.options[index];
      			if(opt!=null && opt.value.length>0 && textField!=null)
      			{
      				textField.value=textField.value+prefix+opt.value+suffix;
      			}
      		}
		}
	}
}

// Singleton permettant de charger des fichiers .js et .css sans doublons.
var GfwResourceLoader = new (Class.create(
{
	initialize: function()
	{
		this.timer = {};  // contains timers for scripts
		this.scripts = [];  // contains called script references
	},
	load: function(url, callback)
	{
		// handle object or path
		var classname = null;
		var properties = null;
		try 
		{
			// make sure we only load once
			if ($A(this.scripts).indexOf(url) == -1)
			{
				// note that we loaded already
				this.scripts.push(url);

				if (url.substr(url.length-3, 3)==".js")
				{
					var script=document.createElement("script");
					script.setAttribute("type","text/javascript");
					script.setAttribute("src", url);
					$$("head")[0].appendChild(script);  // add script tag to head element
				}

				if (url.substr(url.length-4, 4)==".css")
				{
					var mylink=document.createElement("link");
					mylink.setAttribute("rel", "stylesheet");
					mylink.setAttribute("type", "text/css");
					mylink.setAttribute("href", url);
					$$("head")[0].appendChild(mylink);  // add script tag to head element
				}

				// was a callback requested
				if (callback && script) {

					// test for onreadystatechange to trigger callback
					script.onreadystatechange = function () 
					{
						if (script.readyState == "loaded" || script.readyState == "complete") {callback();}
					}
					// test for onload to trigger callback
					script.onload = function () 
					{
						callback();
						return;
					}
					// safari doesnt support either onload or readystate, create a timer only way to do this in safari 1 & 2
					if ((Prototype.Browser.WebKit && navigator.userAgent.match(/Version\/[12]/)) || Prototype.Browser.Opera) 
					{ 
						this.timer[url] = setInterval(function() 
						{
							if (/loaded|complete/.test(document.readyState)) 
							{
								clearInterval( this.timer[url]);
								callback(); // call the callback handler
							}
						},10);
					}
				}
			} 
			else 
			{
				if (callback) { callback(); }
			}
		} 
		catch (e) {alert(e);}
	}
}))();


////FILE UPLOAD MANAGER
EyeCandies.AbstractFileUploadManager = Class.create({
	initialize: function(fieldId,iframeUrl,profiledir,filedestination,fileurlbasedir,parameters)
	{
		if(this.previewSize=='undefined') this.previewSize=150;
		this.fieldId=fieldId;
		this.formField=$(this.fieldId);
		this.iframeUrl=iframeUrl;
		if(iframeUrl.indexOf('?')!=-1)	this.uploadScriptUrl = iframeUrl.substr(0,iframeUrl.indexOf('?'));
		else											this.uploadScriptUrl = iframeUrl;
		this.container = $(this.fieldId+'-widget-container');
		this.currentFile=this.formField.getValue();
		this.profiledir=profiledir;
		this.filedestination=filedestination;
		this.fileurlbasedir=fileurlbasedir;
		this.lang='fr_FR';
		if(parameters && parameters.lang) this.lang=parameters.lang;
	},
	createDOM: function()
	{
		this.previewContainer = new Element('div',{className: 'gfw-widget-fileupload-previewcontainer',style:'display: none'});
		this.previewImage= new Element('img',{id:this.fieldId+'-preview-small',className:'gfw-widget-fileupload-previewimage',border:0,width:this.previewSize,height:this.previewSize});
		this.identificationDiv= new Element('div',{id:this.fieldId+'-identification',className:'gfw-widget-fileupload-identification'});
		this.previewErrorMessageDiv= new Element('div',{id:this.fieldId+'-previewerrormessage',className:'gfw-widget-fileupload-previewerrormessage'});
		this.uploadErrorMessageDiv= new Element('div',{id:this.fieldId+'-uploaderrormessage',className:'gfw-widget-fileupload-uploaderrormessage'});
		this.controlDiv= new Element('div',{id:this.fieldId+'-controls',className:'gfw-widget-fileupload-controls'});

		this.deleteButton = new Element('img',{id:this.fieldId+'-deleteBtn',className:'gfw-widget-fileupload-controlbutton',src:'/src/images/icons/32/editdelete.png',title:this.translator.gettext('Supprimer'),border:0});

		this.controlDiv.insert(this.deleteButton);

		this.previewContainer.style.width=this.previewSize+'px';
		this.previewContainer.style.height=this.previewSize+'px';

		this.uploadFrame = new Element('iframe',{id:this.fieldId+'-iframe',className:'gfw-widget-fileupload-iframe',width: 250, height: 32, frameborder:0, scrolling: 'no', src:this.iframeUrl, style:'float: left'});
		this.uploadFrame.observe('load',function(){this.onIframeLoad();}.bindAsEventListener(this));
		
		this.waitImageContainer= new Element('div',{id:this.fieldId+'-waitimagecontainer',className:'gfw-widget-fileupload-waitimagecontainer', style:'display: none; float: left;'});
		this.waitImage= new Element('img',{id:this.fieldId+'-waitimage',className:'gfw-widget-fileupload-waitimage',src:'/src/images/wait18.gif',border:0, style:'margin-right: 20px;'});
		
		this.waitImageContainer.insert(this.waitImage);
		
		this.waitImageBig= new Element('img',{id:this.fieldId+'-waitimagebig',className:'gfw-widget-fileupload-waitimagebig',src:'/src/images/wait30trans.gif',border:0, style:'position: absolute; top:43px; left: 43px; display: none;'});
		this.waitImageBig.style.top = (this.previewSize-64)/2+'px';
		this.waitImageBig.style.left = (this.previewSize-64)/2+'px';
				
		this.previewContainer.insert (this.previewImage);
		this.previewContainer.insert (this.waitImageBig);
				
		this.container.insert(this.previewContainer);
		this.previewContainer.insert(this.identificationDiv);
		this.previewContainer.insert(this.previewErrorMessageDiv);
		this.previewContainer.insert(this.controlDiv);
		
		this.container.insert (this.waitImageContainer);
		this.container.insert (this.uploadFrame);
		this.container.insert(this.uploadErrorMessageDiv);
		
		this.deleteButton.observe('click',function(){this.deleteFileAction();}.bindAsEventListener(this));
		this.previewImage.observe('click',function(){this.downloadFileAction();}.bindAsEventListener(this));
		this.previewImage.style.cursor = 'pointer';
		this.previewImage.observe('load',function(){this.revealPreviewImage();}.bindAsEventListener(this));
		this.previewImage.observe('error',function(){this.revealPreviewImage();}.bindAsEventListener(this));
	},
	setFile: function(file)
	{
		this.currentFile=file;
		this.formField.value=this.currentFile;
		this.updatePreview();
	},
	updatePreview: function()
	{
		this.previewImage.hide();
		this.showWaitImageBig();
		// résolution adaptative à la surface de l'image (pour les pdf)
		
		if(this.info && this.info.widthPx>0 && this.info.heightPx>0)
		{
			var density = 300;
			if(this.info.widthPx*this.info.heightPx>500*500) density=72;
			if(this.info.widthPx*this.info.heightPx>1000*1000) density=36;
		}
		else var density = 10;
		this.previewImage.src=this.getPreviewUrl(this.previewSize,density);
	},
	getPreviewUrl: function(size,density)
	{
		var params={action: 'preview',currentFile: this.currentFile,size: size};
		if(density>0) params.density=density;
		return this.iframeUrl+'&'+Object.toQueryString(params);
	},
	refresh: function()
	{
		this.onBeforeRefresh();
		this.updateField();
		this.repaint();
	},
	onBeforeRefresh: function()
	{
	},
	updateField: function()
	{
		this.previewErrorMessageDiv.hide();
		this.uploadErrorMessageDiv.hide();
		this.previewErrorMessageDiv.update('');
		this.uploadErrorMessageDiv.update('');
		this.identificationDiv.update('');
		if(this.info)
		{
			if(this.info.identifystring) 	this.identificationDiv.update(this.info.identifystring);
			else										this.identificationDiv.update('Fichier non identifiable');
			if(this.info.currentFile)
			{
				this.setFile(this.info.currentFile);
				if(this.info.error>0) 
				{
					this.previewErrorMessageDiv.show();
					this.previewErrorMessageDiv.update(this.info.errormessage);
				}
				this.updateMetadata();
			}
			else
			{
				if(this.info.error>0)
				{
					this.uploadErrorMessageDiv.update(this.info.errormessage);
					this.uploadErrorMessageDiv.show();
				}
				this.updateMetadata();
				this.setFile('');
			}
			if(this.formField.onchange!=null && this.formField.onchange!='undefined') this.formField.onchange();	// lancement du onchange si défini
		}
		else
		{
			this.updateMetadata();
			this.setFile('');
		}
		this.currentFile=this.formField.value;
	},
	updateMetadata: function()
	{
	},
	repaint: function()
	{
		this.onBeforeRepaint();
		if(this.currentFile)
		{
			this.showPreview();
			this.hideIframe();
		}
		else
		{
			this.showIframe();
			this.hidePreview();
		}
	},
	onBeforeRepaint: function()
	{
	},
	showPreview: function()
	{
		if(this.previewContainer.visible()==false) new Effect.Grow(this.previewContainer,{duration:0.5, direction:'top-left'});
	},
	revealPreviewImage: function()
	{
		if(this.currentFile!='')
		{
			this.hideWaitImageBig();
			new Effect.Appear(this.previewImage,{duration: 0.5, queue: {position: 'end', scope:this.fieldId}});
		}
	},
	hidePreviewImage: function()
	{
		new Effect.Fade(this.previewImage,{duration: 0.5, queue: {position: 'front', scope:this.fieldId}});
	},
	hidePreview: function()
	{
		if(this.previewContainer.visible()==true)
		{
			new Effect.Shrink(this.previewContainer,{duration:0.5, direction:'top-left'});
		}
	},
	showIframe: function()
	{
		if(this.uploadFrame.visible()==false)
		{
			this.uploadFrame.show();
		}
	},
	showWaitImage: function()
	{
		new Effect.Grow(this.waitImageContainer,{duration:0.5, direction:'top-left'});
	},
	hideWaitImage: function()
	{
		new Effect.Shrink(this.waitImageContainer,{duration:0.5, direction:'top-left'});
	},
	showWaitImageBig: function()
	{
		new Effect.Appear(this.waitImageBig,{duration:0.5,queue: {position: 'front', scope:this.fieldId}});
	},
	hideWaitImageBig: function()
	{
		new Effect.Fade(this.waitImageBig,{duration:0.5,queue: {position: 'end', scope:this.fieldId} });
	},
	hideIframe: function()
	{
		if(this.uploadFrame.visible()==true)
		{
			this.uploadFrame.hide();
		}
	},
	deleteFile: function(response)
	{
		this.info=response.responseJSON;
		this.formField.value='';
		this.refresh();
	},
	identifyFile: function(response)
	{
		this.info=response.responseJSON;
		this.refresh();
	},
	onIdentify: function()
	{
	},
	deleteFileAction: function()
	{
		var parameters = this.iframeUrl.parseQuery();
		parameters.action='delete';
		parameters.currentFile=this.currentFile;
		var request = new Ajax.Request(this.uploadScriptUrl,{	method: 'get',parameters: parameters,onSuccess: function(response){this.deleteFile(response);}.bind(this)});
	},
	identifyFileAction: function()
	{
		var parameters = this.iframeUrl.parseQuery();
		parameters.action='identify';
		parameters.currentFile=this.currentFile;
		var request = new Ajax.Request(this.uploadScriptUrl,{	method: 'get',parameters: parameters,onSuccess: function(response){this.identifyFile(response);}.bind(this)});
	},
	downloadFileAction: function()
	{
		window.location.href=this.iframeUrl+'&action=download&currentFile='+this.currentFile;
	},
	onIframeLoad: function()
	{
		var iframe = $(this.fieldId+'-iframe');
		if(iframe)
		{
			this.hideWaitImage();
			// get window and document objects for iframe (IE compatible)
			var idoc= iframe.contentDocument || iframe.contentWindow.document;
			var iwin= iframe.contentWindow || iframe.contentDocument.defaultView;
			iwin.Element.extend(idoc);
			this.fileFieldElement = idoc.getElementById('filefield');
			this.uploadFormElement = idoc.getElementById('uploadform');
			iwin.Element.extend(this.uploadFormElement);
			this.infoFormElement = idoc.getElementById('infoform');
			iwin.Element.extend(this.infoFormElement);
			// On recharge les informations renvoyées par le formulaire d'info.
			
			this.info={};
			if(this.infoFormElement!=null)
			{
				var elements=this.infoFormElement.getElements();
				var info = elements[0].getValue();
				if(info!='') this.info = info.evalJSON();
			}
			if(this.fileFieldElement)
			{
				Event.observe(this.fileFieldElement,'change',function(){
					if(this.uploadFormElement!=null)
					{
						this.showWaitImage();
						this.uploadFormElement.submit();
					}
				}.bindAsEventListener(this));
			}
			this.refresh();
		}
	}
});

EyeCandies.GenericFileUploadManager = Class.create(EyeCandies.AbstractFileUploadManager,{
	initialize: function($super,fieldId,iframeUrl,profiledir,filedestination,fileurlbasedir,parameters)
	{
		this.previewSize=64;
		$super(fieldId,iframeUrl,profiledir,filedestination,fileurlbasedir);
		this.translator = new EyeCandies.Translator(this.lang,{
			'Supprimer':{'en_US':'Delete'}
		});
		if(this.container)
		{
			this.createDOM();
			this.refresh();
		}
	}
});

EyeCandies.ImageFileUploadManager = Class.create(EyeCandies.AbstractFileUploadManager,{
	initialize: function($super,fieldId,iframeUrl,profiledir,filedestination,fileurlbasedir,parameters)
	{
		this.previewSize=150;
		GfwResourceLoader.load('/src/javascript/jsCropperUI/cropper.js');
		this.imageminimumwidth=parameters.imageminimumwidth;
		this.imageminimumheight=parameters.imageminimumheight;
		this.fileeditmode=parameters.fileeditmode;
		$super(fieldId,iframeUrl,profiledir,filedestination,fileurlbasedir,parameters);
		this.translator = new EyeCandies.Translator(this.lang,{
			'Supprimer':{'en_US':'Delete'},
			'Recadrer':{'en_US':'Crop'}
		});

		if(this.container)
		{
			this.createDOM();
			this.refresh();
		}
	},
	createDOM: function()
	{
		this.previewContainer = new Element('div',{className: 'gfw-widget-fileupload-previewcontainer',style:'display: none'});
		this.previewImage= new Element('img',{id:this.fieldId+'-preview-small',className:'gfw-widget-fileupload-previewimage',border:0,width:this.previewSize,height:this.previewSize});
		this.identificationDiv= new Element('div',{id:this.fieldId+'-identification',className:'gfw-widget-fileupload-identification'});
		this.previewErrorMessageDiv= new Element('div',{id:this.fieldId+'-previewerrormessage',className:'gfw-widget-fileupload-previewerrormessage'});
		this.uploadErrorMessageDiv= new Element('div',{id:this.fieldId+'-uploaderrormessage',className:'gfw-widget-fileupload-uploaderrormessage'});
		this.controlDiv= new Element('div',{id:this.fieldId+'-controls',className:'gfw-widget-fileupload-controls'});

		this.cropperButton = new Element('img',{id:this.fieldId+'-cropBtn',className:'gfw-widget-fileupload-controlbutton',src:'/src/images/icons/32/crop.png',title:this.translator.gettext('Recadrer'),border:0});
		this.deleteButton = new Element('img',{id:this.fieldId+'-deleteBtn',className:'gfw-widget-fileupload-controlbutton',src:'/src/images/icons/32/editdelete.png',title:this.translator.gettext('Supprimer'),border:0});
				
		this.controlDiv.insert(this.cropperButton);
		this.controlDiv.insert(this.deleteButton);
		
		this.previewContainer.style.width=this.previewSize+'px';
		this.previewContainer.style.height=this.previewSize+'px';

		this.uploadFrame = new Element('iframe',{id:this.fieldId+'-iframe',className:'gfw-widget-fileupload-iframe',width: 250, height: 32, frameborder:0, scrolling: 'no', src:this.iframeUrl, style:'float: left'});
		this.uploadFrame.observe('load',function(){this.onIframeLoad();}.bindAsEventListener(this));
		
		this.waitImageContainer= new Element('div',{id:this.fieldId+'-waitimagecontainer',className:'gfw-widget-fileupload-waitimagecontainer', style:'display: none; float: left;'});
		this.waitImage= new Element('img',{id:this.fieldId+'-waitimage',className:'gfw-widget-fileupload-waitimage',src:'/src/images/wait18.gif',border:0, style:'margin-right: 20px;'});
		
		this.waitImageContainer.insert(this.waitImage);

		this.waitImageBig= new Element('img',{id:this.fieldId+'-waitimagebig',className:'gfw-widget-fileupload-waitimagebig',src:'/src/images/wait30trans.gif',border:0, style:'position: absolute; display: none;'});
		this.waitImageBig.style.top = (this.previewSize-64)/2+'px';
		this.waitImageBig.style.left = (this.previewSize-64)/2+'px';
		
		this.previewContainer.insert (this.previewImage);
		this.previewContainer.insert (this.waitImageBig);
		
		this.container.insert(this.previewContainer);
		this.previewContainer.insert(this.identificationDiv);
		this.previewContainer.insert(this.previewErrorMessageDiv);
		this.previewContainer.insert(this.controlDiv);
		
		this.container.insert (this.waitImageContainer);
		this.container.insert (this.uploadFrame);
		this.container.insert(this.uploadErrorMessageDiv);
		
		this.disableControls();
		
		this.cropperButton.observe('click',function(){this.launchCropperAction();}.bindAsEventListener(this));
		this.deleteButton.observe('click',function(){this.deleteFileAction();}.bindAsEventListener(this));
		this.previewImage.observe('load',function(){this.revealPreviewImage();}.bindAsEventListener(this));
		this.previewImage.observe('error',function(){this.revealPreviewImage();}.bindAsEventListener(this));
	},
	disableControls: function()
	{
		this.cropperButton.hide();
		this.previewImage.style.cursor = 'auto';
		this.previewImage.stopObserving('click');
	},
	enableControls: function()
	{
		if(this.fileeditmode) 		
		{
			this.cropperButton.show();
		}
		this.previewImage.style.cursor = 'pointer';
		this.previewImage.observe('click',function(){this.downloadFileAction();}.bindAsEventListener(this));
	},
	onBeforeRefresh: function()
	{
		if(this.info)
		{
			if(this.info.error==false && this.info.currentFile)
			{
				this.enableControls();
			}
			else if(this.info.error>0 && this.info.error<200)
			{
				this.disableControls();
			}
			else
			{
				this.enableControls();
			}
		}
	},
	updateMetadata: function()
	{
		if(this.info && this.info.currentFile)
		{
			this.formField.setAttribute('data-fileinfo-width',this.info.width);							// mise à jour des métadonnées
			this.formField.setAttribute('data-fileinfo-height',this.info.height);
			this.formField.setAttribute('data-fileinfo-aspectratio',this.info.aspectratio);
		}
		else
		{
			this.formField.removeAttribute('data-fileinfo-width');
			this.formField.removeAttribute('data-fileinfo-height');
			this.formField.removeAttribute('data-fileinfo-aspectratio');
		}
	},
	onBeforeRepaint: function()
	{
		if(this.currentFile) this._fitSquarePreview();
	},
	_fitSquarePreview: function()
	{
		if(this.info)
		{
			var ratio=1;
			if(this.info.heightPx==null || this.info.widthPx==null || this.info.heightPx==0 || this.info.widthPx==0)
			{
				origHeight=64; origWidth=64; // pour afficher correctement l'icone de la preview en cas de fichier absent (icone fichier inconnu)
			}
			else
			{
				var origHeight = parseInt(this.info.heightPx);
				var origWidth = parseInt(this.info.widthPx);
			}

			if(origWidth>origHeight) 	ratio = origWidth/this.previewSize;
			else 										ratio = origHeight/this.previewSize;
			var newWidth = this.previewSize; // Initialisation de la nouvelle taille
			var newHeight = this.previewSize; 
			if(ratio>0)
			{
				if((origWidth>this.previewSize || origHeight>this.previewSize)) // Calcul de la nouvelle taille de l'image (reduction uniquement)
				{
					newWidth = Math.round(origWidth/ratio);
					newHeight = Math.round(origHeight/ratio); 
				}
				else
				{
					newWidth = origWidth;
					newHeight = origHeight; 
				}
			}
			this.previewImage.style.width=newWidth+'px'; 
			this.previewImage.style.height=newHeight+'px'; 
			this.previewImage.width=newWidth;
			this.previewImage.height=newHeight;
			this.previewImage.style.left=Math.round((this.previewSize-newWidth)/2)+'px';
			this.previewImage.style.top=Math.round((this.previewSize-newHeight)/2)+'px';
		}
	},
	_cropFile: function(response)
	{
		this.info=response.responseJSON;
		this.refresh();
	},
	launchCropperAction: function()
	{
		if(this.formField.getValue()!="")
		{		
			var cropper = new EyeCandies.Cropper({
				fileUploadManager: this,
				fieldId: this.fieldId,
				image: this.getPreviewUrl(300,300),
				ratioDimX: this.imageminimumwidth,
				ratioDimY: this.imageminimumheight,
				lang: this.lang,
				onValidate: function(imageCrop)
				{
					width = imageCrop.x2-imageCrop.x1;
					height = imageCrop.y2 - imageCrop.y1;
					if(width>0 && height>0 && imageCrop.x1>=0 && imageCrop.y1>=0)
					{
						this.showWaitImageBig();
						this.hidePreviewImage();
						var parameters = this.iframeUrl.parseQuery();
						parameters.action='crop';
						parameters.currentFile=this.currentFile;
						parameters.cropWidth= width;
						parameters.cropHeight= height;
						parameters.cropLeft= imageCrop.x1;
						parameters.cropTop= imageCrop.y1;
						var request = new Ajax.Request(this.uploadScriptUrl,{	method: 'get',	parameters: parameters,onSuccess: function(response){this._cropFile(response);}.bind(this)});
					}
				}.bind(this)
			});
			cropper.launch();
		}
	}
});

//// CROPPER
if(typeof(Object.Event) == 'object') // Test if livepipe is loaded
{
	EyeCandies.Cropper = Class.create({
		initialize: function(parameters)
		{
			this.cropper = null;
			this.suffix='_cropper';
			this.imageCrop = {};
			this.maxViewportSize=500;
			this.minViewportSize=300;
			this.lang='fr_FR';
			this.loadParameters(parameters);
			this.translator = new EyeCandies.Translator(this.lang,{
				'Appliquer':{'en_US':'Apply'},
				'Annuler':{'en_US':'Cancel'},
				'Définissez votre zone de recadrage en cliquant sur l\'image.':{'en_US':'Define your crop area by clicking on the image.'},
				'Recadrage d\'image':{'en_US':'Image crop'}
			});
		},
		loadParameters: function(parameters)
		{
			this.fileUploadManager=parameters.fileUploadManager;
			this.fieldId=parameters.fieldId;
			this.imageUrl = parameters.image;
			this.imageSize = {width: parseInt(this.fileUploadManager.info.widthPx), height: parseInt(this.fileUploadManager.info.heightPx)};
			this.ratioDimX = parameters.ratioDimX;
			this.ratioDimY = parameters.ratioDimY;
			this.minWidth = Math.round(parameters.ratioDimX/10);
			this.minHeight = Math.round(parameters.ratioDimY/10);
			this.onValidate = parameters.onValidate;
			this.onCancel = parameters.onCancel;
			if(parameters && parameters.lang) this.lang=parameters.lang;
	
			if(parameters.onloadCoords!=null)
			{
				this.onloadCoords= this.toCropperCoords(parameters.onloadCoords);
			}
			else
			{
				this.onloadCoords=null;
			}
			this.containerId = this.fieldId+this.suffix;
			this.imageId = this.fieldId+this.suffix+'_image';
		},
		computeViewportSize: function()
		{
			this.viewportWidth = this.scaledImageWidth;
			this.viewportHeight = this.scaledImageHeight;
			if(this.viewportWidth<this.minViewportSize) 	this.viewportWidth=this.minViewportSize;
			if(this.viewportHeight<this.minViewportSize)	this.viewportHeight=this.minViewportSize;
			this.windowWidth = this.viewportWidth + 10;
			this.windowHeight = this.viewportHeight + 130;
		},
		computeFixedImageSize: function()
		{
			this.scale = 1;
			if(this.imageSize.width>this.maxViewportSize || this.imageSize.height>this.maxViewportSize) // On redimensionne l'image si elle est trop grande pour rentrer dans le viewport
			{
				if(this.imageSize.width>this.imageSize.height) 	this.scale = this.imageSize.width/this.maxViewportSize;
				else 																			this.scale = this.imageSize.height/this.maxViewportSize;
			}
			this.scaledImageWidth=Math.round(this.imageSize.width/this.scale);
			this.scaledImageHeight=Math.round(this.imageSize.height/this.scale);
		},
		showWaitImage: function()
		{
			this.imageWait.style.top=parseInt(this.containerDiv.style.height)/2-64/2+'px';
			this.imageWait.style.left=parseInt(this.containerDiv.style.width)/2-64/2+'px';
			new Effect.Appear(this.imageWait,{duration:0.5});
		},
		showImage:function()
		{
			new Effect.Fade(this.imageWait,{duration:0.5});
			new Effect.Appear(this.imageImg,{duration:0.5, afterFinish: function(){this.createCropper();}.bindAsEventListener(this)});
		},
		launch: function()
		{
			this.computeFixedImageSize();
			this.computeViewportSize();
	
			this.headerDiv= new Element('div',{className:'gfw-widget-cropper-header'});
			this.imageDiv= new Element('div',{className:'gfw-widget-cropper-imagecontainer'});
			this.imageImg= new Element('img',{className:'gfw-widget-cropper-image',id:this.imageId,title:'', style:'display: none;'});
			this.imageWait= new Element('img',{src:'/src/images/wait30trans.gif',style: 'display: none; position: absolute;'});
			this.controlDiv= new Element('div',{className:'gfw-widget-cropper-controlpanel'});
			this.applyButton= new Element('input',{className:'gfw-widget-cropper-button',id: this.containerId+'_apply', type:'button', value: this.translator.gettext('Appliquer')});
			this.cancelButton= new Element('input',{className:'gfw-widget-cropper-button',id: this.containerId+'_cancel', type:'button', value: this.translator.gettext('Annuler')});
			this.containerDiv= new Element('div',{className:'gfw-widget-cropper-window',id: this.containerId,style: 'position: relative;'});
			
			this.imageDiv.insert(this.imageImg);
			this.controlDiv.insert(this.applyButton);
			this.controlDiv.insert(this.cancelButton);
			this.containerDiv.insert(this.headerDiv);
			this.containerDiv.insert(new Element('div',{style:'padding: 5px;'}).insert(this.translator.gettext('Définissez votre zone de recadrage en cliquant sur l\'image.')));
			this.containerDiv.insert(this.imageDiv);
			this.containerDiv.insert(this.controlDiv);
			this.headerDiv.insert(this.translator.gettext('Recadrage d\'image'));
			

			this.containerDiv.style.width=this.windowWidth+'px';
			this.containerDiv.style.height=this.windowHeight+'px';
			this.imageDiv.style.width=this.viewportWidth+'px';
			this.imageDiv.style.height=this.viewportHeight+'px';
			this.imageImg.style.width= this.scaledImageWidth+'px';
			this.imageImg.style.height=this.scaledImageHeight+'px';
			this.imageDiv.insert(this.imageWait);
			$$('body')[0].insert(this.containerDiv);
			
			this.applyButton.observe('click',function(){ this.save(); this.modal.close();}.bind(this));
			this.cancelButton.observe('click',function(){ this.clear(); this.modal.close();}.bind(this));

			this.showWaitImage();
			this.imageImg.observe('load',function(){this.showImage();}.bindAsEventListener(this));
			this.imageImg.src=this.imageUrl;
			
			
			this.modal = new Control.Modal(this.containerDiv,{
					overlayOpacity: 0.5,
					opacity: 0.8,
					position: 'center',
					width: this.windowWidth,
					height: this.windowHeight,
					fade: true,
					fadeDuration: 0.5,
					closeOnClick: false,
					afterOpen: function(){/*this.createCropper();*/}.bind(this),
					afterClose: function(){this.destroyCropper();}.bind(this)
			});
			
			
			if($('control_overlay')) $('control_overlay').style.backgroundColor='#666';
			this.modal.open();
			
		},
		onEndCrop: function(coords)
		{
			this.imageCrop=coords;
		},
		createCropper: function()
		{
			this.cropper = new Cropper.Img(this.imageId,{ minWidth: this.minWidth, minHeight: this.minHeight, ratioDim: { x: this.ratioDimX, y: this.ratioDimY },displayOnInit: false, onloadCoords: this.onloadCoords,onEndCrop: function(coords,dimensions) {return this.onEndCrop(coords);}.bind(this)});
		},
		save: function()
		{
			if(Object.isFunction(this.onValidate))
			{
				this.onValidate(this.toRealCoords());
			}
		},
		clear: function()
		{
			this.imageCrop=null;
			if(Object.isFunction(this.onCancel)) this.onCancel(this.imageCrop);
		},
		// transforme les coordonnées sauvegardées dans le repère du cropper
		toCropperCoords: function(realCoords)
		{
			var coords={x1: 0, y1: 0, x2:this.scaledImageWidth, y2: this.scaledImageHeight};
			if(realCoords!=null)
			{
				coords.x1 = Math.floor(realCoords.x1/this.scale);
				coords.y1 = Math.floor(realCoords.y1/this.scale);
				coords.x2 = Math.floor(realCoords.x2/this.scale);
				coords.y2 = Math.floor(realCoords.y2/this.scale);
			}
			return coords;
		},
		// transforme les coordonnées définies dans le cropper vers le repère de l'image originale
		toRealCoords: function()
		{
			var coords={};
			coords.x1 = Math.floor(this.scale*this.imageCrop.x1);
			coords.y1 = Math.floor(this.scale*this.imageCrop.y1);
			coords.x2 = Math.floor(this.scale*this.imageCrop.x2);
			coords.y2 = Math.floor(this.scale*this.imageCrop.y2);
			return coords;
		},
		destroyCropper: function()
		{
			this.containerDiv.remove();
			this.cropper=null;
		}
	});
	Object.Event.extend(EyeCandies.Cropper);
}

////IMAGEBROWSER
EyeCandies.ImageBrowser = Class.create(
{
	initialize: function(fieldName,options)
	{
		this.fieldName=fieldName;
		this.container = $(this.fieldName+'-widget-container');
		this.field = document.getElementsByName(this.fieldName)[0];
		this.field=$(this.field);
		this.options=options;
		if(this.options)
		{
			this.url=this.options.url;
			this.thumbnailUrl=this.options.thumbnailUrl;
		}
		this.ibWindow=null;
		this.translator = new EyeCandies.Translator(this.options.lang,{
			'Acc&eacute;der &agrave; la banque d\'image':{'en_US':'Access the image bank'},
			'Supprimer l\'image':{'en_US':'Delete the image'},
			'Choisir une autre image':{'en_US':'Select another image'}
		});

		this.thumbNailDiv = new Element('div',{id:this.fieldName+'-tn',className:'gfw-widget-fileupload-previewcontainer'});
		this.controlDiv= new Element('div',{id:this.fieldName+'-controls',className:'gfw-widget-fileupload-controls'});
		this.openButton=new Element('button',{id:this.fieldName+'-openBtn',type:'button',className:'gfw-button icon gray',onclick:'return false;'});
		this.openButton.insert(this.translator.gettext('<span style="background-image:url(/src/images/icons/12/add-circle-gray.png);">Acc&eacute;der &agrave; la banque d\'image</span>'));
		this.openButton.observe('click',function(){this.open();}.bindAsEventListener(this));

		this.changeButton = new Element('img',{id:this.fieldName+'-changeBtn',className:'gfw-widget-fileupload-controlbutton',src:'/src/images/icons/32/recyclebtn.png',title:this.translator.gettext('Choisir une autre image'),border:0});
		this.changeButton.observe('click',function(){this.open()}.bindAsEventListener(this));

		this.deleteButton = new Element('img',{id:this.fieldName+'-deleteBtn',className:'gfw-widget-fileupload-controlbutton',src:'/src/images/icons/32/editdelete.png',title:this.translator.gettext('Supprimer l\'image'),border:0});
		this.deleteButton.observe('click',function(){this.discard();}.bindAsEventListener(this));



		this.container.insert(this.thumbNailDiv);
		this.thumbNailDiv.insert(this.controlDiv);
		this.thumbNailDiv.hide();
		this.controlDiv.insert(this.changeButton);
		this.controlDiv.insert(this.deleteButton);
		this.container.insert(this.openButton);
		
		if(this.thumbnailUrl=='' || this.thumbnailUrl=='undefined') this.thumbnailUrl=null;
		this.refresh();
	},
	refresh: function()
	{
		this.refreshControls();
		if(this.thumbnailUrl!=null)
		{
			
			var imgldr = new Image();
			imgldr.onload=function()
			{
				
				if(this.thumbNailDiv.visible())
				{
					new Effect.Shrink(this.thumbNailDiv,{duration:0.5, direction:'top-left', delay: 0.5,afterFinish: function() {this.updateThumbnailDivImage(this.thumbnailUrl);new Effect.Grow(this.thumbNailDiv,{	duration:0.5, direction:'top-left', afterFinish: function() {}.bind(this)});}.bind(this)});		
				}
				else
				{
					this.updateThumbnailDivImage(this.thumbnailUrl);
					new Effect.Grow(this.thumbNailDiv,{duration:0.5, direction:'top-left', queue: {position: 'end', scope:this.fieldName}, afterFinish: function() {this.thumbNailDiv.show();}.bind(this)});
				}
			}.bind(this);
			imgldr.onerror=function()
			{
				new Effect.Shrink(this.thumbNailDiv,{duration:0.5, direction:'top-left', queue: {position: 'end', scope:this.fieldName}, afterFinish: function() {this.updateThumbnailDivImage(false); this.thumbNailDiv.hide();}.bind(this)});
				this.field.value='';
				this.discard();
			}.bind(this);
			imgldr.src=this.thumbnailUrl;
		}
		else
		{
			new Effect.Shrink(this.thumbNailDiv,{duration:0.5, direction:'top-left', queue: {position: 'end', scope:this.fieldName}, afterFinish: function(){this.updateThumbnailDivImage(false); this.thumbNailDiv.hide();}.bind(this)});
			this.field.value='';
		}
	},
	updateThumbnailDivImage: function(imageUrl)
	{
		if(imageUrl)
		{
			this.thumbNailDiv.style.width='150px';
			this.thumbNailDiv.style.height='150px';
			this.thumbNailDiv.style.backgroundPosition='center center';
			this.thumbNailDiv.style.backgroundPositionX='center';
			this.thumbNailDiv.style.backgroundPositionY='center';
			this.thumbNailDiv.style.backgroundRepeat='no-repeat';
			this.thumbNailDiv.style.backgroundImage='url('+imageUrl+')';
		}
		else
		{
			this.thumbNailDiv.style.backgroundImage='none';
		}
	},
	refreshControls: function()
	{
		if(this.options.enableControls)
		{
			if(this.thumbnailUrl!=null)
			{
				this.deleteButton.show();
				this.changeButton.show();
				this.openButton.hide();
			}
			else
			{
				this.openButton.show();
				this.deleteButton.hide();
				this.changeButton.hide();
			}
		}
		else
		{
			this.openButton.hide();
			this.deleteButton.hide();
			this.changeButton.hide();
		}
	},
	setThumbnail: function(src)
	{
		this.thumbnailUrl = src;
		this.refresh();
	},
	open: function()
	{
		if(this.url)
		{
			if(this.ibWindow == null || this.ibWindow.closed)
			{
				this.ibWindow = window.open(this.url,this.fieldName, "resizable=yes,scrollbars=yes,status=yes, width=1024, height=768");
				this.ibWindow.focus();
			}
			else
			{
				this.ibWindow.focus();
				this.ibWindow.location.href=this.url;
			}
		}
	},
	discard: function()
	{
		this.setThumbnail(null);
	}
});
// Singleton pour manager les différentes instances des ImageBrowser
var ImageBrowserManager = new (Class.create({
    initialize: function()
    {
		this.imageBrowserList = [];
    },
    addImageBrowser: function(name,imageBrowser)
    {
       this.imageBrowserList[name]=imageBrowser;
    },
    getImageBrowser: function(name)
    {
    	return this.imageBrowserList[name];
    },
    postBackSelection: function(fieldName,imageFileName,imageThumbnailName)
	{
		if(window.opener!=null)
		{
			var doc = window.opener.document;
			var fieldElementArray = doc.getElementsByName(fieldName);
			if(fieldElementArray[0])
			{
				fieldElementArray[0].value=imageFileName;
			}
			var imageBrowser = window.opener.ImageBrowserManager.getImageBrowser(fieldName);
			if(imageBrowser)
			{
				imageBrowser.setThumbnail(imageThumbnailName);
			}
			window.opener.focus();
			window.close();
		}
		else
		{
			window.close();
		}
	}
}))();

EyeCandies.Translator = Class.create({
	initialize: function(lang,dictionary)
	{
		this.lang=lang;
		this.setDictionary(dictionary);
	},
	setDictionary: function(dictionary)
	{
		this.dictionary=dictionary;
	},
	gettext: function(string)
	{
		if(this.dictionary[string] && this.dictionary[string][this.lang]) return this.dictionary[string][this.lang];
		else return string;
	}
});

EyeCandies.buildDynamicDropDown = Class.create();
	EyeCandies.buildDynamicDropDown.prototype= {

					initialize: function(srcselect, destselect, url, typedest, msg) {        
											this.srcselect   = 	$(srcselect);	
											this.destselect = 	$(destselect);	
											this.url = url;
											if (typedest!=undefined)
											    		this.typedest  = typedest;
											else	this.typedest  = 'select';
											if (msg!=undefined)
											    		this.msg  = msg;
											else	this.msg  = '';
    										},

 					update:	 function (event)
											{																								
												if (this.srcselect && this.destselect)
												  {												
														var destselect = this.destselect;
														var typedest = this.typedest;
														
														switch(this.typedest )
														  {
															case 'select' : if (destselect.options)
														  							{
																						for (var i=destselect.options.length-1; i >=0 ; i--)  // efface la liste actuelle
																							destselect.options[i]=null;
																						destselect.options[destselect.options.length] = new Option('Chargement.....','0',false,false);	
														  							}
														  			break;
														  	case 'textarea' :  if (this.msg!='')
																					{
																						if (destselect.value!='')
																						 	if(this.srcselect.options[this.srcselect.selectedIndex].value=='' || confirm(this.msg)==false)
														  								  		return(false);
																					}
																		break;
														  }															
														
														new Ajax.Request( this.url+'&start=0&limit=999999&query='+this.srcselect.options[this.srcselect.selectedIndex].value ,
																			{
                																	method: 'get',
                																	onSuccess: function(data){      
                																		
 																					switch(typedest )
														  								{
														  									case  'select' :  if (destselect.options)
																															destselect.options[0]=null;  // efface le message de chargement
																													else  destselect.options=new Array();  // efface le message de chargement

																						
                																										var jsondata = eval('(' + data.responseText + ')');		
                																										if (jsondata!=null && jsondata.rows && jsondata.rows.length)
																						 							jsondata.rows.each(            // creation des elements 
																						 								function (elt)
																						 									{
																						 	 									nouvel_element = new Option(elt.text,elt.idlookuppostes,false,false);
																							 									destselect.options[destselect.options.length] = nouvel_element;																							 
																					 										}
																					 								);																																				
																											break;
																							case 'textarea' :   var jsondata = eval('(' + data.responseText + ')');		
                																										 if (jsondata!=null && jsondata.rows && jsondata.rows.length)    
                																										     {            											
 																																destselect.value= jsondata.rows[0].texte;								                																										   			
                																										   	}
                																										  else	destselect.update( '' );		
                																								break;		
																						}															
                																	}
        																		});
        											  }
											} 
		}


/*Inclusion de bsn.AutoSuggest*/
Scriptaculous.require('/src/javascript/autosuggest/js/bsn.AutoSuggest.js');
