Index: /ether_2012/common/Common.iml
===================================================================
--- /ether_2012/common/Common.iml	(revision 319)
+++ /ether_2012/common/Common.iml	(revision 319)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/implementation" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/interface" isTestSource="false" />
+    </content>
+    <orderEntry type="jdk" jdkName="1.6" jdkType="JavaSDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module-library" scope="TEST">
+      <library>
+        <CLASSES>
+          <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.8.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="library" name="lib_common" level="project" />
+  </component>
+</module>
+
Index: /ether_2012/common/implementation/com/ether/Context.java
===================================================================
--- /ether_2012/common/implementation/com/ether/Context.java	(revision 319)
+++ /ether_2012/common/implementation/com/ether/Context.java	(revision 319)
@@ -0,0 +1,127 @@
+package com.ether;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+public class Context
+{
+//	private static String projet="megapoli";
+
+
+    /**
+     * Permet d'obtenir la langue courante.
+     *
+     * @param request : la requÃªte courante
+     * @return la langue courante.
+     */
+    public static String getLangue( HttpServletRequest request )
+    {
+        String lang = (String) request.getSession().getAttribute( "lang" );
+        if( lang == null )
+        {
+            // Pour initialiser la langue en Anglais
+            lang = request.getLocale().getLanguage();
+
+            // Pour initialiser la langue en FranÃ§ais
+            //lang = Locale.FRENCH.getLanguage();
+        }
+        return lang;
+    }
+
+    /**
+     * Return the current Locale
+     *
+     * @param request
+     * @return
+     */
+    public static Locale getLocale( @NotNull final HttpServletRequest request )
+    {
+        final HttpSession session = request.getSession( true );
+        Locale locale = (Locale) session.getAttribute( "LOCALE" );
+        if( locale == null )
+            locale = request.getLocale();
+
+        if( request.getParameter( "language" ) != null )
+            locale = new Locale( request.getParameter( "language" ) );
+
+        return locale;
+    }
+
+    /**
+     * Permet d'obtenir la date courante, sous la forme YYYYMMDD
+     *
+     * @return la date courante
+     */
+    public static String getSimpleDate()
+    {
+        java.util.Calendar c = java.util.Calendar.getInstance();
+        String t = "0" + ( c.get( Calendar.MONTH ) + 1 );
+        return c.get( Calendar.YEAR ) + t.substring( t.length() - 2 ) + c.get( Calendar.DAY_OF_MONTH );
+    }
+
+    /**
+     * DÃ©signe l'adresse mail du webmaster
+     */
+    public static String getWebmaster( HttpServletRequest request )
+    {
+        String webmaster = (String) request.getSession().getServletContext().getAttribute( "APP_WEBMASTER" );
+        return webmaster;
+    }
+
+    /**
+     * Permet de dÃ©finir le nom de la racine Ã  partir de laquelle les paths sont calculÃ©s.
+     *
+     * @return le nom de la racine.
+     */
+    public static String getWebroot( HttpServletRequest request )
+    {
+        String path = request.getSession().getServletContext().getRealPath( "" );
+        return path.substring( path.lastIndexOf( "/" ) + 1 );
+    }
+
+    /**
+     * Permet d'obtenir l'uri de la page courante.
+     *
+     * @param request : la requÃªte courante
+     * @return l'uri de la page courante
+     */
+    public static String getPageURI( HttpServletRequest request )
+    {
+        return request.getRequestURI().substring( request.getRequestURI().indexOf( '/' ) + 1 );
+    }
+
+    /**
+     * Permet d'obtenir l'URI relative de la page courante.
+     * Cette mÃ©thode est en particulier utilisÃ©e pour retomber sur la page courante lorsqu'on
+     * change de langue.
+     *
+     * @param request
+     * @return
+     */
+    public static String getRelativePageURI( HttpServletRequest request )
+    {
+        String pageUri = getPageURI( request );
+        if( pageUri.indexOf( '/' ) != -1 )
+        {
+            pageUri = pageUri.substring( pageUri.indexOf( '/' ) );
+        }
+        return pageUri;
+    }
+
+
+    public static String getRelativePath( HttpServletRequest request )
+    {
+        String uri = getPageURI( request );
+        if( uri.indexOf( '/' ) != -1 )
+        {
+            uri = uri.substring( uri.indexOf( '/' ), uri.lastIndexOf( '/' ) );
+        }
+        return uri;
+    }
+
+}
Index: /ether_2012/common/implementation/com/ether/DateHelper.java
===================================================================
--- /ether_2012/common/implementation/com/ether/DateHelper.java	(revision 319)
+++ /ether_2012/common/implementation/com/ether/DateHelper.java	(revision 319)
@@ -0,0 +1,151 @@
+package com.ether;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vmipsl
+ * @date 2011
+ */
+public abstract class DateHelper
+{
+    /**
+     * Set the date with a default locale (french)
+     *
+     * @param date date to formate
+     * @return a new date set to midnight
+     */
+    public static Date to00h00m00s( final Date date )
+    {
+        assert ( null != date );
+        final Calendar calendar = Calendar.getInstance( Locale.FRENCH );
+
+        return setMinimumFields( date, calendar );
+    }
+
+    /**
+     * Set the date with a default locale (french)
+     *
+     * @param date date to formate
+     * @return a new date set to 23h 59m 59s
+     */
+    public static Date to23h59m59s( final Date date )
+    {
+        assert ( null != date );
+        final Calendar calendar = Calendar.getInstance( Locale.FRENCH );
+
+        return setMaximumFields( date, calendar );
+    }
+
+    /**
+     * Set the date using the given locale
+     *
+     * @param locale locale to use
+     * @param date   date to formate
+     * @return a new date set to midnight
+     */
+    public static Date to00h00m00s( final Locale locale, final Date date )
+    {
+        assert ( null != date );
+        final Calendar calendar = Calendar.getInstance( locale );
+
+        return setMinimumFields( date, calendar );
+    }
+
+    /**
+     * Set the date using the given locale
+     *
+     * @param locale locale to use
+     * @param date   date to formate
+     * @return a new date set to 23h 59m 59s
+     */
+    public static Date to23h59m59s( final Locale locale, final Date date )
+    {
+        assert ( null != date );
+        final Calendar calendar = Calendar.getInstance( locale );
+
+        return setMaximumFields( date, calendar );
+    }
+
+
+    private static Date setMinimumFields( final Date date, final Calendar calendar )
+    {
+        calendar.setTime( date );
+        calendar.set( Calendar.HOUR_OF_DAY, calendar.getMinimum( Calendar.HOUR_OF_DAY ) );
+        calendar.set( Calendar.MINUTE, calendar.getMinimum( Calendar.MINUTE ) );
+        calendar.set( Calendar.SECOND, calendar.getMinimum( Calendar.SECOND ) );
+
+        return calendar.getTime();
+    }
+
+    private static Date setMaximumFields( final Date date, final Calendar calendar )
+    {
+        calendar.setTime( date );
+        calendar.set( Calendar.HOUR_OF_DAY, calendar.getMaximum( Calendar.HOUR_OF_DAY ) );
+        calendar.set( Calendar.MINUTE, calendar.getMaximum( Calendar.MINUTE ) );
+        calendar.set( Calendar.SECOND, calendar.getMaximum( Calendar.SECOND ) );
+
+        return calendar.getTime();
+    }
+
+    public static String shortFormatFrench( final Date date )
+    {
+        return formatDate( date, FRENCH_DATE_PATTERN_SHORT );
+    }
+
+    public static String shortFormat( final Date date, final Locale locale )
+    {
+        if( date == null )
+            return "";
+
+        final DateFormat dateFormat = DateFormat.getDateInstance( DateFormat.SHORT, locale );
+
+        return dateFormat.format( date );
+    }
+
+    public static String orderedFormat( final Date date )
+    {
+        return formatDate( date, ORDERED_FORMAT );
+    }
+
+    public static String orderedFormatPlusGMT( final Date date )
+    {
+        return formatDate( date, ORDERED_FORMAT_PLUS_GMT );
+    }
+
+    public static String formatDate( @Nullable final Date date, final String format )
+    {
+        if( date == null )
+            return "";
+
+        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat( format );
+        return simpleDateFormat.format( date );
+    }
+
+    @Nullable
+    public static Date parseDate( @Nullable final String date, final String format ) throws ParseException
+    {
+    	if( date == null )
+            return null;
+
+        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat( format );
+        return simpleDateFormat.parse(date);
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( DateHelper.class );
+    
+    public static final String FRENCH_DATE_PATTERN_SHORT = "dd/MM/yyyy";
+    public static final String ENGLISH_DATE_PATTERN_SHORT = "yyyy-MM-dd";
+    public static final String ENGLISH_DATE_PATTERN = "yyyy-MM-dd HH:mm";
+
+    public static final String ORDERED_FORMAT_PLUS_GMT = "yyyy-MM-dd HH:mm:ss.SSSS Z";
+    public static final String ORDERED_FORMAT = "yyyy-MM-dd HH:mm:ss.SSSS";
+}
Index: /ether_2012/common/implementation/com/ether/JSONHelperImpl.java
===================================================================
--- /ether_2012/common/implementation/com/ether/JSONHelperImpl.java	(revision 319)
+++ /ether_2012/common/implementation/com/ether/JSONHelperImpl.java	(revision 319)
@@ -0,0 +1,148 @@
+package com.ether;
+
+import java.lang.reflect.TypeVariable;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import net.sf.json.JSON;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import net.sf.json.JSONSerializer;
+import net.sf.json.JsonConfig;
+import net.sf.json.processors.JsonBeanProcessor;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.beans.factory.InitializingBean;
+
+@SuppressWarnings("rawtypes")
+public class JSONHelperImpl
+        implements JSONHelper, InitializingBean
+{
+    public JSONHelperImpl()
+    {
+        _jsonConfig = new JsonConfig();
+    }
+
+	public void afterPropertiesSet()
+            throws Exception
+    {
+        for( final Map.Entry<Class, JsonBeanProcessor> mapping : _mapping.entrySet() )
+        {
+            final Class key = mapping.getKey();
+            final JsonBeanProcessor value = mapping.getValue();
+
+            if( LOGGER.isDebugEnabled() )
+                LOGGER.debug( key + " now uses custom JSON Serializer : " + value.getClass().getName() );
+
+            _jsonConfig.registerJsonBeanProcessor( key, value );
+        }
+    }
+
+    @NotNull
+    public JSON toJSON( @NotNull final Object object )
+    {
+        if( object instanceof Throwable )
+        {
+            final Throwable throwable = (Throwable) object;
+            final Throwable throwableWrapper = new Throwable( throwable );
+            return JSONSerializer.toJSON( throwableWrapper, _jsonConfig );
+        }
+        return JSONSerializer.toJSON( object, _jsonConfig );
+    }
+
+    @NotNull
+    public JSONObject toJSONObject( @NotNull final Object object )
+    {
+        return (JSONObject) toJSON( object );
+    }
+
+    @NotNull
+    public JSONArray toJSON( @Nullable final Object[] collection )
+    {
+        return (JSONArray) JSONSerializer.toJSON( collection, _jsonConfig );
+    }
+
+    @NotNull
+    public JSONArray toJSON( @Nullable final Collection collection )
+    {
+        return (JSONArray) JSONSerializer.toJSON( collection, _jsonConfig );
+    }
+
+    @SuppressWarnings({"unchecked"})
+    @Nullable
+    public <T> T fromJSON( @NotNull final JSON json, @NotNull final Class<T> beanClass )
+    {
+        if( json.isArray() )
+        {
+            final JSONArray jsonArray = JSONArray.fromObject( json, _jsonConfig );
+            if( beanClass.isArray() )
+            {
+                final Class<?> componentType = beanClass.getComponentType();
+                //json.sf.net does not support Long[] or long[]
+                if( Long.class.equals( componentType ) || Long.TYPE.equals( componentType ) )
+                {
+                    final Integer[] integers = (Integer[]) JSONArray.toArray( jsonArray, Integer.class );
+                    if( Long.class.equals( componentType ) )
+                    {
+                        final Long[] resultArray = new Long[integers.length];
+                        for( int i = 0; i < integers.length; ++i )
+                            resultArray[i] = integers[i].longValue();
+                        return (T) resultArray;
+                    }
+                    if( Long.TYPE.equals( componentType ) )
+                    {
+                        final long[] resultArray = new long[integers.length];
+                        for( int i = 0; i < integers.length; ++i )
+                            resultArray[i] = integers[i].longValue();
+                        return (T) resultArray;
+                    }
+                }
+                return (T) JSONArray.toArray( jsonArray, componentType );
+            }
+            if( beanClass.isAssignableFrom( Collection.class ) )
+            {
+                final TypeVariable<Class<T>>[] typeParameters = beanClass.getTypeParameters();
+                if( null == typeParameters || typeParameters.length != 1 || null == typeParameters[0] )
+                    return (T) JSONArray.toCollection( jsonArray );
+                return (T) JSONArray.toCollection( jsonArray, typeParameters[0].getGenericDeclaration() );
+            }
+        }
+        final JSONObject jsonObject = JSONObject.fromObject( json, _jsonConfig );
+        return (T) JSONObject.toBean( jsonObject, beanClass, _mapClassesForDeserialization.get( beanClass ) );
+    }
+
+    public Map<Class, JsonBeanProcessor> getMapping()
+    {
+        return _mapping;
+    }
+
+    public void setMapping( final Map<Class, JsonBeanProcessor> mapping )
+    {
+        _mapping = mapping;
+    }
+
+    public Map<Class, Map<String, Class>> getMapClassesForDeserialization()
+    {
+        return _mapClassesForDeserialization;
+    }
+
+    public void setMapClassesForDeserialization( final Map<Class, Map<String, Class>> mapClassesForDeserialization )
+    {
+        _mapClassesForDeserialization = mapClassesForDeserialization;
+    }
+
+    public void setJsonConfig( final JsonConfig jsonConfig )
+    {
+        _jsonConfig = jsonConfig;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog(JSONHelperImpl.class);    
+
+    private Map<Class, JsonBeanProcessor> _mapping = Collections.emptyMap();
+    private JsonConfig _jsonConfig;
+    private Map<Class, Map<String, Class>> _mapClassesForDeserialization;
+}
Index: /ether_2012/common/implementation/com/ether/MethodDescription.java
===================================================================
--- /ether_2012/common/implementation/com/ether/MethodDescription.java	(revision 319)
+++ /ether_2012/common/implementation/com/ether/MethodDescription.java	(revision 319)
@@ -0,0 +1,73 @@
+package com.ether;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import com.ether.annotation.ControllerMethod;
+
+public class MethodDescription
+{
+    MethodDescription( @NotNull final Method method, @NotNull final ControllerMethod annotation )
+    {
+        _method = method;
+        _view = annotation.view();
+        _isJsonResult = annotation.jsonResult();
+        _params = new ArrayList<ParamDescription>();
+    }
+
+    public void addNullParam()
+    {
+        _params.add( null );
+    }
+
+    public void addParam( @NotNull final String paramName, @NotNull final Class<?> paramType, final boolean mandatory, final boolean usingJSON )
+    {
+        _params.add( new ParamDescription( paramName, paramType, mandatory, usingJSON ) );
+    }
+
+    @NotNull
+    public String getView()
+    {
+        return _view;
+    }
+
+    @NotNull
+    public Method getMethod()
+    {
+        return _method;
+    }
+
+    public Boolean isJsonResult()
+    {
+        return _isJsonResult;
+    }
+
+    @Nullable
+    public List<ParamDescription> getParams()
+    {
+        return _params;
+    }
+
+    public String getName()
+    {
+        return _method.getName();
+    }
+
+    @Override
+    public String toString()
+    {
+        return _method.toString();
+    }
+
+    @NotNull
+    private Method _method;
+    @NotNull
+    private String _view;
+    private Boolean _isJsonResult;
+    @Nullable
+    private List<ParamDescription> _params;
+}
Index: /ether_2012/common/implementation/com/ether/ParamDescription.java
===================================================================
--- /ether_2012/common/implementation/com/ether/ParamDescription.java	(revision 319)
+++ /ether_2012/common/implementation/com/ether/ParamDescription.java	(revision 319)
@@ -0,0 +1,69 @@
+package com.ether;
+
+import org.jetbrains.annotations.NotNull;
+
+
+public class ParamDescription
+{
+    ParamDescription( @NotNull final String name, @NotNull final Class<?> type, final boolean mandatory, final boolean usingJSON )
+    {
+        _usingJSON = usingJSON;
+        _name = name;
+        _type = type;
+        _mandatory = mandatory;
+    }
+
+    @NotNull
+    public String getName()
+    {
+        return _name;
+    }
+
+    public void setName( @NotNull final String name )
+    {
+        _name = name;
+    }
+
+    @NotNull
+    public Class<?> getType()
+    {
+        return _type;
+    }
+
+    public void setType( @NotNull final Class<?> type )
+    {
+        _type = type;
+    }
+
+    public boolean isMandatory()
+    {
+        return _mandatory;
+    }
+
+    public void setMandatory( final boolean mandatory )
+    {
+        _mandatory = mandatory;
+    }
+
+    public boolean isUsingJSON()
+    {
+        return _usingJSON;
+    }
+
+    public void setUsingJSON( final boolean usingJSON )
+    {
+        _usingJSON = usingJSON;
+    }
+
+    public boolean isPrimitive()
+    {
+        return _type.isPrimitive();
+    }
+
+    @NotNull
+    private String _name;
+    @NotNull
+    private Class<?> _type;
+    private boolean _mandatory;
+    private boolean _usingJSON;
+}
Index: /ether_2012/common/implementation/com/ether/ParameterConstants.java
===================================================================
--- /ether_2012/common/implementation/com/ether/ParameterConstants.java	(revision 319)
+++ /ether_2012/common/implementation/com/ether/ParameterConstants.java	(revision 319)
@@ -0,0 +1,11 @@
+package com.ether;
+
+public abstract class ParameterConstants
+{
+    public static final String PARAMETER_ID = "id";
+    public static final String PARAMETER_DATE = "date";
+    public static final String PARAMETER_CODE = "code";
+    public static final String PARAMETER_NAME = "name";
+    public static final String PARAMETER_DATE_BEGIN = "dateBegin";
+    public static final String PARAMETER_DATE_END = "dateEnd";
+}
Index: /ether_2012/common/implementation/com/ether/UTF8Charset.java
===================================================================
--- /ether_2012/common/implementation/com/ether/UTF8Charset.java	(revision 319)
+++ /ether_2012/common/implementation/com/ether/UTF8Charset.java	(revision 319)
@@ -0,0 +1,19 @@
+package com.ether;
+
+import java.nio.charset.Charset;
+
+public class UTF8Charset
+{
+    public static Charset getCharset()
+    {
+        return CHARSET;
+    }
+
+    public static String getEncoding()
+    {
+        return ENCODING;
+    }
+
+    private static final String ENCODING = "UTF-8";
+    private static final Charset CHARSET = Charset.forName( ENCODING );
+}
Index: /ether_2012/common/implementation/com/ether/WebException.java
===================================================================
--- /ether_2012/common/implementation/com/ether/WebException.java	(revision 319)
+++ /ether_2012/common/implementation/com/ether/WebException.java	(revision 319)
@@ -0,0 +1,40 @@
+package com.ether;
+
+/**
+ * @author vmipsl
+ * @date 02 feb 2011 
+ */
+public class WebException 
+	extends FormattedException
+{
+    public WebException(final Enum<? extends Code> code) {
+    	super(code);
+	}
+
+	public WebException(final Enum<? extends Code> code, final Throwable cause, final Object... parameters) {
+    	this(code, cause.getMessage(), cause, parameters);
+    }
+
+    protected WebException(final Enum<? extends Code> code, final String message, final Throwable cause, final Object... parameters) {
+    	super(prefix(code, message), cause, parameters);
+    }
+
+	public WebException(final Throwable cause) {
+		super(cause);
+	}
+
+	public WebException( final Enum<? extends Code> code, final String string) {
+		super(code, string);
+	}
+
+	public static enum WebCode implements Code 
+    {
+		UNKNOWN, 
+		PERSISTENCE, 
+		SERVICE_PROBLEM,
+		IO_EXCEPTION_ERROR_TO_GET_OUTPUTSTREAM,
+		ERROR_UNSUPPORTED_UTF8_ENCODING,
+		ERROR_NO_REQUEST_HANDLING_METHOD,
+        ERROR_NUMBER_OF_PARAM_TYPES_NOT_EQUAL_TO_PARAM_ANNOTATIONS,
+    }
+}
Index: /ether_2012/common/implementation/com/ether/WebHelper.java
===================================================================
--- /ether_2012/common/implementation/com/ether/WebHelper.java	(revision 319)
+++ /ether_2012/common/implementation/com/ether/WebHelper.java	(revision 319)
@@ -0,0 +1,77 @@
+package com.ether;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.security.InvalidParameterException;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import com.ether.WebException.WebCode;
+
+public final class WebHelper
+{
+    private WebHelper()
+    {
+    }
+
+    @NotNull
+    public static String getRequestParameter(@NotNull final HttpServletRequest httpServletRequest, @Nullable final String parameterName, @Nullable final String defaultParameterValue, final boolean canBeNull )
+    	throws InvalidParameterException
+    {
+    	String parameterValue;
+    	if(null == parameterName)
+    		parameterValue = defaultParameterValue;
+    	
+        parameterValue = httpServletRequest.getParameter( parameterName );
+
+        if( parameterValue == null )
+            parameterValue = defaultParameterValue;
+
+        if( !canBeNull && parameterValue == null )
+            throw new InvalidParameterException( parameterName );
+
+        return parameterValue;
+    }
+
+    public static void writeJsonToResponse( @NotNull final HttpServletResponse httpServletResponse, @NotNull final String data )
+            throws IOException
+    {
+        httpServletResponse.setCharacterEncoding( UTF8Charset.getEncoding() );
+        httpServletResponse.setContentType( CONTENT_TYPE_TEXT_JSON );
+
+        final PrintWriter writer = httpServletResponse.getWriter();
+
+        writer.write( JSON_TAG_BEGIN );
+        writer.write( data );
+        writer.write( JSON_TAG_END );
+    }
+
+    public static void displayAjaxError(@NotNull final HttpServletResponse response, @Nullable final String methodName) 
+    	throws WebException
+    {		
+    	try {
+    		response.setStatus(HttpServletResponse.SC_NOT_IMPLEMENTED);
+    		response.setCharacterEncoding(UTF8Charset.getEncoding());
+    		response.setContentType("text/plain;charset="+ UTF8Charset.getEncoding());
+    		final ServletOutputStream outputStream = response.getOutputStream();
+    		outputStream.print("error.method_not_implemented : " + methodName+ " is not implemented.");
+    		outputStream.flush();
+    		outputStream.close();
+    	} catch (IOException e) {
+    		throw new WebException(WebCode.IO_EXCEPTION_ERROR_TO_GET_OUTPUTSTREAM, e);
+    	}
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( WebHelper.class );
+    
+    private static final String CONTENT_TYPE_TEXT_JSON = "text/javascript;charset=" + UTF8Charset.getEncoding();
+    private static final char JSON_TAG_BEGIN = ' ' ;  // '(';
+    private static final char JSON_TAG_END = ' ';     // ')';
+}
Index: /ether_2012/common/implementation/com/ether/annotation/ControllerMethod.java
===================================================================
--- /ether_2012/common/implementation/com/ether/annotation/ControllerMethod.java	(revision 319)
+++ /ether_2012/common/implementation/com/ether/annotation/ControllerMethod.java	(revision 319)
@@ -0,0 +1,19 @@
+package com.ether.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.jetbrains.annotations.NotNull;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface ControllerMethod
+{
+	@NotNull
+    String view() default "";
+
+	@NotNull
+    boolean jsonResult() default false;
+}
Index: /ether_2012/common/implementation/com/ether/annotation/Mandatory.java
===================================================================
--- /ether_2012/common/implementation/com/ether/annotation/Mandatory.java	(revision 319)
+++ /ether_2012/common/implementation/com/ether/annotation/Mandatory.java	(revision 319)
@@ -0,0 +1,12 @@
+package com.ether.annotation;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+public @interface Mandatory
+{
+}
Index: /ether_2012/common/implementation/com/ether/annotation/ParamName.java
===================================================================
--- /ether_2012/common/implementation/com/ether/annotation/ParamName.java	(revision 319)
+++ /ether_2012/common/implementation/com/ether/annotation/ParamName.java	(revision 319)
@@ -0,0 +1,13 @@
+package com.ether.annotation;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+public @interface ParamName
+{
+    String value();
+}
Index: /ether_2012/common/implementation/com/ether/annotation/UseJSON.java
===================================================================
--- /ether_2012/common/implementation/com/ether/annotation/UseJSON.java	(revision 319)
+++ /ether_2012/common/implementation/com/ether/annotation/UseJSON.java	(revision 319)
@@ -0,0 +1,12 @@
+package com.ether.annotation;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+public @interface UseJSON
+{
+}
Index: /ether_2012/common/implementation/log4j.xml
===================================================================
--- /ether_2012/common/implementation/log4j.xml	(revision 319)
+++ /ether_2012/common/implementation/log4j.xml	(revision 319)
@@ -0,0 +1,74 @@
+<?com.medias.xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" threshold="all" debug="true">
+
+    <appender name="console" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="LOG4J %p %d{ISO8601} - %c{1} - %m%n"/>
+        </layout>
+    </appender>
+
+    <appender name="file" class="org.apache.log4j.FileAppender">
+        <param name="file" value="/home_local/workspaces/log4j_Project_source.log"/>
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="LOG4J %p %d{ISO8601} - %c{1} - %m%n"/>
+        </layout>
+    </appender>
+
+    <appender name="consoleHibernate" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="HIBERNATE : %p %d{ISO8601} - %c{1} - %m%n"/>
+        </layout>
+    </appender>
+ 
+    <!-- library loggers -->
+    <logger name="oracle.jdbc" additivity="false">
+        <level value="info"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="console"/>
+    </logger>
+
+    <logger name="oracle.ons" additivity="false">
+        <level value="debug"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="console"/>
+    </logger>
+
+    <logger name="org.hibernate">
+        <level value="trace"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="consoleHibernate"/>
+    </logger>
+
+<!--    <logger name="org.hibernate.persister.entity" additivity="false">-->
+<!--        <level value="trace"/>-->
+<!--        <appender-ref ref="file"/>-->
+<!--        <appender-ref ref="consoleHibernate"/>-->
+<!--    </logger>-->
+<!---->
+<!--	<logger name="org.hibernate.type">-->
+<!--        <level value="trace"/>-->
+<!--        <appender-ref ref="file"/>-->
+<!--        <appender-ref ref="consoleHibernate"/>-->
+<!--    </logger>-->
+<!--    -->
+<!--    <logger name="org.hibernate.SQL">-->
+<!--        <level value="trace"/>-->
+<!--        <appender-ref ref="file"/>-->
+<!--        <appender-ref ref="consoleHibernate"/>-->
+<!--    </logger>-->
+
+    <logger name="net.sf.cglib" additivity="false">
+        <level value="warn"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="console"/>
+    </logger>
+
+    <!-- root logger -->
+    <root>
+        <level value="warn"/>
+        <appender-ref ref="console"/>
+        <appender-ref ref="file"/>
+    </root>
+
+</log4j:configuration>
Index: /ether_2012/common/interface/com/ether/FormattedException.java
===================================================================
--- /ether_2012/common/interface/com/ether/FormattedException.java	(revision 319)
+++ /ether_2012/common/interface/com/ether/FormattedException.java	(revision 319)
@@ -0,0 +1,72 @@
+package com.ether;
+
+import java.util.Formatter;
+import java.util.Locale;
+
+@SuppressWarnings("serial")
+public class FormattedException extends Exception
+{
+    public FormattedException(final Object... parameters) {
+    	this(Locale.getDefault(), DEFAULT_MESSAGE, DEFAULT_THROWABLE, parameters);
+    }
+
+    public FormattedException(final Locale locale, final Object... parameters) {
+    	this(locale, DEFAULT_MESSAGE, DEFAULT_THROWABLE, parameters);
+    }
+
+    public FormattedException(final String message, final Object... parameters) {
+    	this(Locale.getDefault(), message, DEFAULT_THROWABLE, parameters);
+    }
+
+    public FormattedException(final Locale locale, final String message, final Object... parameters) {
+    	this(locale, message, null, parameters);
+    }
+
+    public FormattedException(final Throwable throwable, final Object... parameters) {
+    	this(Locale.getDefault(), throwable.getMessage(), throwable, parameters);
+    }
+
+    public FormattedException(final String message, final Throwable throwable, final Object... parameters) {
+    	this(Locale.getDefault(), message, throwable, parameters);
+    }
+
+    public FormattedException(final Locale locale, final String message, final Throwable throwable, final Object... parameters) {
+    	super(format(locale, message, parameters), throwable);
+    }
+
+    private static String format(final Locale locale, final String message, final Object[] parameters)
+    {
+    	final StringBuilder stringBuilder = new StringBuilder();
+    	final Formatter formatter = new Formatter(stringBuilder);
+    	formatter.format(locale, message, parameters);
+    	return stringBuilder.toString();
+    }
+
+    /**
+     * Prefixes the message with code if not null.
+     */
+    public static String prefix(final Enum<? extends Code> code, final String message)
+    {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		if (code != null) {
+			stringBuffer.append(code.toString());
+			stringBuffer.append(" - ");
+		}
+
+		stringBuffer.append(message);
+		return stringBuffer.toString();
+    }
+
+    /**
+     * The error code, it identifies the type of error. 
+     * The derived classes must creates their own code as enum and implements this interface. 
+     * If the subclass is not an enum it won't be recognized by the constructor.
+     */
+    public static interface Code
+    {
+    }
+
+    public static String DEFAULT_MESSAGE = "no message";
+    public static String DEFAULT_THROWABLE = null;
+}
Index: /ether_2012/common/interface/com/ether/JSONHelper.java
===================================================================
--- /ether_2012/common/interface/com/ether/JSONHelper.java	(revision 319)
+++ /ether_2012/common/interface/com/ether/JSONHelper.java	(revision 319)
@@ -0,0 +1,26 @@
+package com.ether;
+
+import net.sf.json.JSON;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collection;
+
+public interface JSONHelper
+{
+    @NotNull
+    JSON toJSON( @NotNull final Object object );
+
+    @NotNull
+    JSONObject toJSONObject( @NotNull final Object object );
+
+    JSONArray toJSON( @Nullable final Object[] collection );
+
+    @NotNull
+    JSONArray toJSON( @Nullable final Collection collection );
+
+    @Nullable
+    <T> T fromJSON( @NotNull final JSON json, @NotNull final Class<T> beanClass );
+}
Index: /ether_2012/common/test/com/ether/TestHelper.java
===================================================================
--- /ether_2012/common/test/com/ether/TestHelper.java	(revision 319)
+++ /ether_2012/common/test/com/ether/TestHelper.java	(revision 319)
@@ -0,0 +1,123 @@
+package com.ether;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public abstract class TestHelper<BEAN>
+{
+    protected TestHelper(final String beanContextName, final String beanName, final String[] otherContextNames) {
+	_beanContextName = beanContextName;
+	_beanName = beanName;
+	_otherContextNames = otherContextNames;
+    }
+
+    protected abstract void beforeBeanTest() throws Exception;
+
+    protected abstract void afterBeanTest() throws Exception;
+
+    @Before
+    public final void beforeTest() throws Exception
+    {
+	Assert.assertNotNull(getApplicationContext());
+	Assert.assertNotNull(getBean());
+	beforeBeanTest();
+    }
+
+    @After
+    public final void afterTest() throws Exception
+    {
+	afterBeanTest();
+	_bean = null;
+    }
+    
+    @AfterClass
+    public static void afterAllTest() throws Exception
+    {
+	try
+	{
+	    if (_applicationContext != null) _applicationContext.close();
+	}
+	finally
+	{
+	    _applicationContext = null;
+	}
+    }
+
+    /**
+     * Builds context names from 2 context name arrays.
+     * 
+     * @param baseContextNames : the base context names.
+     * @param otherContextNames : the other context names.
+     * @return a context name array.
+     */
+    protected static String[] buildContextNames(
+	    final String[] baseContextNames, final String... otherContextNames)
+    {
+	int contextNameSize = baseContextNames == null ? 0 : baseContextNames.length;
+	contextNameSize += otherContextNames == null ? 0 : otherContextNames.length;
+
+	final String[] contextNames = new String[contextNameSize];
+
+	if (baseContextNames != null)
+	    System.arraycopy(baseContextNames, 0, contextNames, 0, baseContextNames.length);
+
+	if (otherContextNames != null)
+	{
+	    if (baseContextNames != null)
+		System.arraycopy(otherContextNames, 0, contextNames, baseContextNames.length, otherContextNames.length);
+	    else
+		System.arraycopy(otherContextNames, 0, contextNames, 0, otherContextNames.length);
+	}
+
+	return contextNames;
+    }
+
+    protected final ApplicationContext getApplicationContext()
+    {
+	if (_applicationContext == null)
+	{
+	    final String[] contextNames;
+
+	    if (_otherContextNames != null)
+	    {
+		if (_beanContextName != null)
+		    contextNames = buildContextNames(_otherContextNames, _beanContextName);
+		else
+		    contextNames = buildContextNames(_otherContextNames);
+	    }
+	    else
+	    {
+		contextNames = new String[] { _beanContextName };
+	    }
+
+	    _applicationContext = new ClassPathXmlApplicationContext(contextNames);
+	}
+
+	return _applicationContext;
+    }
+
+    @SuppressWarnings({ "unchecked" })
+    protected final BEAN getBean()
+    {
+	if (_bean == null)
+	    _bean = (BEAN) getApplicationContext().getBean(_beanName);
+
+	return _bean;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( TestHelper.class );
+    
+    private static AbstractApplicationContext _applicationContext;
+
+    private String _beanContextName;
+    private String _beanName;
+    private String[] _otherContextNames;
+    private BEAN _bean;
+}
Index: /ether_2012/domain/Domain.iml
===================================================================
--- /ether_2012/domain/Domain.iml	(revision 319)
+++ /ether_2012/domain/Domain.iml	(revision 319)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/interface" isTestSource="false" />
+    </content>
+    <orderEntry type="jdk" jdkName="1.6" jdkType="JavaSDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="Common" />
+    <orderEntry type="library" name="lib_common" level="project" />
+  </component>
+</module>
+
Index: /ether_2012/domain/interface/com/ether/Parameter.java
===================================================================
--- /ether_2012/domain/interface/com/ether/Parameter.java	(revision 319)
+++ /ether_2012/domain/interface/com/ether/Parameter.java	(revision 319)
@@ -0,0 +1,60 @@
+package com.ether;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Set;
+
+/**
+ * @author vmipsl
+ * @date may 2011
+ * Example for a domain class
+ */
+public class Parameter
+{
+    public Parameter(){}
+
+    public Parameter( final Integer id, @Nullable final String name )
+    {
+        _id = id;
+        _name = name;
+    }
+
+    public Integer getId()
+    {
+        return _id;
+    }
+
+    public void setId( final Integer id )
+    {
+        _id = id;
+    }
+
+    @Nullable
+    public String getName()
+    {
+        return _name;
+    }
+
+    public void setName( @Nullable final String name )
+    {
+        _name = name;
+    }
+
+    @Nullable
+    public Set<Plateform> getPlateformes()
+    {
+        return _plateformes;
+    }
+
+    public void setPlateformes( @Nullable final Set<Plateform> plateformes )
+    {
+        _plateformes = plateformes;
+    }
+
+    private Integer _id;
+    @Nullable
+    private String _name;
+    @Nullable
+    private Set<Plateform> _plateformes;
+}
Index: /ether_2012/domain/interface/com/ether/Plateform.java
===================================================================
--- /ether_2012/domain/interface/com/ether/Plateform.java	(revision 319)
+++ /ether_2012/domain/interface/com/ether/Plateform.java	(revision 319)
@@ -0,0 +1,37 @@
+package com.ether;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vmipsl
+ * @date may 2011
+ * Example for a domain class
+ */
+public class Plateform
+{
+    public Integer getId()
+    {
+        return _id;
+    }
+
+    public void setId( final Integer id )
+    {
+        _id = id;
+    }
+
+    @Nullable
+    public String getName()
+    {
+        return _name;
+    }
+
+    public void setName( @Nullable final String name )
+    {
+        _name = name;
+    }
+
+    private Integer _id;
+    @Nullable
+    private String _name;
+}
Index: /ether_2012/ether.iml
===================================================================
--- /ether_2012/ether.iml	(revision 319)
+++ /ether_2012/ether.iml	(revision 319)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="hibernate" name="Hibernate">
+      <configuration>
+        <datasource-map>
+          <unit-entry name="sessionFactory" />
+        </datasource-map>
+      </configuration>
+    </facet>
+    <facet type="web" name="Web">
+      <configuration>
+        <descriptors>
+          <deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/web/WEB-INF/web.xml" />
+        </descriptors>
+        <webroots>
+          <root url="file://$MODULE_DIR$/web" relative="/" />
+        </webroots>
+      </configuration>
+    </facet>
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" scope="PROVIDED" name="Tomcat 6" level="application_server_libraries" />
+    <orderEntry type="library" name="3.0.0" level="project" />
+  </component>
+</module>
+
Index: /ether_2012/ether.ipr
===================================================================
--- /ether_2012/ether.ipr	(revision 319)
+++ /ether_2012/ether.ipr	(revision 319)
@@ -0,0 +1,2469 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AntConfiguration">
+    <defaultAnt bundledAnt="true" />
+  </component>
+  <component name="ArtifactManager">
+    <artifact type="exploded-war" build-on-make="true" name="ether">
+      <output-path>$PROJECT_DIR$/web</output-path>
+      <root id="root">
+        <element id="directory" name="WEB-INF">
+          <element id="directory" name="classes">
+            <element id="module-output" name="Project_source" />
+            <element id="module-output" name="Persistence" />
+            <element id="module-output" name="Domain" />
+            <element id="module-output" name="Common" />
+            <element id="module-output" name="Service" />
+            <element id="module-output" name="Web" />
+          </element>
+          <element id="directory" name="lib">
+            <element id="library" level="project" name="3.0.0" />
+            <element id="library" level="project" name="lib_spring" />
+            <element id="library" level="project" name="lib_hibernate" />
+          </element>
+        </element>
+        <element id="javaee-facet-resources" facet="Web/web/Web" />
+      </root>
+    </artifact>
+  </component>
+  <component name="CompilerConfiguration">
+    <option name="DEFAULT_COMPILER" value="Javac" />
+    <resourceExtensions />
+    <wildcardResourcePatterns>
+      <entry name="?*.properties" />
+      <entry name="?*.xml" />
+      <entry name="?*.gif" />
+      <entry name="?*.png" />
+      <entry name="?*.jpeg" />
+      <entry name="?*.jpg" />
+      <entry name="?*.html" />
+      <entry name="?*.dtd" />
+      <entry name="?*.tld" />
+      <entry name="?*.ftl" />
+    </wildcardResourcePatterns>
+    <annotationProcessing enabled="false" useClasspath="true" />
+  </component>
+  <component name="CopyrightManager" default="">
+    <module2copyright />
+  </component>
+  <component name="DependencyValidationManager">
+    <option name="SKIP_IMPORT_STATEMENTS" value="false" />
+  </component>
+  <component name="Encoding" useUTFGuessing="false" native2AsciiForPropertiesFiles="false" />
+  <component name="EntryPointsManager">
+    <entry_points version="2.0" />
+  </component>
+  <component name="FacetAutodetectingManager">
+    <autodetection-disabled>
+      <facet-type id="struts">
+        <modules>
+          <module name="Web">
+            <files>
+              <file url="file://$PROJECT_DIR$/web/WEB-INF/struts-config.xml" />
+            </files>
+          </module>
+        </modules>
+      </facet-type>
+    </autodetection-disabled>
+  </component>
+  <component name="IdProvider" IDEtalkID="215BACF2F5EDEB9751C4545939D1DDBF" />
+  <component name="InspectionProjectProfileManager">
+    <profiles>
+      <profile version="1.0" is_locked="true">
+        <option name="myName" value="Project Default" />
+        <option name="myLocal" value="false" />
+        <inspection_tool class="AbstractBeanReferencesInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="AbstractClassExtendsConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractClassNeverImplemented" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractClassWithOnlyOneDirectInheritor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractClassWithoutAbstractMethods" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractMethodCallInConstructor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractMethodOverridesAbstractMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractMethodOverridesConcreteMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractMethodWithMissingImplementations" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AccessStaticViaInstance" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AccessToNonThreadSafeStaticFieldFromInstance" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="nonThreadSafeTypes" value="java.text.DateFormat,java.util.Calendar" />
+        </inspection_tool>
+        <inspection_tool class="AccessToStaticFieldLockedOnInstance" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AmbiguousMethodCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AndroidDomInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="Annotation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AnnotationClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AnnotationNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="Annotator" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="AnonymousClassComplexity" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="AnonymousClassMethodCount" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_limit" value="1" />
+        </inspection_tool>
+        <inspection_tool class="AnonymousClassVariableHidesContainingMethodVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AnonymousFunctionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AnonymousInnerClass" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="AnonymousInnerClassMayBeStatic" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AntDuplicateImportedTargetsInspection" level="WARNING" enabled="true" />
+        <inspection_tool class="AntDuplicateTargetsInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="AntMissingPropertiesFileInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="AntResolveInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="AppEngineForbiddenCode" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ArchaicSystemPropertyAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ArgNamesErrorsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ArgNamesWarningsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ArithmeticOnVolatileField" level="WARNING" enabled="false" />
+        <inspection_tool class="AroundAdviceStyleInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ArrayEquals" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ArrayLengthInLoopCondition" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssertAsName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssertEqualsBetweenInconvertibleTypes" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="AssertEqualsCalledOnArray" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssertEqualsMayBeAssertSame" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssertStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssertWithSideEffects" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssertsWithoutMessages" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentResultUsedJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentToCatchBlockParameter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentToCollectionFieldFromParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignorePrivateMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="AssignmentToDateFieldFromParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignorePrivateMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="AssignmentToForLoopParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_checkForeachParameters" value="false" />
+        </inspection_tool>
+        <inspection_tool class="AssignmentToForLoopParameterJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentToFunctionParameterJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentToMethodParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreTransformationOfOriginalParameter" value="false" />
+        </inspection_tool>
+        <inspection_tool class="AssignmentToNull" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentToStaticFieldFromInstanceMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentUsedAsCondition" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AutoBoxing" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreAddedToCollection" value="false" />
+        </inspection_tool>
+        <inspection_tool class="AutoUnboxing" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AutowiredDependenciesInspection" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="AwaitNotInLoop" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AwaitWithoutCorrespondingSignal" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BadExceptionCaught" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="exceptionsString" value="java.lang.NullPointerException,java.lang.IllegalMonitorStateException,java.lang.ArrayIndexOutOfBoundsException" />
+        </inspection_tool>
+        <inspection_tool class="BadExceptionDeclared" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="exceptionsString" value="java.lang.Throwable,java.lang.Exception,java.lang.Error,java.lang.RuntimeException,java.lang.NullPointerException,java.lang.ClassCastException,java.lang.ArrayIndexOutOfBoundsException" />
+          <option name="ignoreTestCases" value="false" />
+        </inspection_tool>
+        <inspection_tool class="BadExceptionThrown" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="exceptionsString" value="java.lang.Throwable,java.lang.Exception,java.lang.Error,java.lang.RuntimeException,java.lang.NullPointerException,java.lang.ClassCastException,java.lang.ArrayIndexOutOfBoundsException" />
+        </inspection_tool>
+        <inspection_tool class="BadExpressionStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="BadOddness" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BeforeClassOrAfterClassIsPublicStaticVoidNoArg" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BeforeOrAfterIsPublicVoidNoArg" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BigDecimalEquals" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BindingAnnotationWithoutInject" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BlockStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BooleanConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="BooleanMethodIsAlwaysInverted" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BooleanMethodNameMustStartWithQuestion" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreBooleanMethods" value="false" />
+          <option name="ignoreInAnnotationInterface" value="true" />
+          <option name="onlyWarnOnBaseMethods" value="true" />
+          <option name="questionString" value="is,can,has,should,could,will,shall,check,contains,equals,add,put,remove,startsWith,endsWith,does" />
+        </inspection_tool>
+        <inspection_tool class="BoundFieldAssignment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BoxingBoxedValue" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BreakStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BreakStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BreakStatementWithLabel" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BreakStatementWithLabelJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BusyWait" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BvConfigDomInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="BvConstraintMappingsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CStyleArrayDeclaration" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CachedNumberConstructorCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CallToNativeMethodWhileLocked" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CallToSimpleGetterInClass" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreGetterCallsOnOtherObjects" value="true" />
+        </inspection_tool>
+        <inspection_tool class="CallToSimpleSetterInClass" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreSetterCallsOnOtherObjects" value="true" />
+        </inspection_tool>
+        <inspection_tool class="CallToStringConcatCanBeReplacedByOperator" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CallerJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CanBeFinal" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="REPORT_CLASSES" value="false" />
+          <option name="REPORT_METHODS" value="false" />
+          <option name="REPORT_FIELDS" value="true" />
+        </inspection_tool>
+        <inspection_tool class="CastConflictsWithInstanceof" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CastThatLosesPrecision" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreIntegerCharCasts" value="false" />
+        </inspection_tool>
+        <inspection_tool class="CastToConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CastToIncompatibleInterface" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CatchGenericClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CaughtExceptionImmediatelyRethrown" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CdiDecoratorInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiDisposerMethodInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiInjectInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiInjectionPointsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CdiInterceptorInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiManagedBeanInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiNormalScopeInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CdiObservesInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiSpecializesInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiStereotypeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiStereotypeRestrictionsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiTypedAnnotationInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiUnproxyableBeanTypesInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CfmlReferenceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ChainedEquality" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ChainedEqualityJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ChainedFunctionCallJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ChainedMethodCall" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreFieldInitializations" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ChannelResource" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="insideTryAllowed" value="false" />
+        </inspection_tool>
+        <inspection_tool class="CharUsedInArithmeticContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CharacterComparison" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CheckDtdRefs" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CheckEmptyScriptTag" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CheckForOutOfMemoryOnLargeArrayAllocation" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="64" />
+        </inspection_tool>
+        <inspection_tool class="CheckImageSize" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CheckJsfComponentUnderViewTag" level="INFO" enabled="true" />
+        <inspection_tool class="CheckNodeTest" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CheckTagEmptyBody" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CheckValidXmlInScriptTagBody" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="CheckXmlFileWithXercesValidator" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CheckedExceptionClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassComplexity" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_limit" value="80" />
+        </inspection_tool>
+        <inspection_tool class="ClassCoupling" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_includeJavaClasses" value="false" />
+          <option name="m_includeLibraryClasses" value="false" />
+          <option name="m_limit" value="15" />
+        </inspection_tool>
+        <inspection_tool class="ClassEscapesItsScope" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassHasNoToStringMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="excludeClassNames" value="" />
+          <option name="excludeException" value="true" />
+          <option name="excludeDeprecated" value="true" />
+          <option name="excludeEnum" value="false" />
+          <option name="excludeAbstract" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ClassInTopLevelPackage" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassInheritanceDepth" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="2" />
+        </inspection_tool>
+        <inspection_tool class="ClassInitializer" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassInitializerMayBeStatic" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassLoaderInstantiation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassMayBeInterface" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassNameDiffersFromFileName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassNamePrefixedWithPackageName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassNameSameAsAncestorName" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ClassNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="2" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="ClassNestingDepth" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_limit" value="1" />
+        </inspection_tool>
+        <inspection_tool class="ClassNewInstance" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassReferencesSubclass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassUnconnectedToPackage" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassWithMultipleLoggers" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="loggerNamesString" value="java.util.logging.Logger,org.slf4j.Logger,org.apache.commons.logging.Log,org.apache.log4j.Logger" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithTooManyDependencies" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithTooManyDependents" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithTooManyTransitiveDependencies" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="35" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithTooManyTransitiveDependents" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="35" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithoutConstructor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassWithoutLogger" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="loggerNamesString" value="java.util.logging.Logger,org.slf4j.Logger,org.apache.commons.logging.Log,org.apache.log4j.Logger" />
+          <option name="ignoreSuperLoggers" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithoutNoArgConstructor" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreClassesWithNoConstructors" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithoutToString" level="WARNING" enabled="false" />
+        <inspection_tool class="CloneCallsConstructors" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CloneCallsSuperClone" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CloneDeclaresCloneNotSupported" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CloneInNonCloneableClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CloneableClassInSecureContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CloneableImplementsClone" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreCloneableDueToInheritance" value="false" />
+        </inspection_tool>
+        <inspection_tool class="CollectionAddedToSelf" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CollectionContainsUrl" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CollectionsFieldAccessReplaceableByMethodCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CollectionsMustHaveInitialCapacity" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CommaExpressionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ComparableImplementedButEqualsNotOverridden" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ComparatorMethodParameterNotUsed" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ComparatorNotSerializable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CompareToUsesNonFinalVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ComparisonOfShortAndChar" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ComparisonToNaN" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ComponentNotRegistered" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="CHECK_ACTIONS" value="true" />
+          <option name="IGNORE_NON_PUBLIC" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ConditionSignal" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConditionalExpression" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreSimpleAssignmentsAndReturns" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ConditionalExpressionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConditionalExpressionWithIdenticalBranches" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConditionalExpressionWithIdenticalBranchesJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConflictingAnnotations" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConfusingElse" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConfusingFloatingPointLiteral" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConfusingFloatingPointLiteralJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConfusingMainMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConfusingOctalEscape" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConfusingPlusesOrMinusesJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConnectionResource" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantAssertCondition" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantConditionalExpression" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ConstantConditionalExpressionJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ConstantConditions" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="SUGGEST_NULLABLE_ANNOTATIONS" value="false" />
+          <option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ConstantDeclaredInAbstractClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantDeclaredInInterface" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantIfStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ConstantIfStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ConstantJUnitAssertArgument" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantMathCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="onlyCheckImmutables" value="false" />
+          <option name="m_regex" value="[A-Z_\d]*" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="ConstantOnLHSOfComparison" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantOnLHSOfComparisonJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantOnRHSOfComparison" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantOnRHSOfComparisonJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ConstantStringIntern" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantValueVariableUse" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstraintValidatorCreator" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstructorCount" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="ContextComponentScanInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ContinueOrBreakFromFinallyBlock" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ContinueOrBreakFromFinallyBlockJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ContinueStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ContinueStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ContinueStatementWithLabel" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ContinueStatementWithLabelJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ControlFlowStatementWithoutBraces" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConvertAnnotations" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConvertJavadoc" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConvertOldAnnotations" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CovariantCompareTo" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CovariantEquals" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CriteriaApiResolveInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CssConvertColorToHexInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CssConvertColorToRgbInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CssInvalidElementInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CssInvalidHtmlTagReferenceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CssInvalidImportInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CssInvalidShorthandPropertyValue" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CssNegativeValueInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CssNoGenericFontName" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CssOptimizeSimilarPropertiesInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="CssOverwrittenProperties" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CssRgbFunctionInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CssUnitlessNumber" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CssUnknownProperty" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="myCustomPropertiesEnabled" value="false" />
+          <option name="myIgnoreVendorSpecificProperties" value="false" />
+          <option name="myCustomPropertiesList">
+            <value>
+              <list size="0" />
+            </value>
+          </option>
+        </inspection_tool>
+        <inspection_tool class="CssUnusedSymbolInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CustomClassloader" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CustomSecurityManager" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CyclicClassDependency" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CyclicPackageDependency" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CyclomaticComplexity" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="CyclomaticComplexityJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="DateToString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DebuggerStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DeclareCollectionAsInterface" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreLocalVariables" value="false" />
+          <option name="ignorePrivateMethodsAndFields" value="false" />
+        </inspection_tool>
+        <inspection_tool class="DeclareParentsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="DefaultFileTemplate" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="CHECK_FILE_HEADER" value="true" />
+          <option name="CHECK_TRY_CATCH_SECTION" value="true" />
+          <option name="CHECK_METHOD_BODY" value="true" />
+        </inspection_tool>
+        <inspection_tool class="DefaultNotLastCaseInSwitch" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DefaultNotLastCaseInSwitchJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="Dependency" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="Deprecation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="DeserializableClassInSecureContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DesignForExtension" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DisjointPackage" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DivideByZero" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DivideByZeroJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DocumentWriteJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DollarSignInName" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="DoubleCheckedLocking" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreOnVolatileVariables" value="false" />
+        </inspection_tool>
+        <inspection_tool class="DoubleLiteralMayBeFloatLiteral" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DoubleNegation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DriverManagerGetConnection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DuplicateBooleanBranch" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DuplicateCaseLabelJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="DuplicateCondition" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreMethodCalls" value="false" />
+        </inspection_tool>
+        <inspection_tool class="DuplicateConditionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DuplicateMnemonic" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DuplicatePropertyInspection" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="CURRENT_FILE" value="true" />
+          <option name="MODULE_WITH_DEPENDENCIES" value="false" />
+          <option name="CHECK_DUPLICATE_VALUES" value="true" />
+          <option name="CHECK_DUPLICATE_KEYS" value="true" />
+          <option name="CHECK_DUPLICATE_KEYS_WITH_DIFFERENT_VALUES" value="true" />
+        </inspection_tool>
+        <inspection_tool class="DuplicatePropertyOnObjectJS" level="WARNING" enabled="true" />
+        <inspection_tool class="DuplicateStringLiteralInspection" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="MIN_STRING_LENGTH" value="5" />
+          <option name="IGNORE_PROPERTY_KEYS" value="false" />
+        </inspection_tool>
+        <inspection_tool class="DuplicateThrows" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="DuplicatedBeanNamesInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="DynamicRegexReplaceableByCompiledPattern" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DynamicallyGeneratedCodeJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ELDeferredExpressionsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ELMethodSignatureInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ELSpecValidationInJSP" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ELValidationInJSP" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EjbClassBasicInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbClassWarningsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EjbDomInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="EjbEntityClassInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbEntityHomeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbEntityInterfaceInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbEnvironmentInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbErrorInspection" level="ERROR" enabled="true" />
+        <inspection_tool class="EjbInterceptorInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbInterceptorWarningsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EjbInterfaceMethodInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbInterfaceSignatureInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbProhibitedPackageUsageInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EjbQlInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="EjbRemoteRequirementsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbSessionHomeInterfaceInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbStaticAccessInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EjbThisExpressionInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EjbWarningInspection" level="WARNING" enabled="true" />
+        <inspection_tool class="EmptyCatchBlock" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_includeComments" value="true" />
+          <option name="m_ignoreTestCases" value="true" />
+          <option name="m_ignoreIgnoreParameter" value="true" />
+        </inspection_tool>
+        <inspection_tool class="EmptyCatchBlockJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EmptyClass" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EmptyFinallyBlock" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EmptyFinallyBlockJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EmptyInitializer" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EmptyMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EmptyStatementBody" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_reportEmptyBlocks" value="false" />
+        </inspection_tool>
+        <inspection_tool class="EmptyStatementBodyJS" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_reportEmptyBlocks" value="false" />
+        </inspection_tool>
+        <inspection_tool class="EmptySynchronizedStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EmptyTryBlock" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EmptyTryBlockJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EmptyWebServiceClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EnumAsName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EnumClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EnumSwitchStatementWhichMissesCases" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreSwitchStatementsWithDefault" value="false" />
+        </inspection_tool>
+        <inspection_tool class="EnumeratedClassNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="EnumeratedConstantNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="5" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="EnumerationCanBeIteration" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EqualityComparisonWithCoercionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EqualsAndHashcode" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EqualsBetweenInconvertibleTypes" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EqualsCalledOnEnumConstant" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EqualsHashCodeCalledOnUrl" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EqualsUsesNonFinalVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EqualsWhichDoesntCheckParameterClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ErrorRethrown" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ExceptionCaughtLocallyJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ExceptionFromCatchWhichDoesntWrap" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreGetMessage" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ExceptionNameDoesntEndWithException" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ExpectedExceptionNeverThrown" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ExtendsAnnotation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ExtendsConcreteCollection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ExtendsObject" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ExtendsThread" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ExtendsUtilityClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ExternalizableWithSerializationMethods" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FaceletsDetectingInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FacesModelInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="FallthroughInSwitchStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FallthruInSwitchStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FeatureEnvy" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreTestCases" value="false" />
+        </inspection_tool>
+        <inspection_tool class="FieldAccessNotGuarded" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FieldAccessedSynchronizedAndUnsynchronized" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="countGettersAndSetters" value="false" />
+        </inspection_tool>
+        <inspection_tool class="FieldCanBeLocal" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FieldCount" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_countConstantFields" value="false" />
+          <option name="m_considerStaticFinalFieldsConstant" value="false" />
+          <option name="m_limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="FieldHasSetterButNoGetter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FieldHidesSuperclassField" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreInvisibleFields" value="true" />
+        </inspection_tool>
+        <inspection_tool class="FieldMayBeFinal" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FieldMayBeStatic" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FieldNotUsedInToString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FieldRepeatedlyAccessed" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreFinalFields" value="false" />
+        </inspection_tool>
+        <inspection_tool class="FinalClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FinalMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FinalMethodInFinalClass" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FinalPrivateMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FinalStaticMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="Finalize" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreTrivialFinalizers" value="true" />
+        </inspection_tool>
+        <inspection_tool class="FinalizeCallsSuperFinalize" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreObjectSubclasses" value="false" />
+          <option name="ignoreTrivialFinalizers" value="true" />
+        </inspection_tool>
+        <inspection_tool class="FinalizeNotProtected" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FinallyBlockCannotCompleteNormally" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FlexUnitClassInProductSourceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitClassVisibilityInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitClassWithNoTestsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitEmptySuiteInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMethodHasParametersInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMethodInSuiteInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMethodIsPropertyInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMethodIsStaticInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMethodReturnTypeInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMethodVisibilityInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMixedAPIInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitRunnerClassInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitSuiteWithNoRunnerInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FloatingPointEquality" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ForCanBeForeach" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="REPORT_INDEXED_LOOP" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ForLoopReplaceableByWhile" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreLoopsWithoutConditions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ForLoopReplaceableByWhileJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreLoopsWithoutConditions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ForLoopThatDoesntUseLoopVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ForLoopThatDoesntUseLoopVariableJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ForLoopWithMissingComponent" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreCollectionLoops" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ForeachStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FtlCallsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="FtlDeprecatedBuiltInsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FtlFileReferencesInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="FtlImportCallInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="FtlReferencesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FtlTypesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FtlWellformednessInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="FunctionNamingConventionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="FunctionWithInconsistentReturnsJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FunctionWithMultipleLoopsJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FunctionWithMultipleReturnPointsJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GWTRemoteServiceAsyncCheck" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GWTStyleCheck" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="Geronimo" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="Glassfish" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GrFieldAlreadyDefined" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyAccessToStaticFieldLockedOnInstance" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyAnnotationNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="GroovyAssignabilityCheck" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyAssignmentCanBeOperatorAssignment" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreLazyOperators" value="true" />
+          <option name="ignoreObscureOperators" value="false" />
+        </inspection_tool>
+        <inspection_tool class="GroovyAssignmentToForLoopParameter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyAssignmentToMethodParameter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyBreak" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyBusyWait" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyClassNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="GroovyConditional" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyConditionalCanBeConditionalCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyConditionalCanBeElvis" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyConditionalWithIdenticalBranches" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyConstantConditional" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyConstantIfStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyConstantNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovyContinue" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyContinueOrBreakFromFinallyBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyDivideByZero" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyDoubleCheckedLocking" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreOnVolatileVariables" value="false" />
+        </inspection_tool>
+        <inspection_tool class="GroovyDoubleNegation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyDuplicateSwitchBranch" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyEmptyCatchBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyEmptyFinallyBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyEmptyStatementBody" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyEmptySyncBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyEmptyTryBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyEnumerationNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="GroovyFallthrough" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyGetterCallCanBePropertyAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyIfStatementWithIdenticalBranches" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyIfStatementWithTooManyBranches" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="GroovyImmutableAnnotation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyInfiniteLoopStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyInfiniteRecursion" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyInstanceMethodNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovyInstanceVariableNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="m_[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovyInterfaceNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="GroovyListGetCanBeKeyedAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyListSetCanBeKeyedAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyLocalVariableNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovyLoopStatementThatDoesntLoop" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyMapGetCanBeKeyedAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyMapPutCanBeKeyedAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyMethodParameterCount" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="GroovyMethodWithMoreThanThreeNegations" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyMissingReturnStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyMultipleReturnPointsPerMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="1" />
+        </inspection_tool>
+        <inspection_tool class="GroovyNegatedConditional" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNegatedIf" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNestedAssignment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNestedConditional" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNestedSwitch" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNestedSynchronizedStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNonShortCircuitBoolean" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNotifyWhileNotSynchronized" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyOctalInteger" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyOverlyComplexArithmeticExpression" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="GroovyOverlyComplexBooleanExpression" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="GroovyOverlyComplexMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="GroovyOverlyLongMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="30" />
+        </inspection_tool>
+        <inspection_tool class="GroovyOverlyNestedMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="GroovyParameterNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovyPointlessArithmetic" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyPointlessBoolean" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyPublicFieldAccessedInSynchronizedContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyResultOfAssignmentUsed" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyResultOfIncrementOrDecrementUsed" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyResultOfObjectAllocationIgnored" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyReturnFromClosureCanBeImplicit" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyReturnFromFinallyBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySetterCallCanBePropertyAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySillyAssignment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySingletonAnnotation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyStaticMethodNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovyStaticVariableNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="s_[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovySwitchStatementWithNoDefault" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySynchronizationOnNonFinalField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySynchronizationOnThis" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySynchronizationOnVariableInitializedWithLiteral" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySynchronizedMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySystemRunFinalizersOnExit" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyThreadStopSuspendResume" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyThrowFromFinallyBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyTrivialConditional" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyTrivialIf" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUncheckedAssignmentOfMemberOfRawType" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnconditionalWait" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnnecessaryContinue" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnnecessaryReturn" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnreachableStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnresolvedAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnsynchronizedMethodOverridesSynchronizedMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUntypedAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnusedAssignment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnusedCatchParameter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyVariableNotAssigned" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyWaitCallNotInLoop" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyWaitWhileNotSynchronized" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyWhileLoopSpinsOnField" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreNonEmtpyLoops" value="false" />
+        </inspection_tool>
+        <inspection_tool class="GtkPreferredJComboBoxRenderer" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtClientClassFromNonInheritedModule" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtCssResourceErrors" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtDefaultPackageNotRegistered" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtDeprecatedEventListeners" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtDeprecatedPropertyKeyJavadocTag" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtInconsistentI18nInterface" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtInconsistentSerializableClass" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtJavaScriptReferences" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtMethodWithParametersInConstantsInterface" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtObsoleteTypeArgsJavadocTag" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtServiceNotRegistered" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtSetServiceEntryPointCalls" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtToHtmlReferences" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtUiFieldAssignment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtUiFieldErrors" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtUiHandlerErrors" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="HardCodedStringLiteral" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreForAssertStatements" value="true" />
+          <option name="ignoreForExceptionConstructors" value="true" />
+          <option name="ignoreForSpecifiedExceptionConstructors" value="" />
+          <option name="ignoreForJUnitAsserts" value="true" />
+          <option name="ignoreForClassReferences" value="true" />
+          <option name="ignoreForPropertyKeyReferences" value="true" />
+          <option name="ignoreForNonAlpha" value="true" />
+          <option name="ignoreAssignedToConstants" value="false" />
+          <option name="ignoreToString" value="false" />
+          <option name="nonNlsCommentPattern" value="NON-NLS" />
+        </inspection_tool>
+        <inspection_tool class="HardcodedFileSeparators" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_recognizeExampleMediaType" value="false" />
+        </inspection_tool>
+        <inspection_tool class="HardcodedLineSeparators" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HardwiredNamespacePrefix" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HashCodeUsesNonFinalVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HibernateConfigDomFacetInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HibernateConfigDomInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="HibernateMappingDatasourceDomInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="HibernateMappingDomInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="HibernateResource" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="insideTryAllowed" value="false" />
+        </inspection_tool>
+        <inspection_tool class="HtmlDeprecatedTag" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HtmlExtraClosingTag" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="HtmlFormInputWithoutLabel" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HtmlPresentationalElement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HtmlUnknownAttribute" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="myValues">
+            <value>
+              <list size="0" />
+            </value>
+          </option>
+          <option name="myCustomValuesEnabled" value="true" />
+        </inspection_tool>
+        <inspection_tool class="HtmlUnknownTag" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="myValues">
+            <value>
+              <list size="4">
+                <item index="0" class="java.lang.String" itemvalue="nobr" />
+                <item index="1" class="java.lang.String" itemvalue="noembed" />
+                <item index="2" class="java.lang.String" itemvalue="comment" />
+                <item index="3" class="java.lang.String" itemvalue="noscript" />
+              </list>
+            </value>
+          </option>
+          <option name="myCustomValuesEnabled" value="true" />
+        </inspection_tool>
+        <inspection_tool class="HtmlUnknownTarget" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IOResource" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoredTypesString" value="java.io.ByteArrayOutputStream,java.io.ByteArrayInputStream,java.io.StringBufferInputStream,java.io.CharArrayWriter,java.io.CharArrayReader,java.io.StringWriter,java.io.StringReader" />
+          <option name="insideTryAllowed" value="false" />
+        </inspection_tool>
+        <inspection_tool class="IfMayBeConditional" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IfStatementWithIdenticalBranches" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IfStatementWithIdenticalBranchesJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IfStatementWithTooManyBranches" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="IfStatementWithTooManyBranchesJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="IgnoreResultOfCall" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_reportAllNonLibraryCalls" value="false" />
+          <option name="callCheckString" value="java.io.InputStream,read,java.io.InputStream,skip,java.lang.StringBuffer,toString,java.lang.StringBuilder,toString,java.lang.String,.*,java.math.BigInteger,.*,java.math.BigDecimal,.*,java.net.InetAddress,.*" />
+        </inspection_tool>
+        <inspection_tool class="ImplicitArrayToString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ImplicitCallToSuper" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreForObjectSubclasses" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ImplicitNumericConversion" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreWideningConversions" value="false" />
+          <option name="ignoreCharConversions" value="false" />
+          <option name="ignoreConstantConversions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ImplicitTypeConversion" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="BITS" value="1720" />
+          <option name="FLAG_EXPLICIT_CONVERSION" value="true" />
+          <option name="IGNORE_NODESET_TO_BOOLEAN_VIA_STRING" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ImplicitlyExposedWebServiceMethods" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="IncompatibleMask" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="IncompatibleMaskJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InconsistentLanguageLevel" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InconsistentResourceBundle" enabled="false" level="ERROR" enabled_by_default="false">
+          <option name="REPORT_MISSING_TRANSLATIONS" value="true" />
+          <option name="REPORT_INCONSISTENT_PROPERTIES" value="true" />
+          <option name="REPORT_DUPLICATED_PROPERTIES" value="true" />
+        </inspection_tool>
+        <inspection_tool class="IncrementDecrementResultUsedJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IncrementDecrementUsedAsExpression" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IndexOfReplaceableByContains" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IndexZeroUsage" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InfiniteLoopJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InfiniteLoopStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InfiniteRecursion" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InfiniteRecursionJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InjectionNotApplicable" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="InjectionValueTypeInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="InnerClassMayBeStatic" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InnerClassOnInterface" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreInnerInterfaces" value="false" />
+        </inspection_tool>
+        <inspection_tool class="InnerClassVariableHidesOuterClassVariable" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreInvisibleFields" value="true" />
+        </inspection_tool>
+        <inspection_tool class="InnerHTMLJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InspectionDescriptionNotFoundInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InstanceGuardedByStatic" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InstanceMethodNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="2" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="InstanceVariableInitialization" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignorePrimitives" value="false" />
+        </inspection_tool>
+        <inspection_tool class="InstanceVariableNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_regex" value="_[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="2" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="InstanceVariableOfConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InstanceVariableUninitializedUse" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignorePrimitives" value="false" />
+          <option name="annotationNamesString" value="" />
+        </inspection_tool>
+        <inspection_tool class="InstanceofCatchParameter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InstanceofChain" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreInstanceofOnLibraryClasses" value="false" />
+        </inspection_tool>
+        <inspection_tool class="InstanceofIncompatibleInterface" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InstanceofInterfaces" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InstanceofThis" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InstantiatingObjectToGetClassObject" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InstantiationOfUtilityClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IntLiteralMayBeLongLiteral" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IntegerDivisionInFloatingPointContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IntegerMultiplicationImplicitCastToLong" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IntentionDescriptionNotFoundInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InterceptionAnnotationWithoutRuntimeRetention" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InterfaceNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="InterfaceNeverImplemented" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreInterfacesThatOnlyDeclareConstants" value="false" />
+        </inspection_tool>
+        <inspection_tool class="InterfaceWithOnlyOneDirectInheritor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InvalidImplementedBy" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InvalidProvidedBy" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InvalidRequestParameters" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IteratorHasNextCallsIteratorNext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IteratorNextDoesNotThrowNoSuchElementException" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JBoss" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JDBCExecuteWithNonConstantString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JDBCPrepareStatementWithNonConstantString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JDBCResource" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="insideTryAllowed" value="false" />
+        </inspection_tool>
+        <inspection_tool class="JNDIResource" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="insideTryAllowed" value="false" />
+        </inspection_tool>
+        <inspection_tool class="JSDeprecatedSymbols" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSDuplicatedDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSImplicitlyInternalDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSLastCommaInArrayLiteral" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSLowercasedConstructorCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSMismatchedCollectionQueryUpdateInspection" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="queries" value="trace,write" />
+          <option name="updates" value="pop,push,shift,splice,unshift" />
+        </inspection_tool>
+        <inspection_tool class="JSSuspiciousNameCombinationInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false">
+          <group names="x,width,left,right" />
+          <group names="y,height,top,bottom" />
+        </inspection_tool>
+        <inspection_tool class="JSUndeclaredVariable" enabled="true" level="INFO" enabled_by_default="true" />
+        <inspection_tool class="JSUnnecessarySemicolon" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSUnresolvedFunction" enabled="true" level="INFO" enabled_by_default="true" />
+        <inspection_tool class="JSUnresolvedLibraryURL" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSUnresolvedVariable" enabled="true" level="INFO" enabled_by_default="true" />
+        <inspection_tool class="JSUntypedDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSUnusedGlobalSymbols" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSUnusedLocalSymbols" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSValidateJSON" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JSValidateTypes" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="JUnit4AnnotatedMethodInJUnit3TestCase" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JUnitAbstractTestClassNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*TestCase" />
+          <option name="m_minLength" value="12" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="JUnitTestClassNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*Test" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="JUnitTestNG" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JavaDoc" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="TOP_LEVEL_CLASS_OPTIONS">
+            <value>
+              <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+              <option name="REQUIRED_TAGS" value="" />
+            </value>
+          </option>
+          <option name="INNER_CLASS_OPTIONS">
+            <value>
+              <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+              <option name="REQUIRED_TAGS" value="" />
+            </value>
+          </option>
+          <option name="METHOD_OPTIONS">
+            <value>
+              <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+              <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
+            </value>
+          </option>
+          <option name="FIELD_OPTIONS">
+            <value>
+              <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+              <option name="REQUIRED_TAGS" value="" />
+            </value>
+          </option>
+          <option name="IGNORE_DEPRECATED" value="false" />
+          <option name="IGNORE_JAVADOC_PERIOD" value="true" />
+          <option name="IGNORE_DUPLICATED_THROWS" value="false" />
+          <option name="IGNORE_POINT_TO_ITSELF" value="false" />
+          <option name="myAdditionalJavadocTags" value="" />
+        </inspection_tool>
+        <inspection_tool class="JavaLangImport" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JavaLangReflect" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JavadocReference" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="JavaeeApplicationDomInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JdkProxiedBeanTypeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaAttributeMemberSignatureInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaAttributeTypeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaConfigDomFacetInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JpaDataSourceORMDomInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaDataSourceORMInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaDomInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaEntityListenerInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaEntityListenerWarningsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JpaModelReferenceInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaORMDomInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaObjectClassSignatureInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaQlInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaQueryApiInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JsfJamExtendsClassInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JsfManagedBeansInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JspDirectiveInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JspPropertiesInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="KeySetIterationMayUseEntrySet" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LabeledStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LabeledStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LanguageMismatch" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="CHECK_NON_ANNOTATED_REFERENCES" value="true" />
+        </inspection_tool>
+        <inspection_tool class="LawOfDemeter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreLibraryCalls" value="true" />
+        </inspection_tool>
+        <inspection_tool class="LengthOneStringInIndexOf" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LengthOneStringsInConcatenation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="LessUnresolvedVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LimitedScopeInnerClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ListIndexOfReplaceableByContains" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ListenerMayUseAdapter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="checkForEmptyMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="LiteralAsArgToStringEquals" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="LoadLibraryWithNonConstantString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LocalCanBeFinal" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="REPORT_VARIABLES" value="true" />
+          <option name="REPORT_PARAMETERS" value="true" />
+        </inspection_tool>
+        <inspection_tool class="LocalVariableHidingMemberVariable" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreInvisibleFields" value="true" />
+          <option name="m_ignoreStaticMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="LocalVariableNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreForLoopParameters" value="false" />
+          <option name="m_ignoreCatchParameters" value="false" />
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="LocalVariableNamingConventionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z]*" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="LocalVariableOfConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LogStatementGuardedByLogCondition" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="loggerClassName" value="java.util.logging.Logger" />
+          <option name="loggerMethodAndconditionMethodNames" value="fine,isLoggable(java.util.logging.Level.FINE),finer,isLoggable(java.util.logging.Level.FINER),finest,isLoggable(java.util.logging.Level.FINEST)" />
+        </inspection_tool>
+        <inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="loggerClassName" value="org.apache.log4j.Logger" />
+          <option name="loggerFactoryMethodName" value="getLogger" />
+        </inspection_tool>
+        <inspection_tool class="LoggingConditionDisagreesWithLogStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LongLiteralsEndingWithLowercaseL" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LoopConditionNotUpdatedInsideLoop" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreIterators" value="false" />
+        </inspection_tool>
+        <inspection_tool class="LoopStatementThatDoesntLoopJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="LoopStatementsThatDontLoop" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="LoopWithImplicitTerminationCondition" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="LossyEncoding" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MagicCharacter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MagicNumber" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreInHashCode" value="true" />
+        </inspection_tool>
+        <inspection_tool class="MagicNumberJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MalformedFormatString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MalformedRegex" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MalformedXPath" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ManagedBeanClassInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ManualArrayCopy" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ManualArrayToCollectionCopy" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MapReplaceableByEnumMap" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MarkerInterface" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MavenDuplicateDependenciesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MavenModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="MethodCallInLoopCondition" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodCount" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="20" />
+          <option name="ignoreGettersAndSetters" value="false" />
+        </inspection_tool>
+        <inspection_tool class="MethodCoupling" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_includeJavaClasses" value="false" />
+          <option name="m_includeLibraryClasses" value="false" />
+          <option name="m_limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="MethodMayBeStatic" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_onlyPrivateOrFinal" value="false" />
+          <option name="m_ignoreEmptyMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="MethodMayBeSynchronized" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MethodNameSameAsClassName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodNameSameAsParentName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodNamesDifferOnlyByCase" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodOnlyUsedFromInnerClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreMethodsAccessedFromAnonymousClass" value="false" />
+          <option name="ignoreStaticMethodsFromNonStaticInnerClass" value="false" />
+          <option name="onlyReportStaticMethods" value="false" />
+        </inspection_tool>
+        <inspection_tool class="MethodOverloadsParentMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodOverridesPackageLocalMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodOverridesPrivateMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodOverridesStaticMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodReturnAlwaysConstant" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MethodReturnOfConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodWithMultipleLoops" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MimeType" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="MinMaxValuesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MismatchedArrayReadWrite" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MismatchedCollectionQueryUpdate" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="queries" value="copyInto,drainTo,propertyNames,save,store,write" />
+          <option name="updates" value="add,clear,drainTo,insert,load,offer,poll,push,put,remove,replace,retain,set,take" />
+        </inspection_tool>
+        <inspection_tool class="MisorderedAssertEqualsParameters" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MissedExecutable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MissingAspectjAutoproxyInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MissingDeprecatedAnnotation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MissingMnemonic" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MissingOverrideAnnotation" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreObjectMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="MissortedModifiers" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_requireAnnotationsFirst" value="true" />
+        </inspection_tool>
+        <inspection_tool class="MisspelledCompareTo" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MisspelledEquals" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MisspelledHashcode" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MisspelledSetUp" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MisspelledTearDown" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MisspelledToString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ModuleWithTooFewClasses" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="ModuleWithTooManyClasses" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="100" />
+        </inspection_tool>
+        <inspection_tool class="MultipleBindingAnnotations" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MultipleDeclaration" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreForLoopDeclarations" value="true" />
+        </inspection_tool>
+        <inspection_tool class="MultipleExceptionsDeclaredOnTestMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MultipleInjectedConstructorsForClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MultipleMethodDesignatorsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MultipleReturnPointsPerMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreGuardClauses" value="false" />
+          <option name="ignoreEqualsMethod" value="false" />
+          <option name="m_limit" value="1" />
+        </inspection_tool>
+        <inspection_tool class="MultipleTopLevelClassesInFile" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MultipleTypedDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MultiplyOrDivideByPowerOfTwo" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="checkDivision" value="false" />
+        </inspection_tool>
+        <inspection_tool class="NakedNotify" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NativeMethods" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NegatedConditional" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreNegatedNullComparison" value="true" />
+        </inspection_tool>
+        <inspection_tool class="NegatedConditionalExpressionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NegatedIfElse" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreNegatedNullComparison" value="true" />
+        </inspection_tool>
+        <inspection_tool class="NegatedIfStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedAssignment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedAssignmentJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedConditionalExpression" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedConditionalExpressionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedFunctionCallJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedFunctionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_includeAnonymousFunctions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="NestedMethodCall" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreFieldInitializations" value="true" />
+        </inspection_tool>
+        <inspection_tool class="NestedSwitchStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedSwitchStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedSynchronizedStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedTryStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestingDepth" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="NestingDepthJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="NewStringBufferWithCharArgument" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="NoButtonGroup" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NoExplicitFinalizeCalls" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="NoLabelFor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NoScrollPane" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonAtomicOperationOnVolatileField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonBlockStatementBodyJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="NonBooleanMethodNameMayNotStartWithQuestion" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="questionString" value="is,can,has,should,could,will,shall,check,contains,equals,startsWith,endsWith" />
+          <option name="ignoreBooleanMethods" value="false" />
+          <option name="onlyWarnOnBaseMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="NonCommentSourceStatements" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="30" />
+        </inspection_tool>
+        <inspection_tool class="NonExceptionNameEndsWithException" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonFinalClone" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonFinalFieldInImmutable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonFinalFieldOfException" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonFinalGuard" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonFinalStaticVariableUsedInClassInitialization" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonJREEmulationClassesInClientCode" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="NonJaxWsWebServices" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonProtectedConstructorInAbstractClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreNonPublicClasses" value="false" />
+        </inspection_tool>
+        <inspection_tool class="NonReproducibleMathCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonSerializableFieldInSerializableClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="superClassString" value="java.awt.Component" />
+        </inspection_tool>
+        <inspection_tool class="NonSerializableObjectBoundToHttpSession" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonSerializableObjectPassedToObjectStream" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonSerializableServiceParameters" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="NonSerializableWithSerialVersionUIDField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonSerializableWithSerializationMethods" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonShortCircuitBoolean" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonShortCircuitBooleanExpressionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonStaticFinalLogger" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="loggerClassName" value="com.netevent.util.debug.AdvancedLogger" />
+        </inspection_tool>
+        <inspection_tool class="NonStaticInnerClassInSecureContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonSynchronizedMethodOverridesSynchronizedMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonThreadSafeLazyInitialization" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NoopMethodInAbstractClass" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="NotifyCalledOnCondition" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NotifyNotInSynchronizedContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NotifyWithoutCorrespondingWait" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NullArgumentToVariableArgMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="NullableProblems" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="REPORT_NULLABLE_METHOD_OVERRIDES_NOTNULL" value="true" />
+          <option name="REPORT_NOT_ANNOTATED_METHOD_OVERRIDES_NOTNULL" value="true" />
+          <option name="REPORT_NOTNULL_PARAMETER_OVERRIDES_NULLABLE" value="true" />
+          <option name="REPORT_NOT_ANNOTATED_PARAMETER_OVERRIDES_NOTNULL" value="true" />
+          <option name="REPORT_NOT_ANNOTATED_GETTER" value="true" />
+          <option name="REPORT_NOT_ANNOTATED_SETTER_PARAMETER" value="true" />
+          <option name="REPORT_ANNOTATION_NOT_PROPAGATED_TO_OVERRIDERS" value="true" />
+        </inspection_tool>
+        <inspection_tool class="NumberEquality" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="NumericOverflow" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NumericToString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ObjectAllocationIgnoredJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ObjectAllocationInLoop" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ObjectEquality" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreEnums" value="true" />
+          <option name="m_ignoreClassObjects" value="false" />
+          <option name="m_ignorePrivateConstructors" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ObjectEqualsNull" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ObjectNotify" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ObjectToString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ObsoleteCollection" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreRequiredObsoleteCollectionTypes" value="false" />
+        </inspection_tool>
+        <inspection_tool class="OctalAndDecimalIntegersMixed" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OctalIntegerJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OctalLiteral" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="OnDemandImport" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OneButtonGroup" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OneWayWebMethod" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="OrredNotEqualExpression" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OverloadedMethodsWithSameNumberOfParameters" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OverloadedVarargsMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OverlyComplexArithmeticExpression" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="6" />
+        </inspection_tool>
+        <inspection_tool class="OverlyComplexArithmeticExpressionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="6" />
+        </inspection_tool>
+        <inspection_tool class="OverlyComplexBooleanExpression" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+          <option name="m_ignorePureConjunctionsDisjunctions" value="true" />
+        </inspection_tool>
+        <inspection_tool class="OverlyComplexBooleanExpressionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="OverlyLargePrimitiveArrayInitializer" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="64" />
+        </inspection_tool>
+        <inspection_tool class="OverlyStrongTypeCast" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreInMatchingInstanceof" value="false" />
+        </inspection_tool>
+        <inspection_tool class="OverridableMethodCallDuringObjectConstruction" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OverriddenMethodCallDuringObjectConstruction" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PackageInMultipleModules" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="PackageVisibleField" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="PackageVisibleInnerClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreEnums" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PackageWithTooFewClasses" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="PackageWithTooManyClasses" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="PageflowModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="PagesFileModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="PagesModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ParameterHidingMemberVariable" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreInvisibleFields" value="true" />
+          <option name="m_ignoreStaticMethodParametersHidingInstanceFields" value="false" />
+          <option name="m_ignoreForConstructors" value="false" />
+          <option name="m_ignoreForPropertySetters" value="false" />
+          <option name="m_ignoreForAbstractMethods" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ParameterNameDiffersFromOverriddenParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreSingleCharacterNames" value="false" />
+          <option name="m_ignoreOverridesOfLibraryMethods" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ParameterNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="ParameterNamingConventionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z]*" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="ParameterOfConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ParameterizedParametersStaticCollection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ParametersPerConstructor" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="ParametersPerFunctionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="ParametersPerMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="PathAnnotation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PatternNotApplicable" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="PatternOverriddenByNonAnnotatedMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PatternValidation" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="CHECK_NON_CONSTANT_VALUES" value="true" />
+        </inspection_tool>
+        <inspection_tool class="PhpAssignmentInConditionInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpDeprecationInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpDynamicAsStaticMethodCallInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpIncludeInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpParamsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedClassConstantInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedClassInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedConstantInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedFieldInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedFunctionInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedMethodInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedNamespaceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedVariableInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUnimplementedMethodsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="PhpUnreachableStatementInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUnusedLocalVariableInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUnusedParameterInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUnusedPrivateFieldInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpWrongCatchClausesOrderInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpWrongForeachArgumentTypeInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpWrongStringConcatenationInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PlatformDetectionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PluginXmlValidity" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="PointcutMethodStyleInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PointlessArithmeticExpression" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreExpressionsContainingConstants" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PointlessArithmeticExpressionJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="PointlessBinding" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PointlessBitwiseExpression" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreExpressionsContainingConstants" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PointlessBitwiseExpressionJS" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreExpressionsContainingConstants" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PointlessBooleanExpression" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreExpressionsContainingConstants" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PointlessBooleanExpressionJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="PointlessIndexOfComparison" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PrimitiveArrayArgumentToVariableArgMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="PrivateMemberAccessBetweenOuterAndInnerClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ProtectedField" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ProtectedInnerClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreEnums" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ProtectedMemberInFinalClass" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="PublicConstructorInNonPublicClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PublicField" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreEnums" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PublicFieldAccessedInSynchronizedContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PublicInnerClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreEnums" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PublicMethodNotExposedInInterface" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PublicMethodWithoutLogging" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="loggerClassName" value="java.util.logging.Logger" />
+        </inspection_tool>
+        <inspection_tool class="PublicStaticArrayField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PublicStaticCollectionField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="QuestionableName" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="nameString" value="aa,abc,bad,bar,bar2,baz,baz1,baz2,baz3,bb,blah,bogus,bool,cc,dd,defau1t,dummy,dummy2,ee,fa1se,ff,foo,foo1,foo2,foo3,foobar,four,fred,fred1,fred2,gg,hh,hello,hello1,hello2,hello3,ii,nu11,one,silly,silly2,string,two,that,then,three,whi1e,var" />
+        </inspection_tool>
+        <inspection_tool class="QuirksModeInspectionTool" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="IE50" value="false" />
+          <option name="IE55" value="false" />
+          <option name="IE6" value="true" />
+          <option name="IE7" value="true" />
+          <option name="IE_MAC" value="false" />
+          <option name="MOZILLA" value="true" />
+          <option name="OPERA7" value="false" />
+          <option name="OPERA8" value="false" />
+          <option name="OPERA85" value="true" />
+          <option name="OPERA9" value="true" />
+          <option name="SAFARI" value="true" />
+        </inspection_tool>
+        <inspection_tool class="RandomDoubleForRandomInteger" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RawUseOfParameterizedType" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreObjectConstruction" value="true" />
+          <option name="ignoreTypeCasts" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ReadObjectAndWriteObjectPrivate" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ReadObjectInitialization" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ReadResolveAndWriteReplaceProtected" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RecordStoreResource" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantArrayCreation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RedundantCast" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RedundantFieldInitialization" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RedundantImplements" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreSerializable" value="false" />
+          <option name="ignoreCloneable" value="false" />
+        </inspection_tool>
+        <inspection_tool class="RedundantImport" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantMethodOverride" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantScopeBinding" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantStringFormatCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantSuppression" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantThrows" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RedundantThrowsDeclaration" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RedundantToBinding" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantToProviderBinding" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantTypeArguments" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RedundantTypeConversion" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="CHECK_ANY" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ReferencesToClassesFromDefaultPackagesInJSPFile" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="ReflectionForUnavailableAnnotation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RefusedBequest" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreEmptySuperMethods" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ReplaceAllDot" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ReplaceAssignmentWithOperatorAssignment" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreLazyOperators" value="true" />
+          <option name="ignoreObscureOperators" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ReplaceAssignmentWithOperatorAssignmentJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RequiredAttributes" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="myAdditionalRequiredHtmlAttributes" value="" />
+        </inspection_tool>
+        <inspection_tool class="RequiredBeanTypeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ReservedWordUsedAsNameJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RestWrongDefaultValueInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ResultOfObjectAllocationIgnored" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ResultSetIndexZero" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ReturnFromFinallyBlock" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ReturnFromFinallyBlockJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ReturnNull" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_reportObjectMethods" value="true" />
+          <option name="m_reportArrayMethods" value="true" />
+          <option name="m_reportCollectionMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ReturnOfCollectionField" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignorePrivateMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ReturnOfDateField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ReturnThis" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ReuseOfLocalVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ReuseOfLocalVariableJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RuntimeExec" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RuntimeExecWithNonConstantString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SSBasedInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SafeLock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SamePackageImport" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SameParameterValue" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SameReturnValue" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SassUnresolvedMixin" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SassUnresolvedVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SeamAnnotationIncorrectSignatureInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamAnnotationsInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamBijectionIllegalScopeParameterInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamBijectionTypeMismatchInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamBijectionUndefinedContextVariableInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SeamDomModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamDuplicateComponentsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamIllegalComponentScopeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamJamComponentInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SecondUnsafeCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SelfIncludingJspFiles" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SerialPersistentFieldsWithWrongSignature" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SerialVersionUIDNotStaticFinal" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SerializableClassInSecureContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SerializableHasSerialVersionUIDField" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="superClassString" value="java.awt.Component" />
+        </inspection_tool>
+        <inspection_tool class="SerializableHasSerializationMethods" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="superClassString" value="java.awt.Component" />
+        </inspection_tool>
+        <inspection_tool class="SerializableInnerClassHasSerialVersionUIDField" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="superClassString" value="java.awt.Component" />
+        </inspection_tool>
+        <inspection_tool class="SerializableInnerClassWithNonSerializableOuterClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="superClassString" value="java.awt.Component" />
+        </inspection_tool>
+        <inspection_tool class="SerializableWithUnconstructableAncestor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ServletWithoutMappingInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SessionScopedInjectsRequestScoped" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SetReplaceableByEnumSet" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SetupCallsSuperSetup" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SetupIsPublicVoidNoArg" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ShiftOutOfRange" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ShiftOutOfRangeJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SignalWithoutCorrespondingAwait" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SillyAssignment" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SillyAssignmentJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SimpleDateFormatWithoutLocale" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SimplifiableAnnotation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SimplifiableConditionalExpression" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SimplifiableIfStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SimplifiableJUnitAssertion" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="Since15" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SingleCharacterStartsWith" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SingleClassImport" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="Singleton" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SingletonInjectsScoped" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SizeReplaceableByIsEmpty" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreNegations" value="false" />
+        </inspection_tool>
+        <inspection_tool class="SleepWhileHoldingLock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SocketResource" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="insideTryAllowed" value="false" />
+        </inspection_tool>
+        <inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
+          <option name="processCode" value="true" />
+          <option name="processLiterals" value="true" />
+          <option name="processComments" value="true" />
+        </inspection_tool>
+        <inspection_tool class="SpringAopErrorsInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringAopWarningsInspection" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SpringBeanAutowiringInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringBeanConstructorArgInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringBeanDepedencyCheckInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringBeanInstantiationInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringBeanLookupMethodInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringBeanNameConventionInspection" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SpringContextConfigurationInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringFacetInspection" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="checkTestFiles" value="false" />
+        </inspection_tool>
+        <inspection_tool class="SpringFactoryMethodInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringIncorrectResourceTypeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringInjectionValueConsistencyInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringInjectionValueStyleInspection" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SpringJamErrorInspection" level="WARNING" enabled="true" />
+        <inspection_tool class="SpringJavaAutowiringInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringJavaConfigExternalBeansErrorInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SpringJavaConfigInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringMVCViewInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringMessageDispatcherWebXmlInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringOsgiElementsInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringOsgiListenerInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringOsgiServiceCommonInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringPlaceholdersInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SpringPublicFactoryMethodInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SpringReplacedMethodsInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringRequiredAnnotationInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringRequiredPropertyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringScopesInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringSecurityElementsInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringSecurityFiltersConfiguredInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SpringWebServiceAnnotationsInconsistencyInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SpringWebServicesConfigurationsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SqlAmbiguousColumnInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SqlIdentifierInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SqlInsertValuesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SqlResolveInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SqlTypeInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StandardVariableNames" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StatementsPerFunctionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="30" />
+        </inspection_tool>
+        <inspection_tool class="StaticCallOnSubclass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticCollection" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreWeakCollections" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StaticFieldReferenceOnSubclass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticGuardedByInstance" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticImport" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreSingleFieldImports" value="false" />
+          <option name="ignoreSingeMethodImports" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StaticInheritance" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticMethodNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="StaticMethodOnlyUsedInOneClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticNonFinalField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticSuite" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticVariableInitialization" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignorePrimitives" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StaticVariableNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="checkMutableFinals" value="false" />
+          <option name="m_regex" value="_[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="3" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="StaticVariableOfConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticVariableUninitializedUse" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignorePrimitives" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StringBufferField" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StringBufferMustHaveInitialCapacity" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringBufferReplaceableByString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StringBufferReplaceableByStringBuilder" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringBufferToStringInConcatenation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringCompareTo" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringConcatenation" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreAsserts" value="false" />
+          <option name="ignoreSystemOuts" value="false" />
+          <option name="ignoreSystemErrs" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StringConcatenationInFormatCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringConcatenationInLoops" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreUnlessAssigned" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StringConcatenationInMessageFormatCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringConcatenationInsideStringBufferAppend" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StringConstructor" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreSubstringArguments" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StringEquality" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StringEquals" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringEqualsEmptyString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StringEqualsIgnoreCase" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringLiteralBreaksHTMLJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringReplaceableByStringBuffer" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="onlyWarnOnLoop" value="true" />
+        </inspection_tool>
+        <inspection_tool class="StringToString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StringToUpperWithoutLocale" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringTokenizer" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="Struts2ModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="StrutsInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="StrutsTilesInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="StrutsValidatorFormInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="StrutsValidatorInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SubstringZero" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SubtractionInCompareTo" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SuppressionAnnotation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SuspiciousIndentAfterControlStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SuspiciousMethodCalls" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="REPORT_CONVERTIBLE_METHOD_CALLS" value="true" />
+        </inspection_tool>
+        <inspection_tool class="SuspiciousNameCombination" enabled="true" level="WARNING" enabled_by_default="true">
+          <group names="x,width,left,right" />
+          <group names="y,height,top,bottom" />
+        </inspection_tool>
+        <inspection_tool class="SuspiciousSystemArraycopy" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SuspiciousToArrayCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SwitchStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SwitchStatementDensity" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="20" />
+        </inspection_tool>
+        <inspection_tool class="SwitchStatementWithConfusingDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SwitchStatementWithNoDefaultBranchJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SwitchStatementWithTooFewBranches" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="2" />
+        </inspection_tool>
+        <inspection_tool class="SwitchStatementWithTooManyBranches" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="SwitchStatementsWithoutDefault" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreFullyCoveredEnums" value="true" />
+        </inspection_tool>
+        <inspection_tool class="SynchronizationOnLocalVariableOrMethodParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="reportLocalVariables" value="true" />
+          <option name="reportMethodParameters" value="true" />
+        </inspection_tool>
+        <inspection_tool class="SynchronizationOnStaticField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SynchronizeOnLock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SynchronizeOnNonFinalField" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SynchronizeOnThis" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SynchronizedMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_includeNativeMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="SynchronizedOnLiteralObject" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SyntaxError" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SystemExit" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SystemGC" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SystemGetenv" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SystemOutErr" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SystemProperties" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SystemRunFinalizersOnExit" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SystemSetSecurityManager" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TaglibDomModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="TailRecursion" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TailRecursionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TeardownCallsSuperTeardown" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TeardownIsPublicVoidNoArg" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TelReferencesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TestCaseInProductCode" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TestCaseWithConstructor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TestCaseWithNoTestMethods" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreSupers" value="false" />
+        </inspection_tool>
+        <inspection_tool class="TestMethodInProductCode" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TestMethodIsPublicVoidNoArg" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TestMethodWithoutAssertion" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="assertionMethods" value="org.junit.Assert,assert.*|fail.*,junit.framework.Assert,assert.*|fail.*,org.mockito.Mockito,verify.*" />
+          <option name="assertKeywordIsAssertion" value="false" />
+        </inspection_tool>
+        <inspection_tool class="TestOnlyProblems" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TextLabelInSwitchStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TextLabelInSwitchStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThisEscapedInConstructor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThisExpressionReferencesGlobalObjectJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ThreadDeathRethrown" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadDumpStack" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ThreadLocalNotStaticFinal" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadPriority" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadRun" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadStartInConstruction" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadStopSuspendResume" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadWithDefaultRunMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadYield" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreeNegationsPerFunctionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreeNegationsPerMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreInEquals" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ThrowCaughtLocally" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreRethrownExceptions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ThrowFromFinallyBlock" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ThrowFromFinallyBlockJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ThrowableInstanceNeverThrown" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ThrowablePrintStackTrace" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ThrowableResultOfMethodCallIgnored" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThrownExceptionsPerMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="TimeToString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ToArrayCallWithZeroLengthArrayArgument" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TodoComment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TooBroadCatch" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="onlyWarnOnRootExceptions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="TooBroadScope" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_allowConstructorAsInitializer" value="false" />
+          <option name="m_onlyLookAtBlocks" value="false" />
+        </inspection_tool>
+        <inspection_tool class="TooBroadThrows" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="onlyWarnOnRootExceptions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="TrailingSpacesInProperty" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TransientFieldInNonSerializableClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TransientFieldNotInitialized" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TrivialConditionalJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TrivialIf" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TrivialIfJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TrivialStringConcatenation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TypeMayBeWeakened" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="useRighthandTypeAsWeakestTypeInAssignments" value="true" />
+          <option name="useParameterizedTypeForCollectionMethods" value="true" />
+          <option name="doNotWeakenToJavaLangObject" value="true" />
+          <option name="onlyWeakentoInterface" value="true" />
+        </inspection_tool>
+        <inspection_tool class="TypeParameterExtendsFinalClass" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TypeParameterExtendsObject" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TypeParameterHidesVisibleType" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TypeParameterNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z\d]" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="1" />
+        </inspection_tool>
+        <inspection_tool class="UNCHECKED_WARNING" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UNUSED_IMPORT" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UNUSED_SYMBOL" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="LOCAL_VARIABLE" value="true" />
+          <option name="FIELD" value="true" />
+          <option name="METHOD" value="true" />
+          <option name="CLASS" value="true" />
+          <option name="PARAMETER" value="true" />
+          <option name="REPORT_PARAMETER_FOR_PUBLIC_METHODS" value="true" />
+        </inspection_tool>
+        <inspection_tool class="UnaryPlus" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UncheckedExceptionClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnconditionalWait" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnconstructableTestCase" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UndeclaredTests" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UndesirableClassUsage" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnhandledExceptionInJSP" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UninstantiableBinding" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UninstantiableImplementedByClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UninstantiableProvidedByClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnknownGuard" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnknownLanguage" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="UnnecessarilyQualifiedInnerClassAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessarilyQualifiedStaticUsage" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreStaticFieldAccesses" value="false" />
+          <option name="m_ignoreStaticMethodCalls" value="false" />
+          <option name="m_ignoreStaticAccessFromStaticContext" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessarilyQualifiedStaticallyImportedElement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryBlockStatement" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreSwitchBranches" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessaryBoxing" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryCallToStringValueOf" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryConditionalExpression" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryConstantArrayCreationExpression" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryContinue" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryContinueJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryDefault" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryEnumModifier" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryFinalOnLocalVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryFinalOnParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="onlyWarnOnAbstractMethods" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessaryFullyQualifiedName" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreJavadoc" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessaryInheritDoc" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryInterfaceModifier" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryJavaDocLink" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryLabelJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryLabelOnBreakStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryLabelOnBreakStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryLabelOnContinueStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryLabelOnContinueStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryLocalVariable" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreImmediatelyReturnedVariables" value="false" />
+          <option name="m_ignoreAnnotatedVariables" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessaryLocalVariableJS" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreImmediatelyReturnedVariables" value="false" />
+          <option name="m_ignoreAnnotatedVariables" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessaryModuleDependencyInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryParentheses" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreClarifyingParentheses" value="false" />
+          <option name="ignoreParenthesesOnConditionals" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessaryQualifierForThis" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryReturn" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryReturnJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessarySemicolon" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryStaticInjection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessarySuperConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessarySuperQualifier" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryTemporaryOnConversionFromString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryTemporaryOnConversionToString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryThis" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryUnaryMinus" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryUnboxing" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnparsedCustomBeanInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnpredictableBigDecimalConstructorCall" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreReferences" value="true" />
+          <option name="ignoreComplexLiterals" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnqualifiedFieldAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnqualifiedInnerClassAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnqualifiedStaticUsage" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreStaticFieldAccesses" value="false" />
+          <option name="m_ignoreStaticMethodCalls" value="false" />
+          <option name="m_ignoreStaticAccessFromStaticContext" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnreachableCodeJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnresolvedPropertyKey" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="UnresolvedReference" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="UnsecureRandomNumberGeneration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnterminatedStatementJS" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreSemicolonAtEndOfBlock" value="true" />
+        </inspection_tool>
+        <inspection_tool class="UnusedAssignment" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="REPORT_PREFIX_EXPRESSIONS" value="false" />
+          <option name="REPORT_POSTFIX_EXPRESSIONS" value="true" />
+          <option name="REPORT_REDUNDANT_INITIALIZER" value="true" />
+        </inspection_tool>
+        <inspection_tool class="UnusedCatchParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreCatchBlocksWithComments" value="false" />
+          <option name="m_ignoreTestCases" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnusedCatchParameterJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreCatchBlocksWithComments" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnusedDeclaration" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ADD_MAINS_TO_ENTRIES" value="true" />
+          <option name="ADD_APPLET_TO_ENTRIES" value="true" />
+          <option name="ADD_SERVLET_TO_ENTRIES" value="true" />
+          <option name="ADD_NONJAVA_TO_ENTRIES" value="true" />
+        </inspection_tool>
+        <inspection_tool class="UnusedDefine" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnusedImport" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnusedLabel" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnusedLibrary" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnusedMessageFormatParameter" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnusedParameters" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnusedProperty" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnusedReturnValue" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UpperCaseFieldNameNotConstant" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UseOfAWTPeerClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UseOfAnotherObjectsPrivateField" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreSameClass" value="false" />
+          <option name="ignoreEquals" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UseOfJDBCDriverClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UseOfProcessBuilder" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UseOfPropertiesAsHashtable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UseOfSunClasses" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UtilSchemaInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="UtilityClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UtilityClassWithPublicConstructor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UtilityClassWithoutPrivateConstructor" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreClassesWithOnlyMain" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ValidExternallyBoundObject" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ValidatorConfigModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ValidatorModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="VarargParameter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VariableNotUsedInsideIf" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VoidExpressionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VoidMethodAnnotatedWithGET" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VolatileArrayField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VolatileLongOrDoubleField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VtlDirectiveArgsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VtlFileReferencesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VtlInterpolationsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="VtlReferencesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VtlTypesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="W3CssValidation" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="myCssVersion" value="css3" />
+        </inspection_tool>
+        <inspection_tool class="WSReferenceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WaitCalledOnCondition" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WaitNotInLoop" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WaitNotInSynchronizedContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WaitOrAwaitWithoutTimeout" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WaitWhileHoldingTwoLocks" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WaitWithoutCorrespondingNotify" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WeakerAccess" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS" value="true" />
+          <option name="SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES" value="true" />
+          <option name="SUGGEST_PRIVATE_FOR_INNERS" value="false" />
+        </inspection_tool>
+        <inspection_tool class="WebProperties" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="WebWarnings" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WebflowConfigModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="WebflowModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="Weblogic" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="WhileCanBeForeach" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="WhileLoopSpinsOnField" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreNonEmtpyLoops" value="false" />
+        </inspection_tool>
+        <inspection_tool class="WithStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WrongPackageStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="WsdlHighlightingInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="XHTMLIncompatabilitiesJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="XmlDuplicatedId" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="XmlHighlighting" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="XmlUnboundNsPrefix" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="XmlUnusedNamespaceDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="XmlWrongRootElement" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="XsltDeclarations" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="XsltTemplateInvocation" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="XsltUnusedDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ZeroLengthArrayInitialization" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="dependsOnMethodTestNG" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="groupsTestNG" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="groups">
+            <value>
+              <list size="0" />
+            </value>
+          </option>
+        </inspection_tool>
+        <inspection_tool class="gwtRawAsyncCallback" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="osmorcClassInDefaultPackage" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="osmorcMissingFinalNewline" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="osmorcMisspelledHeaderName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="osmorcNonOsgiMavenDependency" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="osmorcUnregisteredActivator" enabled="false" level="ERROR" enabled_by_default="false" />
+      </profile>
+    </profiles>
+    <option name="PROJECT_PROFILE" value="Project Default" />
+    <option name="USE_PROJECT_PROFILE" value="true" />
+    <version value="1.0" />
+  </component>
+  <component name="JavadocGenerationManager">
+    <option name="OUTPUT_DIRECTORY" />
+    <option name="OPTION_SCOPE" value="protected" />
+    <option name="OPTION_HIERARCHY" value="true" />
+    <option name="OPTION_NAVIGATOR" value="true" />
+    <option name="OPTION_INDEX" value="true" />
+    <option name="OPTION_SEPARATE_INDEX" value="true" />
+    <option name="OPTION_DOCUMENT_TAG_USE" value="false" />
+    <option name="OPTION_DOCUMENT_TAG_AUTHOR" value="false" />
+    <option name="OPTION_DOCUMENT_TAG_VERSION" value="false" />
+    <option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="true" />
+    <option name="OPTION_DEPRECATED_LIST" value="true" />
+    <option name="OTHER_OPTIONS" value="" />
+    <option name="HEAP_SIZE" />
+    <option name="LOCALE" />
+    <option name="OPEN_IN_BROWSER" value="true" />
+  </component>
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/common/Common.iml" filepath="$PROJECT_DIR$/common/Common.iml" />
+      <module fileurl="file://$PROJECT_DIR$/domain/Domain.iml" filepath="$PROJECT_DIR$/domain/Domain.iml" />
+      <module fileurl="file://$PROJECT_DIR$/persistence/Persistence.iml" filepath="$PROJECT_DIR$/persistence/Persistence.iml" />
+      <module fileurl="file://$PROJECT_DIR$/Project_source.iml" filepath="$PROJECT_DIR$/Project_source.iml" />
+      <module fileurl="file://$PROJECT_DIR$/service/Service.iml" filepath="$PROJECT_DIR$/service/Service.iml" />
+      <module fileurl="file://$PROJECT_DIR$/web/Web.iml" filepath="$PROJECT_DIR$/web/Web.iml" />
+    </modules>
+  </component>
+  <component name="ProjectResources">
+    <default-html-doctype>http://www.w3.org/1999/xhtml</default-html-doctype>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+  <component name="ProjectRunConfigurationManager">
+    <configuration default="false" name="Tomcat 6" type="#com.intellij.j2ee.web.tomcat.TomcatRunConfigurationFactory" factoryName="Local" APPLICATION_SERVER_NAME="Tomcat 6">
+      <option name="OPEN_IN_BROWSER" value="false" />
+      <option name="OPEN_IN_BROWSER_URL" value="http://localhost:8080/" />
+      <option name="SHOW_DIALOG_ON_UPDATE" value="false" />
+      <option name="UPDATING_POLICY" value="restart-server" />
+      <deployment>
+        <artifact name="ether">
+          <settings>
+            <option name="CONTEXT_PATH" value="/" />
+          </settings>
+        </artifact>
+      </deployment>
+      <server-settings>
+        <option name="DEPLOY_TOMCAT_APPS" value="false" />
+        <option name="BASE_DIRECTORY_NAME" value="Tomcat_6_Project_source" />
+      </server-settings>
+      <predefined_log_file id="TOMCAT_LOCALHOST_LOG_ID" enabled="true" />
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <RunnerSettings RunnerId="Debug">
+        <option name="DEBUG_PORT" value="36875" />
+        <option name="TRANSPORT" value="0" />
+        <option name="LOCAL" value="true" />
+      </RunnerSettings>
+      <RunnerSettings RunnerId="Run" />
+      <ConfigurationWrapper VM_VAR="JAVA_OPTS" RunnerId="Debug">
+        <option name="USE_ENV_VARIABLES" value="true" />
+        <STARTUP>
+          <option name="USE_DEFAULT" value="true" />
+          <option name="SCRIPT" value="%IDEA_RUN:TOMCAT_HOME%/bin/catalina.sh" />
+          <option name="VM_PARAMETERS" value="" />
+          <option name="PROGRAM_PARAMETERS" value=" run" />
+        </STARTUP>
+        <SHUTDOWN>
+          <option name="USE_DEFAULT" value="true" />
+          <option name="SCRIPT" value="%IDEA_RUN:TOMCAT_HOME%/bin/catalina.sh" />
+          <option name="VM_PARAMETERS" value="" />
+          <option name="PROGRAM_PARAMETERS" value=" stop" />
+        </SHUTDOWN>
+        <EnvironmentVariables>
+          <option name="NAME" value="CATALINA_BASE" />
+          <option name="VALUE" value="/usr/local/apache-tomcat-6.0.18" />
+          <option name="IS_PREDEFINED" value="false" />
+        </EnvironmentVariables>
+      </ConfigurationWrapper>
+      <ConfigurationWrapper VM_VAR="JAVA_OPTS" RunnerId="Run">
+        <option name="USE_ENV_VARIABLES" value="true" />
+        <STARTUP>
+          <option name="USE_DEFAULT" value="true" />
+          <option name="SCRIPT" value="%IDEA_RUN:TOMCAT_HOME%/bin/catalina.sh" />
+          <option name="VM_PARAMETERS" value="" />
+          <option name="PROGRAM_PARAMETERS" value=" run" />
+        </STARTUP>
+        <SHUTDOWN>
+          <option name="USE_DEFAULT" value="true" />
+          <option name="SCRIPT" value="%IDEA_RUN:TOMCAT_HOME%/bin/catalina.sh" />
+          <option name="VM_PARAMETERS" value="" />
+          <option name="PROGRAM_PARAMETERS" value=" stop" />
+        </SHUTDOWN>
+        <EnvironmentVariables>
+          <option name="NAME" value="CATALINA_BASE" />
+          <option name="VALUE" value="/usr/local/apache-tomcat-6.0.18" />
+          <option name="IS_PREDEFINED" value="false" />
+        </EnvironmentVariables>
+      </ConfigurationWrapper>
+      <method>
+        <option name="BuildArtifacts" enabled="true">
+          <artifact name="ether" />
+        </option>
+      </method>
+    </configuration>
+  </component>
+  <component name="SvnBranchConfigurationManager">
+    <option name="myConfigurationMap">
+      <map>
+        <entry key="$PROJECT_DIR$">
+          <value>
+            <SvnBranchConfiguration>
+              <option name="trunkUrl" value="svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/ether/svn/project_source/trunk" />
+            </SvnBranchConfiguration>
+          </value>
+        </entry>
+      </map>
+    </option>
+    <option name="mySupportsUserInfoFilter" value="true" />
+  </component>
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="" />
+    <mapping directory="$PROJECT_DIR$" vcs="svn" />
+  </component>
+  <component name="WebServicesPlugin" addRequiredLibraries="true" />
+  <component name="libraryTable">
+    <library name="3.0.0">
+      <CLASSES>
+        <root url="jar://$PROJECT_DIR$/lib/spring-core.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/spring-asm.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/spring-beans.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/spring-context.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/spring-expression.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/spring-aop.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/spring-aspects.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/spring-tx.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/spring-instrument.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/spring-jdbc.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/spring-jms.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/spring-orm.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/spring-oxm.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/commons-logging.jar!/" />
+        <root url="jar://$PROJECT_DIR$/lib/aopalliance.jar!/" />
+      </CLASSES>
+      <JAVADOC />
+      <SOURCES />
+    </library>
+    <library name="lib_all">
+      <CLASSES>
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/antlr-2.7.6.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/annotations-7.0.2.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/cglib-2.2.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/asm-1.5.3.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/aopalliance.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-codec-1.3.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-aop.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-beanutils-1.7.0.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-collections-3.2.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-collections-3.1.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-discovery-0.4.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-digester-1.8.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-logging-1.1.1.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-lang-2.2.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/dom4j-1.6.1.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-validator.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-orm.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/ezmorph.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-jms.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/hibernate-3.3.2.GA.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-tx.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/hibernate-all.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-oxm.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/hibernate2.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/jakarta-taglibs-standard-1.0.6.zip!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/jasper-6.0.18.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/javassist-3.9.0.GA.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/jdom.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-aspects.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/json-lib-2.2.1-jdk15.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-asm.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/jstl-1.1.2.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-context.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/jstl-2.4.jar.zip!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-beans.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/jta-1.1.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-expression.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/junit-3.8.2.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-core.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/log4j-1.2.15.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-jdbc.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/mail.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-instrument.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/myfaces-api-1.2.6.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/servlet-api.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/postgresql-8.2-504.jdbc3.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/netcdfAll.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/myfaces-impl-1.2.6.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-web.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/slf4j-simple-1.5.8.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/slf4j-api-1.5.8.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/sgt_v30.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/struts.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/standard-1.1.2.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-webmvc.jar!/" />
+      </CLASSES>
+      <JAVADOC />
+      <SOURCES />
+    </library>
+    <library name="lib_common">
+      <CLASSES>
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/annotations-7.0.2.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-codec-1.3.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-beanutils-1.7.0.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-collections-3.2.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-collections-3.1.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-discovery-0.4.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-digester-1.8.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-logging-1.1.1.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-lang-2.2.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/commons-validator.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/json-lib-2.2.1-jdk15.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/junit-3.8.2.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/log4j-1.2.15.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/standard-1.1.2.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-beans.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/servlet-api.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-context.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-core.jar!/" />
+      </CLASSES>
+      <JAVADOC />
+      <SOURCES />
+    </library>
+    <library name="lib_hibernate">
+      <CLASSES>
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/hibernate-3.3.2.GA.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/hibernate-all.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/hibernate2.jar!/" />
+      </CLASSES>
+      <JAVADOC />
+      <SOURCES />
+    </library>
+    <library name="lib_spring">
+      <CLASSES>
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-web.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-aop.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-webmvc.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-orm.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-jms.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-tx.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-oxm.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-aspects.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-asm.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-context.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-beans.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-expression.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-core.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-jdbc.jar!/" />
+        <root url="jar://$PROJECT_DIR$/web/WEB-INF/lib/spring-instrument.jar!/" />
+      </CLASSES>
+      <JAVADOC />
+      <SOURCES>
+        <root url="jar://$PROJECT_DIR$/sources/org.springframework.core-sources-3.0.1.RELEASE-A.jar!/" />
+        <root url="jar://$PROJECT_DIR$/sources/spring-2.0.8-sources.jar!/" />
+      </SOURCES>
+    </library>
+  </component>
+</project>
+
Index: /ether_2012/ether.iws
===================================================================
--- /ether_2012/ether.iws	(revision 319)
+++ /ether_2012/ether.iws	(revision 319)
@@ -0,0 +1,1019 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CCaseConfig">
+    <option name="checkoutReserved" value="false" />
+    <option name="markExternalChangeAsUpToDate" value="true" />
+    <option name="checkInUseHijack" value="true" />
+    <option name="useUcmModel" value="true" />
+    <option name="synchOutside" value="false" />
+    <option name="isHistoryResticted" value="true" />
+    <option name="useIdenticalSwitch" value="true" />
+    <option name="synchActivitiesOnRefresh" value="true" />
+    <option name="lastScr" value="" />
+    <option name="scrTextFileName" value="" />
+    <option name="historyRevisionsNumber" value="4" />
+  </component>
+  <component name="ChangeListManager">
+    <list default="true" readonly="true" id="19090696-352b-4acf-ae79-b4145552009b" name="Default" comment="">
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/images" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/js" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/resources/template" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/common/implementation/com/ether/Context.java" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/resources/template/templateMegapoli.jsp" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/web/init.jsp" afterPath="$PROJECT_DIR$/web/init.jsp" />
+    </list>
+    <list id="e7c09dc9-40b6-46cf-b964-8f5f3ec37c23" name="Not To Commit" comment="">
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/AUTHORS.textile" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/CHANGELOG" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/README.textile" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/TUTORIAL.textile" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/buttons/icons/cross.png" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/buttons/icons/key.png" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/buttons/icons/tick.png" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/buttons/icons" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/buttons" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/fancy-type" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/icons/doc.png" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/icons/email.png" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/icons/external.png" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/icons/feed.png" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/icons/im.png" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/icons/pdf.png" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/icons/visited.png" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/icons/xls.png" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/icons" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/link-icons" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/rtl" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/src/grid.png" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/src" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/blueprint.rb" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/compressor.rb" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/core_ext.rb" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/css_parser.rb" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/custom_layout.rb" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/grid.css.erb" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/grid_builder.rb" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/namespace.rb" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/semantic_class_names.rb" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/validate/JIGSAW_COPYRIGHT" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/validate/css-validator-javadoc.jar" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/validate/css-validator.jar" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/validate/jigsaw.jar" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/validate/xerces.jar" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/validate" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/validator.rb" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/compress.rb" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/validate.rb" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/templates/psd/fixed-width.psd" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/templates/psd" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/templates" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/tests/parts/test-small.jpg" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/tests/parts/test.jpg" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/tests/parts/valid.png" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/tests/parts" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/tests" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/images/loading.gif" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/images/radio_off.gif" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/images/radio_on.gif" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/images/select_left.gif" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/images/select_middle.gif" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/images/select_right.gif" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/anytime.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/.gitignore" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/LICENSE" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/ie.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/buttons/readme.txt" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/buttons/screen.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/fancy-type/readme.txt" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/fancy-type/screen.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/readme.txt" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/screen.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/rtl/readme.txt" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/plugins/rtl/screen.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/print.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/screen.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/src/forms.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/src/grid.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/src/ie.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/src/print.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/src/reset.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/blueprint/src/typography.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/validate/COPYRIGHT.html" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/validate/README.html" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/blueprint/validate/XERCES_COPYING.txt" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/lib/settings.example.yml" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/tests/index.html" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/tests/parts/elements.html" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/tests/parts/forms.html" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/tests/parts/grid.html" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/blueprint-css/tests/parts/sample.html" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/button.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/ether.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/radio.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/css/select.css" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/js/Button.js" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/js/Loading.js" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/js/Radio.js" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/js/Radio_sauv.js" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/js/Select.js" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/js/anytime.js" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/js/jquery-1.4.2.min.js" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/js/prototype.js" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/visu_cathy-script.jsp" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/web/cathy/visu_cathy.jsp" />
+    </list>
+    <ignored path="Project_source.iws" />
+    <ignored path=".idea/workspace.xml" />
+    <ignored path="web/WEB-INF/classes/com/ether/dao/" />
+    <ignored path="web/WEB-INF/classes/com/ether/" />
+    <ignored path="web/WEB-INF/classes/com/ether/annotation/" />
+    <ignored path="web/WEB-INF/classes/com/" />
+    <ignored path="web/WEB-INF/classes/json/" />
+    <ignored path="web/WEB-INF/classes/json/serializers/" />
+    <ignored path="web/WEB-INF/classes/" />
+    <ignored path="work/" />
+    <ignored path="work/org/apache/jsp/resources/jsp/" />
+    <ignored path="work/org/apache/jsp/tag/web/" />
+    <ignored path="work/org/apache/jsp/resources/" />
+    <ignored path="work/org/apache/jsp/tag/" />
+    <ignored path="work/org/apache/jsp/visualization/" />
+    <ignored path="work/org/apache/jsp/" />
+    <ignored path="work/org/apache/" />
+    <ignored path="work/org/" />
+    <ignored path="work/org/apache/jsp/cathy/" />
+    <option name="TRACKING_ENABLED" value="true" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="ChangesViewManager" flattened_view="true" show_ignored="false" />
+  <component name="CoverageDataManager" choice="3" />
+  <component name="CreatePatchCommitExecutor">
+    <option name="PATCH_PATH" value="" />
+    <option name="REVERSE_PATCH" value="false" />
+  </component>
+  <component name="DaemonCodeAnalyzer">
+    <disable_hints />
+  </component>
+  <component name="DebuggerManager">
+    <breakpoint_any>
+      <breakpoint>
+        <option name="NOTIFY_CAUGHT" value="true" />
+        <option name="NOTIFY_UNCAUGHT" value="true" />
+        <option name="ENABLED" value="false" />
+        <option name="LOG_ENABLED" value="false" />
+        <option name="LOG_EXPRESSION_ENABLED" value="false" />
+        <option name="SUSPEND_POLICY" value="SuspendAll" />
+        <option name="COUNT_FILTER_ENABLED" value="false" />
+        <option name="COUNT_FILTER" value="0" />
+        <option name="CONDITION_ENABLED" value="false" />
+        <option name="CLASS_FILTERS_ENABLED" value="false" />
+        <option name="INSTANCE_FILTERS_ENABLED" value="false" />
+        <option name="CONDITION" value="" />
+        <option name="LOG_MESSAGE" value="" />
+      </breakpoint>
+      <breakpoint>
+        <option name="NOTIFY_CAUGHT" value="true" />
+        <option name="NOTIFY_UNCAUGHT" value="true" />
+        <option name="ENABLED" value="false" />
+        <option name="LOG_ENABLED" value="false" />
+        <option name="LOG_EXPRESSION_ENABLED" value="false" />
+        <option name="SUSPEND_POLICY" value="SuspendAll" />
+        <option name="COUNT_FILTER_ENABLED" value="false" />
+        <option name="COUNT_FILTER" value="0" />
+        <option name="CONDITION_ENABLED" value="false" />
+        <option name="CLASS_FILTERS_ENABLED" value="false" />
+        <option name="INSTANCE_FILTERS_ENABLED" value="false" />
+        <option name="CONDITION" value="" />
+        <option name="LOG_MESSAGE" value="" />
+      </breakpoint>
+    </breakpoint_any>
+    <breakpoint_rules />
+    <ui_properties />
+  </component>
+  <component name="FavoritesManager">
+    <favorites_list name="Project_source" />
+  </component>
+  <component name="FileEditorManager">
+    <leaf>
+      <file leaf-file-name="Controller.java" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/web/src/com/ether/Controller.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="24" column="49" selection-start="687" selection-end="687" vertical-scroll-proportion="0.0">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="templateMegapoli.jsp" pinned="false" current="true" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/web/resources/template/templateMegapoli.jsp">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="21" column="39" selection-start="995" selection-end="995" vertical-scroll-proportion="0.5294118">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="init.jsp" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/web/init.jsp">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="72" column="53" selection-start="2643" selection-end="2643" vertical-scroll-proportion="0.0">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="controls.js" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/web/resources/js/autocomplete/javascript/controls.js">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="344" column="18" selection-start="11266" selection-end="11266" vertical-scroll-proportion="0.0">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="response.php" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/web/resources/js/autocomplete/response.php">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="7" column="65" selection-start="240" selection-end="240" vertical-scroll-proportion="0.0">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="db.php" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/web/resources/js/autocomplete/db.php">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="18" column="74" selection-start="196" selection-end="196" vertical-scroll-proportion="0.0">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="index.html" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/web/resources/js/autocomplete/index.html">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="57" column="116" selection-start="2507" selection-end="2507" vertical-scroll-proportion="0.0">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="test.js" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/web/resources/js/autocomplete/test.js">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="messages_en.properties" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/web/src/messages_en.properties">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="10" column="0" selection-start="265" selection-end="265" vertical-scroll-proportion="0.0">
+              <folding />
+            </state>
+          </provider>
+          <provider editor-type-id="ResourceBundle">
+            <state />
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="web.xml" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/web/WEB-INF/web.xml">
+          <provider selected="true" editor-type-id="text-editor">
+            <state line="46" column="138" selection-start="1677" selection-end="1677" vertical-scroll-proportion="0.0">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+    </leaf>
+  </component>
+  <component name="FindManager">
+    <FindUsagesManager>
+      <setting name="OPEN_NEW_TAB" value="false" />
+    </FindUsagesManager>
+  </component>
+  <component name="Git.Settings">
+    <option name="CHECKOUT_INCLUDE_TAGS" value="false" />
+    <option name="UPDATE_CHANGES_POLICY" value="STASH" />
+  </component>
+  <component name="IdeDocumentHistory">
+    <option name="changedFiles">
+      <list>
+        <option value="$PROJECT_DIR$/web/visualization/visu_cathy-script.jsp" />
+        <option value="$PROJECT_DIR$/web/visualization/visu_cathy.jsp" />
+        <option value="$PROJECT_DIR$/web/resources/css/ether.css" />
+        <option value="$PROJECT_DIR$/web/cathy/ether.css" />
+        <option value="$PROJECT_DIR$/web/cathy/css/button.css" />
+        <option value="$PROJECT_DIR$/web/cathy/css/ether.css" />
+        <option value="$PROJECT_DIR$/web/cathy/css/radio.css" />
+        <option value="$PROJECT_DIR$/web/cathy/js/Select.js" />
+        <option value="$PROJECT_DIR$/web/cathy/visu_cathy-script.jsp" />
+        <option value="$PROJECT_DIR$/web/cathy/js/Radio.js" />
+        <option value="$PROJECT_DIR$/web/cathy/visu_cathy.jsp" />
+        <option value="$PROJECT_DIR$/web/visualization/visu.jsp" />
+        <option value="$PROJECT_DIR$/web/src/messages_en.properties" />
+        <option value="$PROJECT_DIR$/web/init.jsp" />
+        <option value="$PROJECT_DIR$/web/resources/js/autocomplete/index.html" />
+        <option value="$PROJECT_DIR$/web/resources/js/autocomplete/response.php" />
+      </list>
+    </option>
+  </component>
+  <component name="LogFilters">
+    <option name="FILTER_ERRORS" value="false" />
+    <option name="FILTER_WARNINGS" value="false" />
+    <option name="FILTER_INFO" value="true" />
+    <option name="FILTER_DEBUG" value="true" />
+    <option name="CUSTOM_FILTER" />
+  </component>
+  <component name="MavenRunner">
+    <option name="jreName" value="#JAVA_INTERNAL" />
+  </component>
+  <component name="ModuleEditorState">
+    <option name="LAST_EDITED_MODULE_NAME" />
+    <option name="LAST_EDITED_TAB_NAME" />
+  </component>
+  <component name="ProjectLevelVcsManager" settingsEditedManually="true">
+    <OptionsSetting value="true" id="Add" />
+    <OptionsSetting value="true" id="Remove" />
+    <OptionsSetting value="true" id="Checkout" />
+    <OptionsSetting value="true" id="Update" />
+    <OptionsSetting value="true" id="Status" />
+    <OptionsSetting value="true" id="Edit" />
+    <OptionsSetting value="true" id="Undo Check Out" />
+    <OptionsSetting value="true" id="Get Latest Version" />
+    <ConfirmationsSetting value="0" id="Add" />
+    <ConfirmationsSetting value="0" id="Remove" />
+  </component>
+  <component name="ProjectReloadState">
+    <option name="STATE" value="0" />
+  </component>
+  <component name="ProjectView">
+    <navigator currentView="ProjectPane" proportions="" version="1" splitterProportion="0.5">
+      <flattenPackages />
+      <showMembers />
+      <showModules />
+      <showLibraryContents />
+      <hideEmptyPackages />
+      <abbreviatePackageNames />
+      <autoscrollToSource />
+      <autoscrollFromSource ProjectPane="true" />
+      <sortByType />
+    </navigator>
+    <panes>
+      <pane id="Favorites" />
+      <pane id="Scope" />
+      <pane id="PackagesPane" />
+      <pane id="ProjectPane">
+        <subPane>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="ether" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="ether" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="web" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="ether" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="web" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="ether" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="web" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="ether" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="ether" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="web" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="resources" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="template" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="ether" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="web" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="resources" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+        </subPane>
+      </pane>
+    </panes>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="GoToFile.includeJavaFiles" value="false" />
+    <property name="project.structure.last.edited" value="Artifacts" />
+    <property name="project.structure.proportion" value="0.09811617" />
+    <property name="options.splitter.main.proportions" value="0.3" />
+    <property name="RESOURCE_BUNDLE_SPLITTER_PROPORTION" value="0.5" />
+    <property name="MemberChooser.sorted" value="false" />
+    <property name="options.lastSelected" value="preferences.externalResources" />
+    <property name="recentsLimit" value="5" />
+    <property name="project.structure.side.proportion" value="0.12784588" />
+    <property name="GoToClass.includeJavaFiles" value="false" />
+    <property name="MemberChooser.copyJavadoc" value="false" />
+    <property name="GoToClass.toSaveIncludeLibraries" value="false" />
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="MemberChooser.showClasses" value="true" />
+    <property name="GoToClass.includeLibraries" value="false" />
+    <property name="options.splitter.details.proportions" value="0.2" />
+    <property name="options.searchVisible" value="true" />
+    <property name="dynamic.classpath" value="false" />
+  </component>
+  <component name="RecentsManager">
+    <key name="CopyClassDialog.RECENTS_KEY">
+      <recent name="com.ether.dao" />
+      <recent name="json.serializers" />
+    </key>
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="$PROJECT_DIR$/web/resources/template" />
+      <recent name="$PROJECT_DIR$/web/cathy/js" />
+      <recent name="$PROJECT_DIR$/web/cathy/css" />
+      <recent name="$PROJECT_DIR$/web/cathy/images" />
+      <recent name="$PROJECT_DIR$/web/cathy" />
+    </key>
+  </component>
+  <component name="RunManager" selected="Tomcat Server.Tomcat 6">
+    <configuration default="false" name="OtherTest.testDatesMoisPlusUn" type="JUnit" factoryName="JUnit" temporary="true">
+      <extension name="coverage" enabled="false" merge="false">
+        <pattern>
+          <option name="PATTERN" value="com.ether.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <module name="Service" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" value="com.ether" />
+      <option name="MAIN_CLASS_NAME" value="com.ether.OtherTest" />
+      <option name="METHOD_NAME" value="testDatesMoisPlusUn" />
+      <option name="TEST_OBJECT" value="method" />
+      <option name="VM_PARAMETERS" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="moduleWithDependencies" />
+      </option>
+      <envs />
+      <patterns />
+      <RunnerSettings RunnerId="Debug">
+        <option name="DEBUG_PORT" value="35330" />
+        <option name="TRANSPORT" value="0" />
+        <option name="LOCAL" value="true" />
+      </RunnerSettings>
+      <RunnerSettings RunnerId="Run" />
+      <ConfigurationWrapper RunnerId="Debug" />
+      <ConfigurationWrapper RunnerId="Run" />
+      <method />
+    </configuration>
+    <configuration default="true" type="PHPUnitRunConfigurationType" factoryName="PHPUnit">
+      <method>
+        <option name="AntTarget" enabled="false" />
+        <option name="BuildArtifacts" enabled="false" />
+        <option name="Maven.BeforeRunTask" enabled="false" />
+      </method>
+    </configuration>
+    <configuration default="true" type="Remote" factoryName="Remote">
+      <option name="USE_SOCKET_TRANSPORT" value="true" />
+      <option name="SERVER_MODE" value="false" />
+      <option name="SHMEM_ADDRESS" value="javadebug" />
+      <option name="HOST" value="localhost" />
+      <option name="PORT" value="5005" />
+      <method>
+        <option name="AntTarget" enabled="false" />
+        <option name="BuildArtifacts" enabled="false" />
+        <option name="Maven.BeforeRunTask" enabled="false" />
+      </method>
+    </configuration>
+    <configuration default="true" type="FlexUnitRunConfigurationType" factoryName="FlexUnit" adl_options="" air_descriptor_path="" air_program_params="" air_publisher_id="" air_root_dir_path="" air_run_mode="AppDescriptor" browser_family="FIREFOX" class_name="" debugger_sdk="Module SDK" html_or_swf_file_path="" launcher_type="OSDefault" main_class_name="" method_name="" module_name="" output_log_level="" package_name="" player_path="/usr/bin/flashplayer" port="0" run_mode="HtmlOrSwfFile" run_trusted="false" scope="Class" socket_policy_port="0" url_to_launch="http://">
+      <method>
+        <option name="AntTarget" enabled="false" />
+        <option name="BuildArtifacts" enabled="false" />
+        <option name="Make" enabled="true" />
+        <option name="Maven.BeforeRunTask" enabled="false" />
+      </method>
+    </configuration>
+    <configuration default="true" type="Applet" factoryName="Applet">
+      <module name="" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="HTML_FILE_NAME" />
+      <option name="HTML_USED" value="false" />
+      <option name="WIDTH" value="400" />
+      <option name="HEIGHT" value="300" />
+      <option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
+      <option name="VM_PARAMETERS" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <method>
+        <option name="AntTarget" enabled="false" />
+        <option name="BuildArtifacts" enabled="false" />
+        <option name="Make" enabled="true" />
+        <option name="Maven.BeforeRunTask" enabled="false" />
+      </method>
+    </configuration>
+    <configuration default="true" type="Application" factoryName="Application">
+      <extension name="coverage" enabled="false" merge="false" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="VM_PARAMETERS" />
+      <option name="PROGRAM_PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="ENABLE_SWING_INSPECTOR" value="false" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <module name="" />
+      <envs />
+      <method>
+        <option name="AntTarget" enabled="false" />
+        <option name="BuildArtifacts" enabled="false" />
+        <option name="Make" enabled="true" />
+        <option name="Maven.BeforeRunTask" enabled="false" />
+      </method>
+    </configuration>
+    <configuration default="true" type="PhpUnitRemoteRunConfigurationType" factoryName="PHPUnit on Server">
+      <method>
+        <option name="AntTarget" enabled="false" />
+        <option name="BuildArtifacts" enabled="false" />
+        <option name="FtpUpload" enabled="false">
+          <server_id />
+          <server_name />
+        </option>
+        <option name="Maven.BeforeRunTask" enabled="false" />
+      </method>
+    </configuration>
+    <configuration default="true" type="JUnit" factoryName="JUnit">
+      <extension name="coverage" enabled="false" merge="false" />
+      <module name="" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="METHOD_NAME" />
+      <option name="TEST_OBJECT" value="class" />
+      <option name="VM_PARAMETERS" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="moduleWithDependencies" />
+      </option>
+      <envs />
+      <patterns />
+      <method>
+        <option name="AntTarget" enabled="false" />
+        <option name="BuildArtifacts" enabled="false" />
+        <option name="Make" enabled="true" />
+        <option name="Maven.BeforeRunTask" enabled="false" />
+      </method>
+    </configuration>
+    <configuration default="true" type="#com.intellij.j2ee.web.tomcat.TomcatRunConfigurationFactory" factoryName="Local">
+      <deployment />
+      <server-settings>
+        <option name="DEPLOY_TOMCAT_APPS" value="false" />
+        <option name="BASE_DIRECTORY_NAME" value="" />
+      </server-settings>
+      <predefined_log_file id="TOMCAT_LOCALHOST_LOG_ID" enabled="true" />
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <method>
+        <option name="AntTarget" enabled="false" />
+        <option name="BuildArtifacts" enabled="false" />
+        <option name="Make" enabled="true" />
+        <option name="Maven.BeforeRunTask" enabled="false" />
+      </method>
+    </configuration>
+    <list size="2">
+      <item index="0" class="java.lang.String" itemvalue="JUnit.OtherTest.testDatesMoisPlusUn" />
+      <item index="1" class="java.lang.String" itemvalue="Tomcat Server.Tomcat 6" />
+    </list>
+    <configuration name="&lt;template&gt;" type="WebApp" default="true" selected="false">
+      <Host>localhost</Host>
+      <Port>5050</Port>
+    </configuration>
+  </component>
+  <component name="ShelveChangesManager" show_recycled="false" />
+  <component name="SvnConfiguration" maxAnnotateRevisions="500">
+    <option name="USER" value="" />
+    <option name="PASSWORD" value="" />
+    <option name="LAST_MERGED_REVISION" />
+    <option name="MERGE_DRY_RUN" value="false" />
+    <option name="MERGE_DIFF_USE_ANCESTRY" value="true" />
+    <option name="UPDATE_LOCK_ON_DEMAND" value="false" />
+    <option name="IGNORE_SPACES_IN_MERGE" value="false" />
+    <option name="DETECT_NESTED_COPIES" value="true" />
+    <option name="CHECK_NESTED_FOR_QUICK_MERGE" value="false" />
+    <option name="IGNORE_SPACES_IN_ANNOTATE" value="true" />
+    <option name="SHOW_MERGE_SOURCES_IN_ANNOTATE" value="true" />
+    <option name="FORCE_UPDATE" value="false" />
+    <configuration useDefault="true">$USER_HOME$/.subversion_IDEA</configuration>
+    <myIsUseDefaultProxy>false</myIsUseDefaultProxy>
+    <supportedVersion>125</supportedVersion>
+  </component>
+  <component name="SvnFileUrlMappingImpl">
+    <option name="myMappingRoots">
+      <list>
+        <SvnCopyRootSimple>
+          <option name="myVcsRoot" value="$PROJECT_DIR$" />
+          <option name="myCopyRoot" value="$PROJECT_DIR$" />
+        </SvnCopyRootSimple>
+      </list>
+    </option>
+    <option name="myMoreRealMappingRoots">
+      <list>
+        <SvnCopyRootSimple>
+          <option name="myVcsRoot" value="$PROJECT_DIR$" />
+          <option name="myCopyRoot" value="$PROJECT_DIR$" />
+        </SvnCopyRootSimple>
+      </list>
+    </option>
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <option name="associatedChangelistId" value="4662fb79-a017-4123-9cbd-77a192d0a8b0" />
+      <changelist id="19090696-352b-4acf-ae79-b4145552009b" name="Default" comment="" />
+      <created>1307631711342</created>
+      <updated>1308334548592</updated>
+    </task>
+    <task id="LOCAL-00001" summary="Not To Commit">
+      <changelist id="e7c09dc9-40b6-46cf-b964-8f5f3ec37c23" name="Not To Commit" comment="" />
+      <created>1308656514375</created>
+      <updated>1308656514375</updated>
+    </task>
+    <option name="localTasksCounter" value="2" />
+    <servers />
+  </component>
+  <component name="TodoView" selected-index="0">
+    <todo-panel id="selected-file">
+      <are-packages-shown value="false" />
+      <are-modules-shown value="false" />
+      <flatten-packages value="false" />
+      <is-autoscroll-to-source value="true" />
+    </todo-panel>
+    <todo-panel id="all">
+      <are-packages-shown value="true" />
+      <are-modules-shown value="false" />
+      <flatten-packages value="false" />
+      <is-autoscroll-to-source value="true" />
+    </todo-panel>
+    <todo-panel id="default-changelist">
+      <are-packages-shown value="false" />
+      <are-modules-shown value="false" />
+      <flatten-packages value="false" />
+      <is-autoscroll-to-source value="false" />
+    </todo-panel>
+  </component>
+  <component name="ToolWindowManager">
+    <frame x="-4" y="25" width="1688" height="1003" extended-state="6" />
+    <editor active="true" />
+    <layout>
+      <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.21586931" sideWeight="0.0" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="SVN Properties" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32905483" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+      <window_info id="Persistence" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
+      <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.28354725" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="IDEtalk Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32905483" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3293979" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Web" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.17894737" sideWeight="0.24557261" order="1" side_tool="true" content_ui="tabs" />
+      <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.16871166" sideWeight="0.7841307" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3293979" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3293979" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="SVN Repositories" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.5218418" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
+      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+    </layout>
+  </component>
+  <component name="VcsManagerConfiguration">
+    <option name="OFFER_MOVE_TO_ANOTHER_CHANGELIST_ON_PARTIAL_COMMIT" value="true" />
+    <option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="true" />
+    <option name="PERFORM_UPDATE_IN_BACKGROUND" value="true" />
+    <option name="PERFORM_COMMIT_IN_BACKGROUND" value="true" />
+    <option name="PERFORM_EDIT_IN_BACKGROUND" value="true" />
+    <option name="PERFORM_CHECKOUT_IN_BACKGROUND" value="true" />
+    <option name="PERFORM_ADD_REMOVE_IN_BACKGROUND" value="true" />
+    <option name="PERFORM_ROLLBACK_IN_BACKGROUND" value="false" />
+    <option name="CHECK_LOCALLY_CHANGED_CONFLICTS_IN_BACKGROUND" value="false" />
+    <option name="ENABLE_BACKGROUND_PROCESSES" value="false" />
+    <option name="CHANGED_ON_SERVER_INTERVAL" value="60" />
+    <option name="SHOW_ONLY_CHANGED_IN_SELECTION_DIFF" value="true" />
+    <option name="CHECK_COMMIT_MESSAGE_SPELLING" value="true" />
+    <option name="FORCE_NON_EMPTY_COMMENT" value="false" />
+    <option name="LAST_COMMIT_MESSAGE" value="Test svn" />
+    <option name="MAKE_NEW_CHANGELIST_ACTIVE" value="true" />
+    <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false" />
+    <option name="CHECK_FILES_UP_TO_DATE_BEFORE_COMMIT" value="false" />
+    <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="false" />
+    <option name="REFORMAT_BEFORE_FILE_COMMIT" value="false" />
+    <option name="FILE_HISTORY_DIALOG_COMMENTS_SPLITTER_PROPORTION" value="0.8" />
+    <option name="FILE_HISTORY_DIALOG_SPLITTER_PROPORTION" value="0.5" />
+    <option name="ACTIVE_VCS_NAME" />
+    <option name="UPDATE_GROUP_BY_PACKAGES" value="false" />
+    <option name="UPDATE_GROUP_BY_CHANGELIST" value="false" />
+    <option name="SHOW_FILE_HISTORY_AS_TREE" value="false" />
+    <option name="FILE_HISTORY_SPLITTER_PROPORTION" value="0.6" />
+    <MESSAGE value="Ajout de la vue &quot;Changes&quot;" />
+    <MESSAGE value="Cleanup " />
+    <MESSAGE value="Cleanup Project_source " />
+    <MESSAGE value="Cleanup Project" />
+    <MESSAGE value="Test svn" />
+  </component>
+  <component name="VssConfiguration">
+    <option name="CLIENT_PATH" value="" />
+    <option name="SRCSAFEINI_PATH" value="" />
+    <option name="USER_NAME" value="" />
+    <option name="PWD" value="" />
+    <CheckoutOptions>
+      <option name="COMMENT" value="" />
+      <option name="DO_NOT_GET_LATEST_VERSION" value="false" />
+      <option name="REPLACE_WRITABLE" value="false" />
+      <option name="RECURSIVE" value="false" />
+    </CheckoutOptions>
+    <CheckinOptions>
+      <option name="COMMENT" value="" />
+      <option name="KEEP_CHECKED_OUT" value="false" />
+      <option name="RECURSIVE" value="false" />
+    </CheckinOptions>
+    <AddOptions>
+      <option name="STORE_ONLY_LATEST_VERSION" value="false" />
+      <option name="CHECK_OUT_IMMEDIATELY" value="false" />
+    </AddOptions>
+    <UndocheckoutOptions>
+      <option name="MAKE_WRITABLE" value="false" />
+      <option name="REPLACE_LOCAL_COPY" value="2" />
+      <option name="RECURSIVE" value="false" />
+    </UndocheckoutOptions>
+    <GetOptions>
+      <option name="REPLACE_WRITABLE" value="0" />
+      <option name="MAKE_WRITABLE" value="false" />
+      <option name="ANSWER_NEGATIVELY" value="false" />
+      <option name="ANSWER_POSITIVELY" value="false" />
+      <option name="RECURSIVE" value="false" />
+      <option name="VERSION" />
+    </GetOptions>
+  </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager />
+  </component>
+  <component name="antWorkspaceConfiguration">
+    <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" />
+    <option name="FILTER_TARGETS" value="false" />
+  </component>
+  <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/web/cathy/js/Button.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="12" column="4" selection-start="457" selection-end="457" vertical-scroll-proportion="0.31141868" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/cathy/visu_cathy-script.jsp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="85" column="54" selection-start="3694" selection-end="3694" vertical-scroll-proportion="0.0" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/cathy/js/Select.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="91" column="8" selection-start="3612" selection-end="3612" vertical-scroll-proportion="0.0" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/cathy/visu_cathy.jsp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="25" column="58" selection-start="1179" selection-end="1179" vertical-scroll-proportion="-10.625" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/index.jsp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/visualization/visu.jsp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="33" column="0" selection-start="897" selection-end="897" vertical-scroll-proportion="-18.708334" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/init.jsp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="72" column="53" selection-start="2643" selection-end="2643" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/resources/js/autocomplete/javascript/controls.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="344" column="18" selection-start="11266" selection-end="11266" vertical-scroll-proportion="0.0" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/resources/js/autocomplete/db.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="18" column="74" selection-start="196" selection-end="196" vertical-scroll-proportion="0.0" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/resources/js/autocomplete/index.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="57" column="116" selection-start="2507" selection-end="2507" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/resources/js/autocomplete/test.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/src/messages_en.properties">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="10" column="0" selection-start="265" selection-end="265" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="ResourceBundle">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/WEB-INF/web.xml">
+      <provider editor-type-id="com.intellij.javaee.module.view.web.viewlets.WebModuleAssemblyDescriptorProvider">
+        <state />
+      </provider>
+      <provider editor-type-id="com.intellij.javaee.module.view.web.viewlets.WebModuleAssemblyDescriptorReferencesProvider">
+        <state />
+      </provider>
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="46" column="138" selection-start="1677" selection-end="1677" vertical-scroll-proportion="0.0" />
+      </provider>
+      <provider editor-type-id="com.intellij.javaee.module.view.web.viewlets.WebModuleGeneralEditorProvider">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/resources/js/autocomplete/response.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="7" column="65" selection-start="240" selection-end="240" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/src/com/ether/Controller.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="24" column="49" selection-start="687" selection-end="687" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/web/resources/template/templateMegapoli.jsp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="21" column="39" selection-start="995" selection-end="995" vertical-scroll-proportion="0.5294118">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+  </component>
+  <component name="masterDetails">
+    <states>
+      <state key="ArtifactsStructureConfigurable.UI">
+        <settings>
+          <artifact-editor />
+          <last-edited>ether</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.12784588" />
+                <option value="0.5" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="FacetStructureConfigurable.UI">
+        <settings>
+          <last-edited>Android</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.12784588" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="GlobalLibrariesConfigurable.UI">
+        <settings>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.12784588" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="JdkListConfigurable.UI">
+        <settings>
+          <last-edited>1.6</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.12784588" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="ModuleStructureConfigurable.UI">
+        <settings>
+          <last-edited>Common</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.12784588" />
+                <option value="0.5" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="ProjectLibrariesConfigurable.UI">
+        <settings>
+          <last-edited>lib_spring</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.12784588" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+    </states>
+  </component>
+</project>
+
Index: /ether_2012/out/production/Common/log4j.xml
===================================================================
--- /ether_2012/out/production/Common/log4j.xml	(revision 319)
+++ /ether_2012/out/production/Common/log4j.xml	(revision 319)
@@ -0,0 +1,74 @@
+<?com.medias.xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" threshold="all" debug="true">
+
+    <appender name="console" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="LOG4J %p %d{ISO8601} - %c{1} - %m%n"/>
+        </layout>
+    </appender>
+
+    <appender name="file" class="org.apache.log4j.FileAppender">
+        <param name="file" value="/home_local/workspaces/log4j_Project_source.log"/>
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="LOG4J %p %d{ISO8601} - %c{1} - %m%n"/>
+        </layout>
+    </appender>
+
+    <appender name="consoleHibernate" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="HIBERNATE : %p %d{ISO8601} - %c{1} - %m%n"/>
+        </layout>
+    </appender>
+ 
+    <!-- library loggers -->
+    <logger name="oracle.jdbc" additivity="false">
+        <level value="info"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="console"/>
+    </logger>
+
+    <logger name="oracle.ons" additivity="false">
+        <level value="debug"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="console"/>
+    </logger>
+
+    <logger name="org.hibernate">
+        <level value="trace"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="consoleHibernate"/>
+    </logger>
+
+<!--    <logger name="org.hibernate.persister.entity" additivity="false">-->
+<!--        <level value="trace"/>-->
+<!--        <appender-ref ref="file"/>-->
+<!--        <appender-ref ref="consoleHibernate"/>-->
+<!--    </logger>-->
+<!---->
+<!--	<logger name="org.hibernate.type">-->
+<!--        <level value="trace"/>-->
+<!--        <appender-ref ref="file"/>-->
+<!--        <appender-ref ref="consoleHibernate"/>-->
+<!--    </logger>-->
+<!--    -->
+<!--    <logger name="org.hibernate.SQL">-->
+<!--        <level value="trace"/>-->
+<!--        <appender-ref ref="file"/>-->
+<!--        <appender-ref ref="consoleHibernate"/>-->
+<!--    </logger>-->
+
+    <logger name="net.sf.cglib" additivity="false">
+        <level value="warn"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="console"/>
+    </logger>
+
+    <!-- root logger -->
+    <root>
+        <level value="warn"/>
+        <appender-ref ref="console"/>
+        <appender-ref ref="file"/>
+    </root>
+
+</log4j:configuration>
Index: /ether_2012/out/production/Persistence/com/ether/dao/Parameter.hbm.xml
===================================================================
--- /ether_2012/out/production/Persistence/com/ether/dao/Parameter.hbm.xml	(revision 319)
+++ /ether_2012/out/production/Persistence/com/ether/dao/Parameter.hbm.xml	(revision 319)
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.ether.Parameter" table="parametre" schema="public">
+        <comment>Table enumerant les differents parametres de mesure</comment>
+        <id name="id" type="int">
+            <column name="parametre_id" />
+            <!--<generator class="sequence">-->
+            <!--<param name="sequence">parametre_parametre_id_seq</param>-->
+            <!--</generator>-->
+        </id>
+
+        <property name="name" type="string">
+            <column name="parametre_nom" length="100" not-null="true">
+                <comment>nom du parametre</comment>
+            </column>
+        </property>
+
+        <set name="plateformes" inverse="true" table="requete_plat_param">
+            <key>
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.ether.Plateform">
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </many-to-many>
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_2012/out/production/Persistence/com/ether/dao/Parameter_old.hbm.xml
===================================================================
--- /ether_2012/out/production/Persistence/com/ether/dao/Parameter_old.hbm.xml	(revision 319)
+++ /ether_2012/out/production/Persistence/com/ether/dao/Parameter_old.hbm.xml	(revision 319)
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-cascade="save-update" auto-import="false">
+
+	<class name="com.ether.Parameter" table="parameter">
+
+		<id name="id">
+			<column name="parametre_id" />
+			<generator class="increment" />
+
+			<!-- <generator class="sequence"> -->
+			<!-- <param name="sequence">S_TABLE_TEST</param> -->
+			<!-- </generator> -->
+		</id>
+
+		<property name="name">
+			<column name="parametre_nom"/>
+		</property>
+
+        <set name="plateformes" inverse="true" table="requete_plat_param">
+            <key>
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.ether.Plateform">
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </many-to-many>
+        </set>
+
+	</class>
+
+
+
+</hibernate-mapping>
+
Index: /ether_2012/out/production/Persistence/com/ether/dao/Plateform.hbm.xml
===================================================================
--- /ether_2012/out/production/Persistence/com/ether/dao/Plateform.hbm.xml	(revision 319)
+++ /ether_2012/out/production/Persistence/com/ether/dao/Plateform.hbm.xml	(revision 319)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-cascade="save-update" auto-import="false">
+
+	<class name="com.ether.Plateform" table="plateforme">
+
+		<id name="id">
+			<column name="plateforme_id" />
+			<generator class="increment" />
+
+			<!-- <generator class="sequence"> -->
+			<!-- <param name="sequence">S_TABLE_TEST</param> -->
+			<!-- </generator> -->
+		</id>
+
+		<property name="name">
+			<column name="plateforme_nom"/>
+		</property>
+
+	</class>
+
+</hibernate-mapping>
+
Index: /ether_2012/out/production/Persistence/dao-context.xml
===================================================================
--- /ether_2012/out/production/Persistence/dao-context.xml	(revision 319)
+++ /ether_2012/out/production/Persistence/dao-context.xml	(revision 319)
@@ -0,0 +1,18 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<!-- Application context DAO layer -->
+<beans>
+	<bean id="refPlateformDAO" class="com.ether.dao.PlateformDAOImpl">
+		<property name="sessionFactory">
+			<ref bean="sessionFactory" />
+		</property>
+	</bean>
+
+    <bean id="refParameterDAO" class="com.ether.dao.ParameterDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory" />
+        </property>
+    </bean>
+
+</beans>
Index: /ether_2012/out/production/Persistence/hibernate-domain.cfg.xml
===================================================================
--- /ether_2012/out/production/Persistence/hibernate-domain.cfg.xml	(revision 319)
+++ /ether_2012/out/production/Persistence/hibernate-domain.cfg.xml	(revision 319)
@@ -0,0 +1,11 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-configuration PUBLIC
+        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+    <session-factory>
+        <mapping resource="com/ether/dao/Plateform.hbm.xml"/>
+        <mapping resource="com/ether/dao/Parameter.hbm.xml"/>
+    </session-factory>
+</hibernate-configuration>
Index: /ether_2012/out/production/Persistence/hibernate.cfg.xml
===================================================================
--- /ether_2012/out/production/Persistence/hibernate.cfg.xml	(revision 319)
+++ /ether_2012/out/production/Persistence/hibernate.cfg.xml	(revision 319)
@@ -0,0 +1,52 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+	<!-- sessionFactory -->
+	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
+		<property name="configLocation">
+			<value>classpath:hibernate-domain.cfg.xml</value>
+		</property>
+
+		<property name="configurationClass">
+			<value>org.hibernate.cfg.AnnotationConfiguration</value>
+		</property>
+
+		<property name="hibernateProperties">
+			<props>
+				<prop key="hibernate.bytecode.use_reflection_optimizer">false</prop>
+				<prop key="hibernate.connection.driver_class">org.postgresql.Driver</prop>
+				<prop key="hibernate.connection.url">jdbc:postgresql://darkstar.ipslnet:5432/PROJECT_SOURCE</prop>
+				<prop key="hibernate.connection.username">postgres</prop>
+				<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
+				<prop key="hibernate.show_sql">true</prop>
+				<prop key="hibernate.generate_statistics">true</prop>
+			</props>
+		</property>
+	</bean>
+
+	<bean id="transactionManager"
+		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
+		<property name="sessionFactory" ref="sessionFactory" />
+	</bean>
+
+	<bean id="transactionProxy" abstract="true"
+		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
+		<property name="transactionManager">
+			<ref bean="transactionManager" />
+		</property>
+		<property name="transactionAttributes">
+			<props>
+				<prop key="insert*">PROPAGATION_REQUIRED</prop>
+				<prop key="update*">PROPAGATION_REQUIRED</prop>
+				<prop key="save*">PROPAGATION_REQUIRED</prop>
+				<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
+			</props>
+		</property>
+	</bean>
+
+	<!-- <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> -->
+	<!-- <property name="sessionFactory" ref="sessionFactory" /> -->
+	<!-- </bean> -->
+
+</beans>
Index: /ether_2012/out/production/Persistence/hibernate_test.cfg.xml
===================================================================
--- /ether_2012/out/production/Persistence/hibernate_test.cfg.xml	(revision 319)
+++ /ether_2012/out/production/Persistence/hibernate_test.cfg.xml	(revision 319)
@@ -0,0 +1,49 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+	<!-- sessionFactory -->
+	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
+		<property name="configLocation">
+			<value>classpath:hibernate-domain.cfg.xml</value>
+		</property>
+
+		<property name="configurationClass">
+			<value>org.hibernate.cfg.AnnotationConfiguration</value>
+		</property>
+
+		<property name="hibernateProperties">
+			<props>
+				<prop key="hibernate.bytecode.use_reflection_optimizer">false</prop>
+				<prop key="hibernate.connection.driver_class">org.postgresql.Driver</prop>
+				<prop key="hibernate.connection.url">jdbc:postgresql://darkstar.ipslnet:5432/PROJECT_SOURCE_TEST</prop>
+				<prop key="hibernate.connection.username">postgres</prop>
+				<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
+				<prop key="hibernate.show_sql">true</prop>
+
+				<prop key="hibernate.generate_statistics">true</prop>
+			</props>
+		</property>
+	</bean>
+
+	<bean id="transactionManager"
+		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
+		<property name="sessionFactory" ref="sessionFactory" />
+	</bean>
+
+	<bean id="transactionProxy" abstract="true"
+		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
+		<property name="transactionManager">
+			<ref bean="transactionManager" />
+		</property>
+		<property name="transactionAttributes">
+			<props>
+				<prop key="insert*">PROPAGATION_REQUIRED</prop>
+				<prop key="update*">PROPAGATION_REQUIRED</prop>
+				<prop key="save*">PROPAGATION_REQUIRED</prop>
+				<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
+			</props>
+		</property>
+	</bean>
+
+</beans>
Index: /ether_2012/out/production/Service/service-context.xml
===================================================================
--- /ether_2012/out/production/Service/service-context.xml	(revision 319)
+++ /ether_2012/out/production/Service/service-context.xml	(revision 319)
@@ -0,0 +1,19 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+	<bean id="etherServiceTarget" class="com.ether.EtherServiceImpl">
+		<property name="plateformDAO" ref="refPlateformDAO" />
+		<property name="parameterDAO" ref="refParameterDAO" />
+	</bean>
+
+	<bean id="etherService" parent="transactionProxy">
+		<property name="target">
+			<ref bean="etherServiceTarget" />
+		</property>
+		<property name="transactionAttributeSource">
+			<bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" />
+		</property>
+	</bean>
+
+</beans>
Index: /ether_2012/out/production/Web/json/json-context.xml
===================================================================
--- /ether_2012/out/production/Web/json/json-context.xml	(revision 319)
+++ /ether_2012/out/production/Web/json/json-context.xml	(revision 319)
@@ -0,0 +1,17 @@
+<?com.medias.xml version="1.0" encoding="UTF-8" ?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
+
+    <bean id="jsonHelper" class="com.ether.JSONHelperImpl">
+        <property name="mapping">
+            <map>
+                <entry key="com.ether.Plateform" value-ref="plateformJsonSerializer"/>
+                <entry key="com.ether.Parameter" value-ref="parameterJsonSerializer"/>
+            </map>
+        </property>
+    </bean>
+
+    <bean id="parameterJsonSerializer" class="json.serializers.ParameterJsonSerializer"/>
+    <bean id="plateformJsonSerializer" class="json.serializers.PlateformJsonSerializer"/>
+</beans>
Index: /ether_2012/out/production/Web/messages_en.properties
===================================================================
--- /ether_2012/out/production/Web/messages_en.properties	(revision 319)
+++ /ether_2012/out/production/Web/messages_en.properties	(revision 319)
@@ -0,0 +1,35 @@
+inWork=Work in progress..
+language=English
+label.language.fr=French
+label.language.en=English
+label.language=Language
+label.index=Back to index
+
+titre.visu=Simple visualization page
+titre.visu.pf=Visualization page for all plateforms and parameters
+titre.init=Init
+
+text.visu.pf=Load of the method "viewAllPlateforms" from the controller wich returns results to page "visu_plateform.jsp"
+text.visu.pf.href=Plateforms viex
+
+text.visu=Load of the method "view" from the controller which returns results to page visu.jsp
+text.visu.href=Simple view
+
+text.results=Results from controller :
+text.change.language=Switch language (use of labels from messages_en.properties)
+
+data.visualization=Data visualization
+data.visualization.pf=View plateforms
+data.visualization.noPf=No plateform
+data.visualization.selectPf=Plateforms
+data.visualization.noParameter=No parameter
+data.visualization.selectParameter=Parameters
+data.visualization.selectTime=Periode
+data.visualization.selectDate=Select a date
+data.visualization.BeginDate=Begin date
+data.visualization.EndDate=End date
+data.visualization.Unvalid_Period=Unvalid period !
+data.visualization.button.visualize=Visualization
+data.visualization.button.download=Download
+data.visualization.loading.data=Data loading
+
Index: /ether_2012/out/production/Web/messages_fr.properties
===================================================================
--- /ether_2012/out/production/Web/messages_fr.properties	(revision 319)
+++ /ether_2012/out/production/Web/messages_fr.properties	(revision 319)
@@ -0,0 +1,35 @@
+inWork=Page en cours de construction..
+language=FRANCAIS
+label.language.fr=FranÃ§ais
+label.language.en=Anglais
+label.language=Langue
+label.index=Retour Ã  l'index
+
+titre.visu=Page de visualisation simple
+titre.visu.pf=Page de visualisation de toutes les plateformes/paramÃštres
+titre.init=Init
+
+text.visu.pf=Appel de la mÃ©thode viewAllPlateforms du controller qui renvoit vers la page visu_plateform.jsp
+text.visu.pf.href=vue plateforms
+
+text.visu=Appel de la mÃ©thode "view" du controller qui renvoit vers la page visu.jsp
+text.visu.href=vue simple
+
+text.results=RÃ©sultats retournÃ©s par le controller :
+text.change.language=Changement de langue (utilisation des labels de messages_en.properties)
+
+
+data.visualization=Visualisation des donnÃ©es
+data.visualization.pf=Voir les plateformes
+data.visualization.noPf=Pas de plateforme
+data.visualization.selectPf=Plateformes
+data.visualization.noParameter=Pas de param\u00E8tre
+data.visualization.selectParameter=Param\u00E8tres
+data.visualization.selectTime=P\u00E9riode
+data.visualization.selectDate=Choisissez une date
+data.visualization.BeginDate=Date de d\u00E9but :
+data.visualization.EndDate=Date de fin :
+data.visualization.Unvalid_Period=P\u00E9riode non valide !
+data.visualization.button.visualize=Visualisation
+data.visualization.button.download=T\u00E9l\u00E9chargement
+data.visualization.loading.data=Chargement des donn\u00E9es
Index: /ether_2012/persistence/Persistence.iml
===================================================================
--- /ether_2012/persistence/Persistence.iml	(revision 319)
+++ /ether_2012/persistence/Persistence.iml	(revision 319)
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="hibernate" name="Hibernate">
+      <configuration>
+        <datasource-map>
+          <unit-entry name="dao-context.cfg.xml" />
+          <unit-entry name="hibernate-domain.cfg.xml" />
+          <unit-entry name="hibernate-medias.cfg.xml" />
+          <unit-entry name="hibernate.cfg.xml" />
+        </datasource-map>
+        <deploymentDescriptor name="hibernate.cfg.xml" url="file://$MODULE_DIR$/implementation/hibernate.cfg.xml" />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/interface" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/implementation" isTestSource="false" />
+    </content>
+    <orderEntry type="jdk" jdkName="1.6" jdkType="JavaSDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="Common" />
+    <orderEntry type="module" module-name="Domain" />
+    <orderEntry type="library" name="lib_common" level="project" />
+    <orderEntry type="library" name="lib_hibernate" level="project" />
+    <orderEntry type="library" name="lib_spring" level="project" />
+  </component>
+</module>
+
Index: /ether_2012/persistence/implementation/com/ether/EnumUserType.java
===================================================================
--- /ether_2012/persistence/implementation/com/ether/EnumUserType.java	(revision 319)
+++ /ether_2012/persistence/implementation/com/ether/EnumUserType.java	(revision 319)
@@ -0,0 +1,58 @@
+package com.ether;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.HibernateException;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+
+/**
+ * The enum user type.
+ */
+public abstract class EnumUserType<E extends Enum<E>> extends SimpleUserType
+{
+    protected EnumUserType(final Class<E> clazz) {
+	_clazz = clazz;
+    }
+
+    public int[] sqlTypes() {
+	return SQL_TYPES;
+    }
+
+    public Class returnedClass() {
+	return _clazz;
+    }
+
+    public Object nullSafeGet(final ResultSet resultSet, final String[] names,
+	    final Object owner) throws HibernateException, SQLException {
+	final String name = resultSet.getString(names[0]);
+	E result = null;
+	if (!resultSet.wasNull()) {
+	    result = Enum.valueOf(_clazz, name);
+	}
+	return result;
+    }
+
+    public void nullSafeSet(final PreparedStatement preparedStatement,
+	    final Object value, final int index) throws HibernateException,
+	    SQLException {
+	if (null == value) {
+	    HIBERNATE_TYPE_LOGGER.trace("binding null to parameter: " + index);
+	    preparedStatement.setNull(index, Types.NVARCHAR);
+	} else {
+	    final String stringValue = ((Enum) value).name();
+	    HIBERNATE_TYPE_LOGGER.trace("binding '" + stringValue
+		    + "' to parameter: " + index);
+	    preparedStatement.setString(index, stringValue);
+	}
+    }
+
+    private static final Log HIBERNATE_TYPE_LOGGER = LogFactory.getLog(org.hibernate.type.Type.class);
+
+    private static final int[] SQL_TYPES = { Types.NVARCHAR };
+
+    private Class<E> _clazz = null;
+}
Index: /ether_2012/persistence/implementation/com/ether/SimpleUserType.java
===================================================================
--- /ether_2012/persistence/implementation/com/ether/SimpleUserType.java	(revision 319)
+++ /ether_2012/persistence/implementation/com/ether/SimpleUserType.java	(revision 319)
@@ -0,0 +1,41 @@
+package com.ether;
+
+import org.hibernate.usertype.UserType;
+import org.hibernate.HibernateException;
+
+import java.io.Serializable;
+
+public abstract class SimpleUserType implements UserType
+{
+    public Object deepCopy(final Object value) throws HibernateException {
+	return value;
+    }
+
+    public boolean isMutable() {
+	return false;
+    }
+
+    public Object assemble(final Serializable cached, final Object owner)
+	    throws HibernateException {
+	return cached;
+    }
+
+    public Serializable disassemble(final Object value)
+	    throws HibernateException {
+	return (Serializable) value;
+    }
+
+    public Object replace(final Object original, final Object target,
+	    final Object owner) throws HibernateException {
+	return original;
+    }
+
+    public int hashCode(final Object object) throws HibernateException {
+	return object.hashCode();
+    }
+
+    public boolean equals(final Object x, final Object y)
+	    throws HibernateException {
+	return x == y || !(null == x || null == y) && x.equals(y);
+    }
+}
Index: /ether_2012/persistence/implementation/com/ether/dao/DomainAccessObjectImpl.java
===================================================================
--- /ether_2012/persistence/implementation/com/ether/dao/DomainAccessObjectImpl.java	(revision 319)
+++ /ether_2012/persistence/implementation/com/ether/dao/DomainAccessObjectImpl.java	(revision 319)
@@ -0,0 +1,331 @@
+package com.ether.dao;
+
+import static com.ether.PersistenceHelper.convert;
+import static com.ether.PersistenceHelper.uniqueResult;
+
+import java.io.Serializable;
+import java.lang.reflect.ParameterizedType;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Example;
+import org.hibernate.criterion.Projections;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.dao.DataAccessException;
+
+import com.ether.PersistenceException;
+
+public class DomainAccessObjectImpl<DO, PK extends Serializable>
+	implements DomainAccessObject<DO, PK>
+{
+    public DomainAccessObjectImpl(final Class<DO> domainObjectClass) {
+	_domainObjectClass = domainObjectClass;
+    }
+
+    // ************************************************************************** //
+    // ******************************* REQUESTS ********************************* //
+    // ************************************************************************** //
+
+    // ******************************* SELECT BY CRITERIA **//    
+    @Nullable
+    public final DO selectByCriteria(final DetachedCriteria criteria)
+	    throws PersistenceException
+    {
+	return selectByCriteria(getDomainObjectClass(), criteria);
+    }
+
+    @Nullable
+    public final <O> O selectByCriteria(final Class<O> objectClass, final DetachedCriteria criteria) throws PersistenceException
+    {
+	return (O) criteria.getExecutableCriteria(_sessionFactory.getCurrentSession()).uniqueResult();	
+    }
+
+    @NotNull
+    public final <O> List<O> selectAllByCriteria(final Class<O> objectClass, final DetachedCriteria criteria) throws PersistenceException
+    {
+	final List<O> result =  (List<O>) criteria.getExecutableCriteria(_sessionFactory.getCurrentSession()).list();
+	return null != result ? result : new ArrayList<O>();
+    }
+
+    @NotNull
+    public final List<DO> selectAllByCriteria(final DetachedCriteria criteria)
+	    throws PersistenceException
+    {
+	return selectAllByCriteria(getDomainObjectClass(), criteria);
+    }
+
+    
+    // ******************************* INSERT **//    
+    @NotNull
+    public final PK insert(final DO domainObject) throws PersistenceException
+    {
+	try
+	{
+	    final Session session = _sessionFactory.getCurrentSession();
+	    final PK primaryKey = (PK) session.save(domainObject);
+	    session.flush();
+	    return primaryKey;
+	}
+	catch (DataAccessException e)
+	{
+	    throw convert(e);
+	}
+    }
+
+    public final void insertAll(@NotNull final Collection<DO> domainObjects)
+	    throws PersistenceException
+    {
+	try
+	{
+	    final Session session = _sessionFactory.getCurrentSession();
+	    int i = 0;
+	    for (final DO domainObject : domainObjects)
+	    {
+		session.save(domainObject);
+		// Avoid OutOfMemoryError
+		if (i >= 500)
+		{
+		    session.flush();
+		    session.clear();
+		    i = 0;
+		}
+	    }
+	    session.flush();
+	}
+	catch (DataAccessException e)
+	{
+	    throw convert(e);
+	}
+    }
+
+    // ******************************* UPDATE **//    
+    public void update(@NotNull final DO domainObject)
+	    throws PersistenceException
+    {
+	try
+	{
+	    final Session session = _sessionFactory.getCurrentSession();
+	    session.update(domainObject);
+	    session.flush();
+	}
+	catch (DataAccessException e)
+	{
+	    throw convert(e);
+	}
+    }
+
+    public final void updateAll(final Collection<? extends DO> domainObjects)
+	    throws PersistenceException
+    {
+	try
+	{
+	    final Session session = _sessionFactory.getCurrentSession();
+	    for (final DO domainObject : domainObjects)
+		session.saveOrUpdate(domainObject);
+	    session.flush();
+	}
+	catch (DataAccessException e)
+	{
+	    throw convert(e);
+	}
+    }
+
+    // ******************************* UPGRADE **//    
+    public final void upgrade(final DO domainObject)
+	    throws PersistenceException
+    {
+	try
+	{
+	    final Session session = _sessionFactory.getCurrentSession();
+	    session.refresh(domainObject);
+	    session.flush();
+	}
+	catch (DataAccessException e)
+	{
+	    throw convert(e);
+	}
+    }
+
+    public final void upgradeAll(final Collection<DO> domainObjects)
+	    throws PersistenceException
+    {
+	try
+	{
+	    final Session session = _sessionFactory.getCurrentSession();
+	    for (final DO domainObject : domainObjects)
+	    {
+		session.refresh(domainObject);
+	    }
+	    session.flush();
+	}
+	catch (DataAccessException e)
+	{
+	    throw convert(e);
+	}
+    }
+
+    // ******************************* DELETE **//    
+    public void deleteByPrimaryKey(final PK primaryKey)
+	    throws PersistenceException
+    {
+	try
+	{
+	    final Session session = _sessionFactory.getCurrentSession();
+	    final Object domainObject = session.get(getDomainObjectClass(), primaryKey);
+	    if(null != domainObject)
+		session.delete(domainObject);
+	    else
+		throw new PersistenceException(PersistenceException.PersistenceCode.OBJECT_TO_DELETE_NOT_FOUND);
+	    session.flush();
+	}
+	catch (DataAccessException e)
+	{
+	    throw convert(e);
+	}
+    }
+
+    public final void delete(@NotNull final DO domainObject)
+	    throws PersistenceException
+    {
+	try
+	{
+	    final Session session = _sessionFactory.getCurrentSession();
+	    session.delete(domainObject);
+	    session.flush();
+	}
+	catch (DataAccessException e)
+	{
+	    throw convert(e);
+	}
+    }
+
+    public final void deleteAll(final Collection<DO> domainObjects)
+	    throws PersistenceException
+    {
+	try
+	{
+	    final Session session = _sessionFactory.getCurrentSession();
+	    for (final DO domainObject : domainObjects)
+		session.delete(domainObject);
+	    session.flush();
+	}
+	catch (DataAccessException e)
+	{
+	    throw convert(e);
+	}
+    }
+
+    // ******************************* SELECT **//    
+    public final DO selectByPrimaryKey(@NotNull final PK primaryKey)
+	    throws PersistenceException
+    {
+	try
+	{
+	    final Session session = _sessionFactory.getCurrentSession();
+	    return (DO) session.get(getDomainObjectClass(), primaryKey);
+	}
+	catch (DataAccessException e)
+	{
+	    throw convert(e);
+	}
+    }
+
+    public final DO selectByExample(final DO domainObject)
+	    throws PersistenceException
+    {
+	final Session session = _sessionFactory.getCurrentSession();
+	final Criteria executableCriteria = session.createCriteria(domainObject.getClass());
+	executableCriteria.add(Example.create(domainObject));
+	return uniqueResult((Collection<DO>) executableCriteria.list());
+    }
+
+    public final List<DO> selectAllByExample(final DO domainObject)
+	    throws PersistenceException
+    {
+	final Session session = _sessionFactory.getCurrentSession();
+	final Criteria executableCriteria = session.createCriteria(domainObject.getClass());
+	executableCriteria.add(Example.create(domainObject));
+	return (List<DO>) executableCriteria.list();
+    }
+
+    public final List<DO> selectAll() throws PersistenceException
+    {
+	try
+	{
+	    final Session session = _sessionFactory.getCurrentSession();
+	    final Criteria executableCriteria = session.createCriteria(getDomainObjectClass());	    
+	    return (List<DO>) executableCriteria.list();
+	}
+	catch (DataAccessException e)
+	{
+	    throw convert(e);
+	}
+    }
+
+    // ******************************* PAGINATE **//
+    protected <T> List<T> selectPage(@Nullable final Integer firstResult, @Nullable final Integer maxResults, final DetachedCriteria detachedCriteria)
+	    throws PersistenceException
+    {
+	final Session session = _sessionFactory.getCurrentSession();
+	final Criteria criteria = detachedCriteria.getExecutableCriteria(session);
+
+	if (null != maxResults)
+	{
+	    criteria.setMaxResults(maxResults);
+	    if (null != firstResult)
+		criteria.setFirstResult(firstResult);
+	}
+	return (List<T>) criteria.list();
+    }
+
+    protected Integer count(final DetachedCriteria detachedCriteria)
+	    throws PersistenceException
+    {
+	final Session session = _sessionFactory.getCurrentSession();
+	final Criteria executableCriteria = detachedCriteria.getExecutableCriteria(session);
+	executableCriteria.setProjection(Projections.rowCount());
+	return (Integer) executableCriteria.uniqueResult();
+    }
+    // ************************************************************************** //
+    // ************************************************************************** //
+    
+    @SuppressWarnings("unchecked")
+    public final Class<DO> getDomainObjectClass()
+    {
+	if (_domainObjectClass == null)
+	{
+	    if (getClass().getGenericSuperclass() instanceof ParameterizedType)
+		_domainObjectClass = (Class<DO>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
+	    else
+		throw new IllegalArgumentException("domain class is not null and DAO is not parameterized !");
+	}
+
+	return _domainObjectClass;
+    }
+
+    public final void setDomainObjectClass(final Class<DO> domainObjectClass)
+    {
+	_domainObjectClass = domainObjectClass;
+    }
+
+    public final void setSessionFactory(final SessionFactory sessionFactory)
+    {
+	_sessionFactory = sessionFactory;
+    }
+
+    public final SessionFactory getSessionFactory()
+    {
+    	return _sessionFactory;
+    }
+
+    protected static final Integer MAX_RESULTS_FOR_PAGINATION = 100;
+
+    private SessionFactory _sessionFactory;
+    private Class<DO> _domainObjectClass;
+}
Index: /ether_2012/persistence/implementation/com/ether/dao/Parameter.hbm.xml
===================================================================
--- /ether_2012/persistence/implementation/com/ether/dao/Parameter.hbm.xml	(revision 319)
+++ /ether_2012/persistence/implementation/com/ether/dao/Parameter.hbm.xml	(revision 319)
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.ether.Parameter" table="parametre" schema="public">
+        <comment>Table enumerant les differents parametres de mesure</comment>
+        <id name="id" type="int">
+            <column name="parametre_id" />
+            <!--<generator class="sequence">-->
+            <!--<param name="sequence">parametre_parametre_id_seq</param>-->
+            <!--</generator>-->
+        </id>
+
+        <property name="name" type="string">
+            <column name="parametre_nom" length="100" not-null="true">
+                <comment>nom du parametre</comment>
+            </column>
+        </property>
+
+        <set name="plateformes" inverse="true" table="requete_plat_param">
+            <key>
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.ether.Plateform">
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </many-to-many>
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_2012/persistence/implementation/com/ether/dao/ParameterDAOImpl.java
===================================================================
--- /ether_2012/persistence/implementation/com/ether/dao/ParameterDAOImpl.java	(revision 319)
+++ /ether_2012/persistence/implementation/com/ether/dao/ParameterDAOImpl.java	(revision 319)
@@ -0,0 +1,38 @@
+package com.ether.dao;
+
+import com.ether.Parameter;
+import com.ether.PersistenceException;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Restrictions;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date may 2011
+ * Example for a DAO
+ */
+public class ParameterDAOImpl
+        extends DomainAccessObjectImpl<Parameter, Integer>
+        implements ParameterDAO
+{
+    protected ParameterDAOImpl()
+    {
+        super( Parameter.class );
+    }
+
+    @Nullable
+    public List<Parameter> getAllParametersByPlateformId(@NotNull final Integer plateformId )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass(Parameter.class, "parameter")
+            .createCriteria("plateformes")
+            .add(Restrictions.eq("id", plateformId))
+            .addOrder( Order.asc( "parameter.name" ));
+
+        return selectAllByCriteria(Parameter.class, criteria);
+    }
+}
Index: /ether_2012/persistence/implementation/com/ether/dao/Parameter_old.hbm.xml
===================================================================
--- /ether_2012/persistence/implementation/com/ether/dao/Parameter_old.hbm.xml	(revision 319)
+++ /ether_2012/persistence/implementation/com/ether/dao/Parameter_old.hbm.xml	(revision 319)
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-cascade="save-update" auto-import="false">
+
+	<class name="com.ether.Parameter" table="parameter">
+
+		<id name="id">
+			<column name="parametre_id" />
+			<generator class="increment" />
+
+			<!-- <generator class="sequence"> -->
+			<!-- <param name="sequence">S_TABLE_TEST</param> -->
+			<!-- </generator> -->
+		</id>
+
+		<property name="name">
+			<column name="parametre_nom"/>
+		</property>
+
+        <set name="plateformes" inverse="true" table="requete_plat_param">
+            <key>
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.ether.Plateform">
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </many-to-many>
+        </set>
+
+	</class>
+
+
+
+</hibernate-mapping>
+
Index: /ether_2012/persistence/implementation/com/ether/dao/Plateform.hbm.xml
===================================================================
--- /ether_2012/persistence/implementation/com/ether/dao/Plateform.hbm.xml	(revision 319)
+++ /ether_2012/persistence/implementation/com/ether/dao/Plateform.hbm.xml	(revision 319)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-cascade="save-update" auto-import="false">
+
+	<class name="com.ether.Plateform" table="plateforme">
+
+		<id name="id">
+			<column name="plateforme_id" />
+			<generator class="increment" />
+
+			<!-- <generator class="sequence"> -->
+			<!-- <param name="sequence">S_TABLE_TEST</param> -->
+			<!-- </generator> -->
+		</id>
+
+		<property name="name">
+			<column name="plateforme_nom"/>
+		</property>
+
+	</class>
+
+</hibernate-mapping>
+
Index: /ether_2012/persistence/implementation/com/ether/dao/PlateformDAOImpl.java
===================================================================
--- /ether_2012/persistence/implementation/com/ether/dao/PlateformDAOImpl.java	(revision 319)
+++ /ether_2012/persistence/implementation/com/ether/dao/PlateformDAOImpl.java	(revision 319)
@@ -0,0 +1,44 @@
+package com.ether.dao;
+
+import com.ether.Parameter;
+import com.ether.Plateform;
+import com.ether.PersistenceException;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Restrictions;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date may 2011
+ * Example for a DAO
+ */
+public class PlateformDAOImpl
+        extends DomainAccessObjectImpl<Plateform, Integer>
+        implements PlateformDAO
+{
+    protected PlateformDAOImpl()
+    {
+        super( Plateform.class );
+    }
+
+    @Nullable
+    public Plateform getPlateformById( @NotNull final Integer plateformId )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Plateform.class )
+                .add( Restrictions.idEq( plateformId ) );
+
+        return selectByCriteria( Plateform.class, criteria );
+    }
+
+    @NotNull
+    public List<Plateform> getAllPlateforms()
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Plateform.class );
+        return selectAllByCriteria( Plateform.class, criteria );
+    }
+}
Index: /ether_2012/persistence/implementation/dao-context.xml
===================================================================
--- /ether_2012/persistence/implementation/dao-context.xml	(revision 319)
+++ /ether_2012/persistence/implementation/dao-context.xml	(revision 319)
@@ -0,0 +1,18 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<!-- Application context DAO layer -->
+<beans>
+	<bean id="refPlateformDAO" class="com.ether.dao.PlateformDAOImpl">
+		<property name="sessionFactory">
+			<ref bean="sessionFactory" />
+		</property>
+	</bean>
+
+    <bean id="refParameterDAO" class="com.ether.dao.ParameterDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory" />
+        </property>
+    </bean>
+
+</beans>
Index: /ether_2012/persistence/implementation/hibernate-domain.cfg.xml
===================================================================
--- /ether_2012/persistence/implementation/hibernate-domain.cfg.xml	(revision 319)
+++ /ether_2012/persistence/implementation/hibernate-domain.cfg.xml	(revision 319)
@@ -0,0 +1,11 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-configuration PUBLIC
+        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+    <session-factory>
+        <mapping resource="com/ether/dao/Plateform.hbm.xml"/>
+        <mapping resource="com/ether/dao/Parameter.hbm.xml"/>
+    </session-factory>
+</hibernate-configuration>
Index: /ether_2012/persistence/implementation/hibernate.cfg.xml
===================================================================
--- /ether_2012/persistence/implementation/hibernate.cfg.xml	(revision 319)
+++ /ether_2012/persistence/implementation/hibernate.cfg.xml	(revision 319)
@@ -0,0 +1,52 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+	<!-- sessionFactory -->
+	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
+		<property name="configLocation">
+			<value>classpath:hibernate-domain.cfg.xml</value>
+		</property>
+
+		<property name="configurationClass">
+			<value>org.hibernate.cfg.AnnotationConfiguration</value>
+		</property>
+
+		<property name="hibernateProperties">
+			<props>
+				<prop key="hibernate.bytecode.use_reflection_optimizer">false</prop>
+				<prop key="hibernate.connection.driver_class">org.postgresql.Driver</prop>
+				<prop key="hibernate.connection.url">jdbc:postgresql://darkstar.ipslnet:5432/PROJECT_SOURCE</prop>
+				<prop key="hibernate.connection.username">postgres</prop>
+				<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
+				<prop key="hibernate.show_sql">true</prop>
+				<prop key="hibernate.generate_statistics">true</prop>
+			</props>
+		</property>
+	</bean>
+
+	<bean id="transactionManager"
+		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
+		<property name="sessionFactory" ref="sessionFactory" />
+	</bean>
+
+	<bean id="transactionProxy" abstract="true"
+		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
+		<property name="transactionManager">
+			<ref bean="transactionManager" />
+		</property>
+		<property name="transactionAttributes">
+			<props>
+				<prop key="insert*">PROPAGATION_REQUIRED</prop>
+				<prop key="update*">PROPAGATION_REQUIRED</prop>
+				<prop key="save*">PROPAGATION_REQUIRED</prop>
+				<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
+			</props>
+		</property>
+	</bean>
+
+	<!-- <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> -->
+	<!-- <property name="sessionFactory" ref="sessionFactory" /> -->
+	<!-- </bean> -->
+
+</beans>
Index: /ether_2012/persistence/implementation/hibernate_test.cfg.xml
===================================================================
--- /ether_2012/persistence/implementation/hibernate_test.cfg.xml	(revision 319)
+++ /ether_2012/persistence/implementation/hibernate_test.cfg.xml	(revision 319)
@@ -0,0 +1,49 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+	<!-- sessionFactory -->
+	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
+		<property name="configLocation">
+			<value>classpath:hibernate-domain.cfg.xml</value>
+		</property>
+
+		<property name="configurationClass">
+			<value>org.hibernate.cfg.AnnotationConfiguration</value>
+		</property>
+
+		<property name="hibernateProperties">
+			<props>
+				<prop key="hibernate.bytecode.use_reflection_optimizer">false</prop>
+				<prop key="hibernate.connection.driver_class">org.postgresql.Driver</prop>
+				<prop key="hibernate.connection.url">jdbc:postgresql://darkstar.ipslnet:5432/PROJECT_SOURCE_TEST</prop>
+				<prop key="hibernate.connection.username">postgres</prop>
+				<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
+				<prop key="hibernate.show_sql">true</prop>
+
+				<prop key="hibernate.generate_statistics">true</prop>
+			</props>
+		</property>
+	</bean>
+
+	<bean id="transactionManager"
+		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
+		<property name="sessionFactory" ref="sessionFactory" />
+	</bean>
+
+	<bean id="transactionProxy" abstract="true"
+		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
+		<property name="transactionManager">
+			<ref bean="transactionManager" />
+		</property>
+		<property name="transactionAttributes">
+			<props>
+				<prop key="insert*">PROPAGATION_REQUIRED</prop>
+				<prop key="update*">PROPAGATION_REQUIRED</prop>
+				<prop key="save*">PROPAGATION_REQUIRED</prop>
+				<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
+			</props>
+		</property>
+	</bean>
+
+</beans>
Index: /ether_2012/persistence/interface/com/ether/PersistenceException.java
===================================================================
--- /ether_2012/persistence/interface/com/ether/PersistenceException.java	(revision 319)
+++ /ether_2012/persistence/interface/com/ether/PersistenceException.java	(revision 319)
@@ -0,0 +1,50 @@
+package com.ether;
+
+/**
+ * @author vmipsl
+ * @date 28 jan 2011
+ */
+@SuppressWarnings("serial")
+public class PersistenceException
+        extends FormattedException
+{
+    public PersistenceException( final PersistenceCode code, final Throwable throwable, final Object... parameters )
+    {
+        this( code, DEFAULT_MESSAGE, throwable, parameters );
+    }
+
+    public PersistenceException( final PersistenceCode code, final Object... parameters )
+    {
+        this( code, DEFAULT_MESSAGE, DEFAULT_THROWABLE, parameters );
+    }
+    
+    protected PersistenceException( final PersistenceCode code, final String message, final Throwable throwable, final Object... parameters )
+    {
+        super( code, message, throwable, parameters );
+    }
+
+    protected PersistenceException( final PersistenceCode code, final String message, final Object... parameters )
+    {
+        super( code, message, DEFAULT_THROWABLE, parameters );
+    }
+    
+    public PersistenceException(final PersistenceException exception) {
+    	super(exception);
+	}
+
+	public static enum PersistenceCode implements Code
+    {
+        UNKNOWN_FAILURE,
+        CLEANUP_FAILURE,
+        CONCURRENCY_FAILURE,
+        RESOURCE_FAILURE,
+        INTEGRITY_VIOLATION,
+        RETRIEVAL_FAILURE,
+        DATA_SOURCE_LOOKUP_FAILURE,
+        INVALID_API_USAGE,
+        INVALID_RESOURCE_USAGE,
+        PERMISSION_DENIED,
+        INVALID_ARGUMENT,
+        OBJECT_TO_DELETE_NOT_FOUND,
+    }
+}
Index: /ether_2012/persistence/interface/com/ether/PersistenceHelper.java
===================================================================
--- /ether_2012/persistence/interface/com/ether/PersistenceHelper.java	(revision 319)
+++ /ether_2012/persistence/interface/com/ether/PersistenceHelper.java	(revision 319)
@@ -0,0 +1,108 @@
+package com.ether;
+
+import java.util.Collection;
+import com.ether.PersistenceException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.dao.CleanupFailureDataAccessException;
+import org.springframework.dao.DataAccessException;
+
+public final class PersistenceHelper
+{
+    /**
+     * Returns an unique result from a collection of results.
+     * 
+     * @throws PersistenceException : if more than one result is contained in the collection an exception is thrown.
+     */
+    public static <O> O uniqueResult(final Collection<O> results)
+	    throws PersistenceException
+    {
+	if (results == null || results.isEmpty())
+	    return null;
+	else if (results.size() > 1)
+	    throw new PersistenceException(PersistenceException.PersistenceCode.INVALID_API_USAGE, "unique result expected !");
+	else
+	    return results.iterator().next();
+    }
+
+    public static <O> O firstResult(final Collection<O> results)
+    {
+	if (results == null || results.isEmpty()) return null;
+	return results.iterator().next();
+    }
+  
+    /**
+     * Converts an exception to a DAO exception.
+     * 
+     * @param exception : the exception.
+     * @return the DAO exception.
+     */
+    public static PersistenceException convert(final Exception exception)
+    {
+	// Propagates the exception if exception is persistence exception
+	if (exception instanceof PersistenceException)
+	    return (PersistenceException) exception;
+
+	// Rewraps exception if data access exception
+	final PersistenceException.PersistenceCode code;
+
+	if (exception instanceof DataAccessException)
+	{
+	    if (exception instanceof CleanupFailureDataAccessException)
+	    {
+		code = PersistenceException.PersistenceCode.CLEANUP_FAILURE;
+	    }
+	    else if (exception instanceof org.springframework.dao.ConcurrencyFailureException)
+	    {
+		code = PersistenceException.PersistenceCode.CONCURRENCY_FAILURE;
+	    }
+	    else if (exception instanceof org.springframework.dao.DataAccessResourceFailureException)
+	    {
+		code = PersistenceException.PersistenceCode.RESOURCE_FAILURE;
+	    }
+	    else if (exception instanceof org.springframework.dao.DataIntegrityViolationException)
+	    {
+		code = PersistenceException.PersistenceCode.INTEGRITY_VIOLATION;
+	    }
+	    else if (exception instanceof org.springframework.dao.DataRetrievalFailureException)
+	    {
+		code = PersistenceException.PersistenceCode.RETRIEVAL_FAILURE;
+	    }
+	    else if (exception instanceof org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException)
+	    {
+		code = PersistenceException.PersistenceCode.DATA_SOURCE_LOOKUP_FAILURE;
+	    }
+	    else if (exception instanceof org.springframework.dao.InvalidDataAccessApiUsageException)
+	    {
+		code = PersistenceException.PersistenceCode.INVALID_API_USAGE;
+	    }
+	    else if (exception instanceof org.springframework.dao.PermissionDeniedDataAccessException)
+	    {
+		code = PersistenceException.PersistenceCode.PERMISSION_DENIED;
+	    }
+	    else
+	    {
+		code = PersistenceException.PersistenceCode.UNKNOWN_FAILURE;
+	    }
+	}
+	else
+	{
+	    code = PersistenceException.PersistenceCode.UNKNOWN_FAILURE;
+	}
+
+	final StringBuilder message = new StringBuilder();
+	message.append(exception.getMessage());
+
+	final Throwable cause = exception.getCause();
+	if (null != cause)
+	{
+	    message.append(" : ").append(cause.getMessage());
+	}
+
+	return new PersistenceException(code, message.toString(),
+		exception);
+    }
+
+    private static final Log LOGGER = LogFactory.getLog(PersistenceHelper.class);
+}
Index: /ether_2012/persistence/interface/com/ether/dao/DomainAccessObject.java
===================================================================
--- /ether_2012/persistence/interface/com/ether/dao/DomainAccessObject.java	(revision 319)
+++ /ether_2012/persistence/interface/com/ether/dao/DomainAccessObject.java	(revision 319)
@@ -0,0 +1,185 @@
+package com.ether.dao;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.criterion.DetachedCriteria;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import com.ether.PersistenceException;
+
+/**
+ * PK corresponds to the type of the id
+ * (By example, Plateform.getId() returns a Long)
+ * @param <DO>
+ * @param <PK>
+ */
+public interface DomainAccessObject<DO, PK extends Serializable>
+{
+    /**
+     * @return the domain object class.
+     */
+    Class<DO> getDomainObjectClass();
+
+    /**
+     * Selects an object by criteria.
+     * The result of the select can be an object or any other types in case of projection or a transformed result.
+     *
+     * @param criteria the criteria.
+     * @return the first persistent object that match the criteria.
+     */
+    @Nullable
+    DO selectByCriteria( DetachedCriteria criteria )
+            throws PersistenceException;
+
+    /**
+     * Selects an object by criteria.
+     * The result of the select can be an object or any other types in case of projection or a transformed result.
+     *
+     * @param objectClass the object class.
+     * @param criteria    the criteria.
+     * @return the first persistent object that match the criteria.
+     */
+    @Nullable
+    <O> O selectByCriteria( Class<O> objectClass, DetachedCriteria criteria )
+            throws PersistenceException;
+    
+    /**
+     * Selects by criteria. The criteria must created for the object class.
+     * The result of the select can contain an object list or any other types in case of projection or a transformed result.
+     *
+     * @param criteria the criterions.
+     * @return all persistent objects that match the criteria.
+     */
+    @NotNull
+    List<DO> selectAllByCriteria( DetachedCriteria criteria )
+            throws PersistenceException;
+
+    /**
+     * Selects by criteria. The criteria must created for the object class.
+     * The result of the select can contain an object list or any other types in case of projection or a transformed result.
+     *
+     * @param objectClass the object class.
+     * @param criteria    the criterions.
+     * @return all persistent objects that match the criteria.
+     */
+    @NotNull
+    <O> List<O> selectAllByCriteria( Class<O> objectClass, DetachedCriteria criteria )
+            throws PersistenceException;
+    
+    /**
+     * Retrieves a domain object that was previously persisted to the database using
+     * the specified primary key.
+     *
+     * @param primaryKey the primary key.
+     * @return the persistent object with the specified primary key. <code>null</code> if not found
+     */
+    @Nullable
+    DO selectByPrimaryKey( @NotNull final PK primaryKey )
+            throws PersistenceException;
+
+    /**
+     * Retrieves a domain object by example.
+     *
+     * @param domainObject the example domain object.
+     * @return a domain object by example.
+     */
+    DO selectByExample( final DO domainObject )
+            throws PersistenceException;
+
+    /**
+     * Retrieves a domain object by example.
+     *
+     * @param domainObject the example domain object.
+     * @return a domain object by example.
+     */
+    List<DO> selectAllByExample( final DO domainObject )
+            throws PersistenceException;
+    
+    /**
+     * Returns all persistent objects of type.
+     *
+     * @return all persistent objects of type.
+     * @throws PersistenceException the persistence exception.
+     */
+    List<DO> selectAll()
+            throws PersistenceException;
+    
+    /**
+     * Persists a domain object into database and return the object primary key.
+     *
+     * @param domainObject a domain object.
+     * @return the primary key.
+     */
+    @NotNull
+    PK insert( final DO domainObject )
+            throws PersistenceException;
+
+    void insertAll( @NotNull final Collection<DO> domainObjects )
+            throws PersistenceException;
+
+    /**
+     * Updates persistent object with domain object changes.
+     *
+     * @param domainObject a domain object.
+     */
+    void update( final DO domainObject )
+            throws PersistenceException;
+
+    /**
+     * Updates persistent objects with domain objects changes.
+     *
+     * @param domainObjects domain objects to update.
+     */
+    void updateAll( final Collection<? extends DO> domainObjects )
+            throws PersistenceException;
+
+    /**
+     * Upgrades domain object with persistent objects changes.
+     *
+     * @param domainObject the domain object.
+     */
+    void upgrade( final DO domainObject )
+            throws PersistenceException;
+
+    /**
+     * Upgrades domain objects with persistent objects changes.
+     *
+     * @param domainObjects the domain object.
+     */
+    void upgradeAll( final Collection<DO> domainObjects )
+            throws PersistenceException;
+
+    /**
+     * Deletes the primary key.
+     *
+     * @param primaryKey the primary key.
+     */
+    void deleteByPrimaryKey( final PK primaryKey )
+            throws PersistenceException;
+
+    /**
+     * Deletes an object from persistent storage in the database.
+     *
+     * @param domainObject the domain object.
+     */
+    void delete( final DO domainObject )
+            throws PersistenceException;
+
+    /**
+     * Deletes all domain objects in the database.
+     *
+     * @param domainObjects the domain objects to delete.
+     */
+    void deleteAll( final Collection<DO> domainObjects )
+            throws PersistenceException;
+
+     /**
+     * Sets the session factory.
+     * @param sessionFactory the session factory.
+     */
+    void setSessionFactory( SessionFactory sessionFactory );
+}
Index: /ether_2012/persistence/interface/com/ether/dao/ParameterDAO.java
===================================================================
--- /ether_2012/persistence/interface/com/ether/dao/ParameterDAO.java	(revision 319)
+++ /ether_2012/persistence/interface/com/ether/dao/ParameterDAO.java	(revision 319)
@@ -0,0 +1,20 @@
+package com.ether.dao;
+
+import com.ether.Parameter;
+import com.ether.PersistenceException;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date may 2011
+ * Example for a DAO
+ */
+public interface ParameterDAO
+	extends DomainAccessObject<Parameter, Integer>
+{
+    @Nullable
+    List<Parameter> getAllParametersByPlateformId( @NotNull final Integer plateformId ) throws PersistenceException;
+}
Index: /ether_2012/persistence/interface/com/ether/dao/PlateformDAO.java
===================================================================
--- /ether_2012/persistence/interface/com/ether/dao/PlateformDAO.java	(revision 319)
+++ /ether_2012/persistence/interface/com/ether/dao/PlateformDAO.java	(revision 319)
@@ -0,0 +1,23 @@
+package com.ether.dao;
+
+import com.ether.Plateform;
+import com.ether.PersistenceException;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date may 2011
+ * Example for a DAO
+ */
+public interface PlateformDAO
+	extends DomainAccessObject<Plateform, Integer>
+{
+    @Nullable
+    Plateform getPlateformById( @NotNull final Integer plateformId ) throws PersistenceException;
+
+    @NotNull
+    List<Plateform> getAllPlateforms() throws PersistenceException;
+}
Index: /ether_2012/persistence/sql/create.sql
===================================================================
--- /ether_2012/persistence/sql/create.sql	(revision 319)
+++ /ether_2012/persistence/sql/create.sql	(revision 319)
@@ -0,0 +1,46 @@
+CREATE SEQUENCE S_TABLE_TEST
+
+/*==============================================================*/
+/* Table : TABLE_TEST                                      */
+/*==============================================================*/
+CREATE TABLE TABLE_TEST  (
+   TABLE_TEST_ID        NUMBER(9,0)                     NOT NULL,
+   CODE                 NVARCHAR2(50)                   NOT NULL,
+   VALUE                INTEGER,
+   IS_VISIBLE           NUMBER(1,0)                    DEFAULT 0 NOT NULL
+      CONSTRAINT CKC_IS_VISIBLE_TABLE_TEST CHECK (IS_VISIBLE IN (0,1)),
+   DEFAULT_TRANSLATION  NVARCHAR2(255),
+   CONSTRAINT PK_TABLE_TEST PRIMARY KEY (TABLE_TEST_ID),
+   CONSTRAINT AK_TABLE_TEST_CO_ACH_ACHI UNIQUE (CODE)
+)
+/* GO */
+
+
+COMMENT ON TABLE TABLE_TEST IS
+'Table de test'
+/* GO */
+
+
+COMMENT ON COLUMN TABLE_TEST.TABLE_TEST_ID IS
+'The identifier of the element'
+/* GO */
+
+
+COMMENT ON COLUMN TABLE_TEST.CODE IS
+'The element code'
+/* GO */
+
+
+COMMENT ON COLUMN TABLE_TEST.VALUE IS
+'The element value'
+/* GO */
+
+
+COMMENT ON COLUMN TABLE_TEST.IS_VISIBLE IS
+'Test for a boolean'
+/* GO */
+
+
+COMMENT ON COLUMN TABLE_TEST.DEFAULT_TRANSLATION IS
+'The default translation of the element'
+/* GO */
Index: /ether_2012/persistence/sql/createPostGresql.sql
===================================================================
--- /ether_2012/persistence/sql/createPostGresql.sql	(revision 319)
+++ /ether_2012/persistence/sql/createPostGresql.sql	(revision 319)
@@ -0,0 +1,33 @@
+/*=============================================================*/
+/*== http://www.postgresql.org/docs/8.1/static/datatype.html ==*/
+/*=============================================================*/
+
+CREATE SEQUENCE S_TABLE_TEST;
+
+/*=============================================================*/
+/* Table : TABLE_TEST                                          */
+/*=============================================================*/
+CREATE TABLE TABLE_TEST  (
+   TABLE_TEST_ID        NUMERIC                     NOT NULL,
+   CODE                 VARCHAR(50)                 NOT NULL,
+   VALUE                INTEGER,
+   IS_VISIBLE           BOOLEAN                     DEFAULT FALSE NOT NULL,
+   DEFAULT_TRANSLATION  VARCHAR(255),
+   CONSTRAINT PK_TABLE_TEST PRIMARY KEY (TABLE_TEST_ID),
+   CONSTRAINT AK_TABLE_TEST_CO_ACH_ACHI UNIQUE (CODE)
+);
+
+COMMENT ON TABLE TABLE_TEST IS 'Table de test';
+COMMENT ON COLUMN TABLE_TEST.TABLE_TEST_ID IS 'The identifier of the element';
+COMMENT ON COLUMN TABLE_TEST.CODE IS 'The element code';
+COMMENT ON COLUMN TABLE_TEST.VALUE IS 'The element value';
+COMMENT ON COLUMN TABLE_TEST.IS_VISIBLE IS 'Test for a boolean';
+COMMENT ON COLUMN TABLE_TEST.DEFAULT_TRANSLATION IS 'The default translation of the element';
+
+
+/*=============================================================*/
+/* INSERTS                                                     */
+/*=============================================================*/
+INSERT INTO table_test VALUES (nextval('S_TABLE_TEST'),'code_test_1','6548','FALSE','code test translation 1');
+INSERT INTO table_test VALUES (nextval('S_TABLE_TEST'),'code_test_2','789','TRUE','code test translation 2');
+INSERT INTO table_test VALUES (nextval('S_TABLE_TEST'),'code_test_3','1234','FALSE','code test translation 3');
Index: /ether_2012/persistence/test/com/ether/HibernateTestHelper.java
===================================================================
--- /ether_2012/persistence/test/com/ether/HibernateTestHelper.java	(revision 319)
+++ /ether_2012/persistence/test/com/ether/HibernateTestHelper.java	(revision 319)
@@ -0,0 +1,94 @@
+package com.ether;
+
+import java.util.ArrayList;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.springframework.orm.hibernate3.HibernateCallback;
+import org.springframework.orm.hibernate3.HibernateTemplate;
+import org.springframework.transaction.annotation.Transactional;
+
+public abstract class HibernateTestHelper<BEAN>
+        extends TestHelper<BEAN>
+{
+    /**
+     * The constructor.
+     *
+     * @param beanContextName        the bean context name.
+     * @param beanName               the bean name.
+     * @param otherContextNames      the other context names.
+     * @param sessionFactoryBeanName the session factory bean name.
+     */
+    protected HibernateTestHelper( final String beanContextName, final String beanName, final String[] otherContextNames, final String sessionFactoryBeanName )
+    {
+        super( beanContextName, beanName, otherContextNames );
+        _sessionFactoryBeanName = sessionFactoryBeanName;
+    }
+
+    /**
+     * Executes operations before running test.
+     * Implemented in ServiceTestHelper class
+     */
+    protected abstract void beforeHibernateTest()
+            throws Exception;
+
+    /**
+     * Executes operations after running test.
+     * Implemented in ServiceTestHelper class 
+     */
+    protected abstract void afterHibernateTest()
+            throws Exception;
+
+    @Override
+    protected final void beforeBeanTest()
+            throws Exception
+    {
+    	final ArrayList tab = new ArrayList<String>();
+        final SessionFactory sessionFactory;
+
+        if( _sessionFactoryBeanName != null )
+            sessionFactory = (SessionFactory) getApplicationContext().getBean( _sessionFactoryBeanName );
+        else
+            sessionFactory = (SessionFactory) getApplicationContext().getBean( DEFAULT_SESSION_FACTORY_BEAN_NAME );
+
+        _hibernateTemplate = new HibernateTemplate( sessionFactory );
+        beforeHibernateTest();
+    }
+
+    @Override
+    protected final void afterBeanTest()
+            throws Exception
+    {
+        afterHibernateTest();        
+        _hibernateTemplate = null;
+    }
+
+    /**
+     * Delete all datas.
+     *
+     * @param persistentObjectClasses the persistent object classes.
+     * @throws Exception an exception.
+     */
+    @Transactional
+    protected final void deleteAllDatas( final Class<?>[] persistentObjectClasses )
+            throws Exception
+    {
+        _hibernateTemplate.execute( new HibernateCallback()
+        {
+            public Object doInHibernate( final Session session )
+                    throws HibernateException
+            {
+                for( final Class<?> persistentObjectClass : persistentObjectClasses )
+                    session.createQuery( "delete from " + persistentObjectClass.getName() ).executeUpdate();
+
+                return null;
+            }
+        } );
+    }
+
+    private static final String DEFAULT_SESSION_FACTORY_BEAN_NAME = "sessionFactory";
+    
+    private String _sessionFactoryBeanName;
+    private HibernateTemplate _hibernateTemplate;
+}
Index: /ether_2012/service/Service.iml
===================================================================
--- /ether_2012/service/Service.iml	(revision 319)
+++ /ether_2012/service/Service.iml	(revision 319)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/implementation" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/interface" isTestSource="false" />
+    </content>
+    <orderEntry type="jdk" jdkName="1.6" jdkType="JavaSDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="Persistence" />
+    <orderEntry type="module" module-name="Common" />
+    <orderEntry type="module" module-name="Domain" />
+    <orderEntry type="module-library" scope="TEST">
+      <library>
+        <CLASSES>
+          <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.8.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="library" name="lib_common" level="project" />
+    <orderEntry type="library" name="lib_spring" level="project" />
+  </component>
+</module>
+
Index: /ether_2012/service/implementation/com/ether/EtherServiceImpl.java
===================================================================
--- /ether_2012/service/implementation/com/ether/EtherServiceImpl.java	(revision 319)
+++ /ether_2012/service/implementation/com/ether/EtherServiceImpl.java	(revision 319)
@@ -0,0 +1,85 @@
+package com.ether;
+
+import com.ether.dao.ParameterDAO;
+import com.ether.dao.PlateformDAO;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.beans.factory.annotation.Required;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 07 mar 2011
+ */
+public class EtherServiceImpl
+        implements EtherService
+{
+    @Nullable
+    @Transactional(readOnly = true)
+    public List<Plateform> getAllPlateforms()
+            throws ServiceException
+    {
+        try
+        {
+            return _plateformDAO.getAllPlateforms();
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PLATEFORM_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Plateform getPlateformById( @Nullable final Integer plateformId )
+            throws ServiceException
+    {
+        if( null == plateformId )
+            return null;
+        try
+        {
+            return _plateformDAO.getPlateformById( plateformId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PLATEFORM_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public List<Parameter> getAllParametersByPlateformId( @NotNull final Integer plateformId )
+            throws ServiceException
+    {
+        try
+        {
+            return _parameterDAO.getAllParametersByPlateformId( plateformId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PARAMETER_NOT_FOUND, e );
+        }
+    }
+
+    @Required
+    public void setPlateformDAO( final PlateformDAO plateformDAO )
+    {
+        _plateformDAO = plateformDAO;
+    }
+
+    @Required
+    public void setParameterDAO( final ParameterDAO parameterDAO )
+    {
+        _parameterDAO = parameterDAO;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( EtherServiceImpl.class );
+
+
+    private PlateformDAO _plateformDAO;
+    private ParameterDAO _parameterDAO;
+}
Index: /ether_2012/service/implementation/service-context.xml
===================================================================
--- /ether_2012/service/implementation/service-context.xml	(revision 319)
+++ /ether_2012/service/implementation/service-context.xml	(revision 319)
@@ -0,0 +1,19 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+	<bean id="etherServiceTarget" class="com.ether.EtherServiceImpl">
+		<property name="plateformDAO" ref="refPlateformDAO" />
+		<property name="parameterDAO" ref="refParameterDAO" />
+	</bean>
+
+	<bean id="etherService" parent="transactionProxy">
+		<property name="target">
+			<ref bean="etherServiceTarget" />
+		</property>
+		<property name="transactionAttributeSource">
+			<bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" />
+		</property>
+	</bean>
+
+</beans>
Index: /ether_2012/service/interface/com/ether/EtherService.java
===================================================================
--- /ether_2012/service/interface/com/ether/EtherService.java	(revision 319)
+++ /ether_2012/service/interface/com/ether/EtherService.java	(revision 319)
@@ -0,0 +1,22 @@
+package com.ether;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 07 mar 2011
+ */
+public interface EtherService extends Service
+{
+	@Nullable
+	List<Plateform> getAllPlateforms() throws ServiceException;
+
+    @Nullable
+    Plateform getPlateformById( @Nullable final Integer plateformId ) throws ServiceException;
+
+    @Nullable
+    List<Parameter> getAllParametersByPlateformId( @NotNull final Integer plateformId ) throws ServiceException;
+}
Index: /ether_2012/service/interface/com/ether/Service.java
===================================================================
--- /ether_2012/service/interface/com/ether/Service.java	(revision 319)
+++ /ether_2012/service/interface/com/ether/Service.java	(revision 319)
@@ -0,0 +1,9 @@
+package com.ether;
+
+/**
+ * @author vmipsl
+ * @date 24 jan 2011 
+ */
+public interface Service
+{
+}
Index: /ether_2012/service/interface/com/ether/ServiceException.java
===================================================================
--- /ether_2012/service/interface/com/ether/ServiceException.java	(revision 319)
+++ /ether_2012/service/interface/com/ether/ServiceException.java	(revision 319)
@@ -0,0 +1,28 @@
+package com.ether;
+
+
+/**
+ * @author vmipsl
+ * @date 28 jan 2011 
+ */
+@SuppressWarnings("serial")
+public class ServiceException 
+	extends FormattedException
+{
+    public ServiceException(final Enum<? extends Code> code, final Throwable cause, final Object... parameters) {
+    	this(code, cause.getMessage(), cause, parameters);
+    }
+
+    protected ServiceException(final Enum<? extends Code> code, final String message, final Throwable cause, final Object... parameters) {
+    	super(prefix(code, message), cause, parameters);
+    }
+
+    public static enum ServiceCode implements Code
+    {
+    	UNKNOWN, 
+    	PERSISTENCE, 
+    	SERVICE_PROBLEM,
+        PLATEFORM_NOT_FOUND,
+        PARAMETER_NOT_FOUND,
+    }
+}
Index: /ether_2012/service/test/com/ether/EtherTest.java
===================================================================
--- /ether_2012/service/test/com/ether/EtherTest.java	(revision 319)
+++ /ether_2012/service/test/com/ether/EtherTest.java	(revision 319)
@@ -0,0 +1,54 @@
+package com.ether;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.imageio.ImageIO;
+import javax.swing.*;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.Serializable;
+import java.text.ParseException;
+
+/**
+ * @author vmipsl
+ * @date 2011
+ */
+public class EtherTest
+{
+    @NotNull
+    protected double[] createDataArray( @NotNull final Integer size, @NotNull final Integer begin )
+            throws ParseException
+    {
+        final double[] datas = new double[size];
+        for( int i = 0; i < size; i++ )
+        {
+            datas[i] = Double.valueOf( i + begin );
+        }
+        return datas;
+    }
+
+    protected void copyToFile( @NotNull final JFrame frame, @NotNull final String fileName )
+    {
+        final BufferedImage image = new BufferedImage( frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_RGB );
+
+        final Graphics2D g2 = image.createGraphics();
+        frame.paint( g2 );
+        g2.dispose();
+
+        try
+        {
+            final File out = new File( fileName );
+            ImageIO.write( image, "JPEG", out );
+        }
+        catch( Exception e )
+        {
+        }
+    }
+
+    protected <T extends Serializable> void displayArray( @NotNull final T[] objectsArray )
+    {
+        for( int i = 0; i < objectsArray.length; i++ )
+            System.out.println( objectsArray[i].toString() );
+    }
+}
Index: /ether_2012/service/test/com/ether/OtherTest.java
===================================================================
--- /ether_2012/service/test/com/ether/OtherTest.java	(revision 319)
+++ /ether_2012/service/test/com/ether/OtherTest.java	(revision 319)
@@ -0,0 +1,56 @@
+package com.ether;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author vmipsl
+ * @date 2011
+ */
+public class OtherTest
+{
+    @Test
+    public void testDatesMoisPlusUn()
+            throws Exception
+    {
+        final DateFormat shortDateFormat = new SimpleDateFormat( "MMyyyy" );
+        final DateFormat completDateFormat = new SimpleDateFormat( "dd-MM-yyyy" );
+        final Date firstMois = shortDateFormat.parse( "102008" );
+        final String firstMoisString = completDateFormat.format( firstMois );
+        Assert.assertEquals( firstMoisString, "01-10-2008" );
+
+        final Calendar calendar = Calendar.getInstance();
+        calendar.setTime( firstMois );
+        calendar.add( Calendar.MONTH, 1 );
+        final Date secondMois = calendar.getTime();
+        final String secondMoisString = completDateFormat.format( secondMois );
+        Assert.assertEquals( secondMoisString, "01-11-2008" );
+    }
+
+    @Test
+    public void testDates()
+            throws Exception
+    {
+        List<Date> dates = new ArrayList<Date>();
+        final DateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
+
+        dates.add( dateFormat.parse( "2007-01-01" ) );
+        dates.add( dateFormat.parse( "2007-01-02" ) );
+
+        final DateFormat shortFormat = new SimpleDateFormat( "yyyy" );
+        Set<String> shortDates = new HashSet<String>();
+        for ( final Date aDate : dates )
+        {
+            shortDates.add( shortFormat.format( aDate ) );
+        }
+    }
+}
Index: /ether_2012/service/test/com/ether/ServiceEtherTest.java
===================================================================
--- /ether_2012/service/test/com/ether/ServiceEtherTest.java	(revision 319)
+++ /ether_2012/service/test/com/ether/ServiceEtherTest.java	(revision 319)
@@ -0,0 +1,22 @@
+package com.ether;
+
+/**
+ * @author vmipsl
+ * @date 2011
+ */
+public class ServiceEtherTest
+        extends ServiceTestHelper<EtherService>
+{
+    public ServiceEtherTest()
+    {
+        super( "etherService" );
+    }
+
+    @Override
+    protected void beforeServiceTest()
+            throws Exception
+    {
+        afterServiceTest();
+    }
+
+}
Index: /ether_2012/service/test/com/ether/ServiceTestHelper.java
===================================================================
--- /ether_2012/service/test/com/ether/ServiceTestHelper.java	(revision 319)
+++ /ether_2012/service/test/com/ether/ServiceTestHelper.java	(revision 319)
@@ -0,0 +1,63 @@
+package com.ether;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public abstract class ServiceTestHelper<SERVICE extends Service> 
+	extends	HibernateTestHelper<SERVICE>
+{
+    protected ServiceTestHelper(final String serviceBeanName) {
+    	super(null, serviceBeanName, getAllDependencies(), DEFAULT_SESSION_FACTORY_BEAN_NAME);
+    }
+
+    protected void deleteAllKnownData() throws Exception
+    {
+    	//	deleteAllDatas( getAllKnownDomainClasses() );
+    }
+
+    public static String[] getAllDependencies()
+    {
+		return new String[] { 
+				"classpath:dao-context.xml",
+				"classpath:service-context.xml",
+				"classpath:hibernate_test.cfg.xml", };
+    }
+
+    @SuppressWarnings("rawtypes")
+    public static Class[] getAllKnownDomainClasses()
+    {
+    	return new Class[] { 
+    			Plateform.class,};
+    }
+
+    /**
+     * Executes operations before running test.
+     */
+    protected abstract void beforeServiceTest() throws Exception;
+
+    /**
+     * Executes operations after running test.
+     */
+    protected final void afterServiceTest() throws Exception
+    {
+	 //deleteAllKnownData();	
+    }
+
+    protected final void beforeHibernateTest() throws Exception
+    {
+    	beforeServiceTest();
+    }
+
+    protected final void afterHibernateTest() throws Exception
+    {
+    	afterServiceTest();
+    }
+
+    protected final SERVICE getService()
+    {
+    	return getBean();
+    }
+
+    private static final Log LOGGER = LogFactory.getLog(ServiceTestHelper.class);
+    private static final String DEFAULT_SESSION_FACTORY_BEAN_NAME = "sessionFactory";
+}
Index: /ether_2012/web/WEB-INF/LisezMoi.txt
===================================================================
--- /ether_2012/web/WEB-INF/LisezMoi.txt	(revision 319)
+++ /ether_2012/web/WEB-INF/LisezMoi.txt	(revision 319)
@@ -0,0 +1,38 @@
+USED LIBRARIES : 
+	- slf4j*.jar
+		- Simple Logging Facade for Java
+		- TODO : replace by log4j
+		
+	- javassist-3.9.0.GA.jar
+		- Needed to resolve "org.hibernate.tuple.entity.PojoEntityTuplizer" error
+		- https://forum.hibernate.org/viewtopic.php?f=1&t=998187
+
+	- jta-1.1.jar
+		- Java Transaction API
+		
+	- dom4j-1.6.1.jar
+		- dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP.
+		
+	- antlr-2.7.6.jar
+		- ANother Tool for Language Recognition
+		- A framework for constructing recognizers, compilers, and translators from grammatical descriptions
+
+	- asm-1.5.3.jar & cglib-2.2.jar
+		- Needs to avoid "java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter"
+		- WARNING : ONLY THESES VERSIONS WORKS WITH hibernate-all.jar & hibernate-3.3.2.GA.jar (both needed)
+
+	- hibernate-all.jar needed for junit tests
+
+UNDER WEB-INF/lib :
+    - commons-logging-1.1.1.jar
+        - Needs to avoid "javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory"
+
+	- spring*.jar
+		- !!!!! WARNING : THESE LIBRARIES MUST ALSO BE IN THE WEB-INF/lib/ DIRECTORY !!!!!
+
+    - struts.jar
+        - Needs to avoid "java.lang.ClassNotFoundException: org.apache.struts.taglib.tiles.InsertTag"
+
+    - ????
+        - Needs to avoid "java.lang.NullPointerException, org.apache.struts.util.RequestUtils.pageURL(RequestUtils.java:1596)"
+
Index: /ether_2012/web/WEB-INF/classes/com/ether/dao/Parameter.hbm.xml
===================================================================
--- /ether_2012/web/WEB-INF/classes/com/ether/dao/Parameter.hbm.xml	(revision 319)
+++ /ether_2012/web/WEB-INF/classes/com/ether/dao/Parameter.hbm.xml	(revision 319)
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.ether.Parameter" table="parametre" schema="public">
+        <comment>Table enumerant les differents parametres de mesure</comment>
+        <id name="id" type="int">
+            <column name="parametre_id" />
+            <!--<generator class="sequence">-->
+            <!--<param name="sequence">parametre_parametre_id_seq</param>-->
+            <!--</generator>-->
+        </id>
+
+        <property name="name" type="string">
+            <column name="parametre_nom" length="100" not-null="true">
+                <comment>nom du parametre</comment>
+            </column>
+        </property>
+
+        <set name="plateformes" inverse="true" table="requete_plat_param">
+            <key>
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.ether.Plateform">
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </many-to-many>
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_2012/web/WEB-INF/classes/com/ether/dao/Parameter_old.hbm.xml
===================================================================
--- /ether_2012/web/WEB-INF/classes/com/ether/dao/Parameter_old.hbm.xml	(revision 319)
+++ /ether_2012/web/WEB-INF/classes/com/ether/dao/Parameter_old.hbm.xml	(revision 319)
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-cascade="save-update" auto-import="false">
+
+	<class name="com.ether.Parameter" table="parameter">
+
+		<id name="id">
+			<column name="parametre_id" />
+			<generator class="increment" />
+
+			<!-- <generator class="sequence"> -->
+			<!-- <param name="sequence">S_TABLE_TEST</param> -->
+			<!-- </generator> -->
+		</id>
+
+		<property name="name">
+			<column name="parametre_nom"/>
+		</property>
+
+        <set name="plateformes" inverse="true" table="requete_plat_param">
+            <key>
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.ether.Plateform">
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </many-to-many>
+        </set>
+
+	</class>
+
+
+
+</hibernate-mapping>
+
Index: /ether_2012/web/WEB-INF/classes/com/ether/dao/Plateform.hbm.xml
===================================================================
--- /ether_2012/web/WEB-INF/classes/com/ether/dao/Plateform.hbm.xml	(revision 319)
+++ /ether_2012/web/WEB-INF/classes/com/ether/dao/Plateform.hbm.xml	(revision 319)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-cascade="save-update" auto-import="false">
+
+	<class name="com.ether.Plateform" table="plateforme">
+
+		<id name="id">
+			<column name="plateforme_id" />
+			<generator class="increment" />
+
+			<!-- <generator class="sequence"> -->
+			<!-- <param name="sequence">S_TABLE_TEST</param> -->
+			<!-- </generator> -->
+		</id>
+
+		<property name="name">
+			<column name="plateforme_nom"/>
+		</property>
+
+	</class>
+
+</hibernate-mapping>
+
Index: /ether_2012/web/WEB-INF/classes/dao-context.xml
===================================================================
--- /ether_2012/web/WEB-INF/classes/dao-context.xml	(revision 319)
+++ /ether_2012/web/WEB-INF/classes/dao-context.xml	(revision 319)
@@ -0,0 +1,18 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<!-- Application context DAO layer -->
+<beans>
+	<bean id="refPlateformDAO" class="com.ether.dao.PlateformDAOImpl">
+		<property name="sessionFactory">
+			<ref bean="sessionFactory" />
+		</property>
+	</bean>
+
+    <bean id="refParameterDAO" class="com.ether.dao.ParameterDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory" />
+        </property>
+    </bean>
+
+</beans>
Index: /ether_2012/web/WEB-INF/classes/hibernate-domain.cfg.xml
===================================================================
--- /ether_2012/web/WEB-INF/classes/hibernate-domain.cfg.xml	(revision 319)
+++ /ether_2012/web/WEB-INF/classes/hibernate-domain.cfg.xml	(revision 319)
@@ -0,0 +1,11 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-configuration PUBLIC
+        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+    <session-factory>
+        <mapping resource="com/ether/dao/Plateform.hbm.xml"/>
+        <mapping resource="com/ether/dao/Parameter.hbm.xml"/>
+    </session-factory>
+</hibernate-configuration>
Index: /ether_2012/web/WEB-INF/classes/hibernate.cfg.xml
===================================================================
--- /ether_2012/web/WEB-INF/classes/hibernate.cfg.xml	(revision 319)
+++ /ether_2012/web/WEB-INF/classes/hibernate.cfg.xml	(revision 319)
@@ -0,0 +1,52 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+	<!-- sessionFactory -->
+	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
+		<property name="configLocation">
+			<value>classpath:hibernate-domain.cfg.xml</value>
+		</property>
+
+		<property name="configurationClass">
+			<value>org.hibernate.cfg.AnnotationConfiguration</value>
+		</property>
+
+		<property name="hibernateProperties">
+			<props>
+				<prop key="hibernate.bytecode.use_reflection_optimizer">false</prop>
+				<prop key="hibernate.connection.driver_class">org.postgresql.Driver</prop>
+				<prop key="hibernate.connection.url">jdbc:postgresql://darkstar.ipslnet:5432/PROJECT_SOURCE</prop>
+				<prop key="hibernate.connection.username">postgres</prop>
+				<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
+				<prop key="hibernate.show_sql">true</prop>
+				<prop key="hibernate.generate_statistics">true</prop>
+			</props>
+		</property>
+	</bean>
+
+	<bean id="transactionManager"
+		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
+		<property name="sessionFactory" ref="sessionFactory" />
+	</bean>
+
+	<bean id="transactionProxy" abstract="true"
+		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
+		<property name="transactionManager">
+			<ref bean="transactionManager" />
+		</property>
+		<property name="transactionAttributes">
+			<props>
+				<prop key="insert*">PROPAGATION_REQUIRED</prop>
+				<prop key="update*">PROPAGATION_REQUIRED</prop>
+				<prop key="save*">PROPAGATION_REQUIRED</prop>
+				<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
+			</props>
+		</property>
+	</bean>
+
+	<!-- <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> -->
+	<!-- <property name="sessionFactory" ref="sessionFactory" /> -->
+	<!-- </bean> -->
+
+</beans>
Index: /ether_2012/web/WEB-INF/classes/hibernate_test.cfg.xml
===================================================================
--- /ether_2012/web/WEB-INF/classes/hibernate_test.cfg.xml	(revision 319)
+++ /ether_2012/web/WEB-INF/classes/hibernate_test.cfg.xml	(revision 319)
@@ -0,0 +1,49 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+	<!-- sessionFactory -->
+	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
+		<property name="configLocation">
+			<value>classpath:hibernate-domain.cfg.xml</value>
+		</property>
+
+		<property name="configurationClass">
+			<value>org.hibernate.cfg.AnnotationConfiguration</value>
+		</property>
+
+		<property name="hibernateProperties">
+			<props>
+				<prop key="hibernate.bytecode.use_reflection_optimizer">false</prop>
+				<prop key="hibernate.connection.driver_class">org.postgresql.Driver</prop>
+				<prop key="hibernate.connection.url">jdbc:postgresql://darkstar.ipslnet:5432/PROJECT_SOURCE_TEST</prop>
+				<prop key="hibernate.connection.username">postgres</prop>
+				<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
+				<prop key="hibernate.show_sql">true</prop>
+
+				<prop key="hibernate.generate_statistics">true</prop>
+			</props>
+		</property>
+	</bean>
+
+	<bean id="transactionManager"
+		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
+		<property name="sessionFactory" ref="sessionFactory" />
+	</bean>
+
+	<bean id="transactionProxy" abstract="true"
+		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
+		<property name="transactionManager">
+			<ref bean="transactionManager" />
+		</property>
+		<property name="transactionAttributes">
+			<props>
+				<prop key="insert*">PROPAGATION_REQUIRED</prop>
+				<prop key="update*">PROPAGATION_REQUIRED</prop>
+				<prop key="save*">PROPAGATION_REQUIRED</prop>
+				<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
+			</props>
+		</property>
+	</bean>
+
+</beans>
Index: /ether_2012/web/WEB-INF/classes/json/json-context.xml
===================================================================
--- /ether_2012/web/WEB-INF/classes/json/json-context.xml	(revision 319)
+++ /ether_2012/web/WEB-INF/classes/json/json-context.xml	(revision 319)
@@ -0,0 +1,17 @@
+<?com.medias.xml version="1.0" encoding="UTF-8" ?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
+
+    <bean id="jsonHelper" class="com.ether.JSONHelperImpl">
+        <property name="mapping">
+            <map>
+                <entry key="com.ether.Plateform" value-ref="plateformJsonSerializer"/>
+                <entry key="com.ether.Parameter" value-ref="parameterJsonSerializer"/>
+            </map>
+        </property>
+    </bean>
+
+    <bean id="parameterJsonSerializer" class="json.serializers.ParameterJsonSerializer"/>
+    <bean id="plateformJsonSerializer" class="json.serializers.PlateformJsonSerializer"/>
+</beans>
Index: /ether_2012/web/WEB-INF/classes/log4j.xml
===================================================================
--- /ether_2012/web/WEB-INF/classes/log4j.xml	(revision 319)
+++ /ether_2012/web/WEB-INF/classes/log4j.xml	(revision 319)
@@ -0,0 +1,74 @@
+<?com.medias.xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" threshold="all" debug="true">
+
+    <appender name="console" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="LOG4J %p %d{ISO8601} - %c{1} - %m%n"/>
+        </layout>
+    </appender>
+
+    <appender name="file" class="org.apache.log4j.FileAppender">
+        <param name="file" value="/home_local/workspaces/log4j_Project_source.log"/>
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="LOG4J %p %d{ISO8601} - %c{1} - %m%n"/>
+        </layout>
+    </appender>
+
+    <appender name="consoleHibernate" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="HIBERNATE : %p %d{ISO8601} - %c{1} - %m%n"/>
+        </layout>
+    </appender>
+ 
+    <!-- library loggers -->
+    <logger name="oracle.jdbc" additivity="false">
+        <level value="info"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="console"/>
+    </logger>
+
+    <logger name="oracle.ons" additivity="false">
+        <level value="debug"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="console"/>
+    </logger>
+
+    <logger name="org.hibernate">
+        <level value="trace"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="consoleHibernate"/>
+    </logger>
+
+<!--    <logger name="org.hibernate.persister.entity" additivity="false">-->
+<!--        <level value="trace"/>-->
+<!--        <appender-ref ref="file"/>-->
+<!--        <appender-ref ref="consoleHibernate"/>-->
+<!--    </logger>-->
+<!---->
+<!--	<logger name="org.hibernate.type">-->
+<!--        <level value="trace"/>-->
+<!--        <appender-ref ref="file"/>-->
+<!--        <appender-ref ref="consoleHibernate"/>-->
+<!--    </logger>-->
+<!--    -->
+<!--    <logger name="org.hibernate.SQL">-->
+<!--        <level value="trace"/>-->
+<!--        <appender-ref ref="file"/>-->
+<!--        <appender-ref ref="consoleHibernate"/>-->
+<!--    </logger>-->
+
+    <logger name="net.sf.cglib" additivity="false">
+        <level value="warn"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="console"/>
+    </logger>
+
+    <!-- root logger -->
+    <root>
+        <level value="warn"/>
+        <appender-ref ref="console"/>
+        <appender-ref ref="file"/>
+    </root>
+
+</log4j:configuration>
Index: /ether_2012/web/WEB-INF/classes/messages.properties
===================================================================
--- /ether_2012/web/WEB-INF/classes/messages.properties	(revision 319)
+++ /ether_2012/web/WEB-INF/classes/messages.properties	(revision 319)
@@ -0,0 +1,17 @@
+inWork=Work in progress..
+
+data.visualization=Data visualization
+data.visualization.pf=View plateforms
+data.visualization.noPf=No plateform
+data.visualization.selectPf=Plateforms
+data.visualization.noParameter=No parameter
+data.visualization.selectParameter=Parameters
+data.visualization.selectTime=Periode
+data.visualization.selectDate=Select a date
+data.visualization.BeginDate=Begin date
+data.visualization.EndDate=End date
+data.visualization.Unvalid_Period=Unvalid period !
+data.visualization.button.visualize=Visualization
+data.visualization.button.download=Download
+data.visualization.loading.data=Data loading
+
Index: /ether_2012/web/WEB-INF/classes/messages_en.properties
===================================================================
--- /ether_2012/web/WEB-INF/classes/messages_en.properties	(revision 319)
+++ /ether_2012/web/WEB-INF/classes/messages_en.properties	(revision 319)
@@ -0,0 +1,35 @@
+inWork=Work in progress..
+language=English
+label.language.fr=French
+label.language.en=English
+label.language=Language
+label.index=Back to index
+
+titre.visu=Simple visualization page
+titre.visu.pf=Visualization page for all plateforms and parameters
+titre.init=Init
+
+text.visu.pf=Load of the method "viewAllPlateforms" from the controller wich returns results to page "visu_plateform.jsp"
+text.visu.pf.href=Plateforms viex
+
+text.visu=Load of the method "view" from the controller which returns results to page visu.jsp
+text.visu.href=Simple view
+
+text.results=Results from controller :
+text.change.language=Switch language (use of labels from messages_en.properties)
+
+data.visualization=Data visualization
+data.visualization.pf=View plateforms
+data.visualization.noPf=No plateform
+data.visualization.selectPf=Plateforms
+data.visualization.noParameter=No parameter
+data.visualization.selectParameter=Parameters
+data.visualization.selectTime=Periode
+data.visualization.selectDate=Select a date
+data.visualization.BeginDate=Begin date
+data.visualization.EndDate=End date
+data.visualization.Unvalid_Period=Unvalid period !
+data.visualization.button.visualize=Visualization
+data.visualization.button.download=Download
+data.visualization.loading.data=Data loading
+
Index: /ether_2012/web/WEB-INF/classes/messages_fr.properties
===================================================================
--- /ether_2012/web/WEB-INF/classes/messages_fr.properties	(revision 319)
+++ /ether_2012/web/WEB-INF/classes/messages_fr.properties	(revision 319)
@@ -0,0 +1,35 @@
+inWork=Page en cours de construction..
+language=FRANCAIS
+label.language.fr=FranÃ§ais
+label.language.en=Anglais
+label.language=Langue
+label.index=Retour Ã  l'index
+
+titre.visu=Page de visualisation simple
+titre.visu.pf=Page de visualisation de toutes les plateformes/paramÃštres
+titre.init=Init
+
+text.visu.pf=Appel de la mÃ©thode viewAllPlateforms du controller qui renvoit vers la page visu_plateform.jsp
+text.visu.pf.href=vue plateforms
+
+text.visu=Appel de la mÃ©thode "view" du controller qui renvoit vers la page visu.jsp
+text.visu.href=vue simple
+
+text.results=RÃ©sultats retournÃ©s par le controller :
+text.change.language=Changement de langue (utilisation des labels de messages_en.properties)
+
+
+data.visualization=Visualisation des donnÃ©es
+data.visualization.pf=Voir les plateformes
+data.visualization.noPf=Pas de plateforme
+data.visualization.selectPf=Plateformes
+data.visualization.noParameter=Pas de param\u00E8tre
+data.visualization.selectParameter=Param\u00E8tres
+data.visualization.selectTime=P\u00E9riode
+data.visualization.selectDate=Choisissez une date
+data.visualization.BeginDate=Date de d\u00E9but :
+data.visualization.EndDate=Date de fin :
+data.visualization.Unvalid_Period=P\u00E9riode non valide !
+data.visualization.button.visualize=Visualisation
+data.visualization.button.download=T\u00E9l\u00E9chargement
+data.visualization.loading.data=Chargement des donn\u00E9es
Index: /ether_2012/web/WEB-INF/classes/service-context.xml
===================================================================
--- /ether_2012/web/WEB-INF/classes/service-context.xml	(revision 319)
+++ /ether_2012/web/WEB-INF/classes/service-context.xml	(revision 319)
@@ -0,0 +1,19 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+	<bean id="etherServiceTarget" class="com.ether.EtherServiceImpl">
+		<property name="plateformDAO" ref="refPlateformDAO" />
+		<property name="parameterDAO" ref="refParameterDAO" />
+	</bean>
+
+	<bean id="etherService" parent="transactionProxy">
+		<property name="target">
+			<ref bean="etherServiceTarget" />
+		</property>
+		<property name="transactionAttributeSource">
+			<bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" />
+		</property>
+	</bean>
+
+</beans>
Index: /ether_2012/web/WEB-INF/servlet-context.xml
===================================================================
--- /ether_2012/web/WEB-INF/servlet-context.xml	(revision 319)
+++ /ether_2012/web/WEB-INF/servlet-context.xml	(revision 319)
@@ -0,0 +1,65 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
+       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
+
+    <!-- i18n -->
+    <!--<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>-->
+    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
+        <property name="defaultLocale" value="en"/>
+    </bean>
+
+    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
+        <property name="paramName" value="language"/>
+    </bean>
+
+    <!-- Message source for this context, loaded from localized "messages_xx" files -->
+    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
+        <!--<property name="useCodeAsDefaultMessage" value="true"/>-->
+        <!--<property name="fallbackToSystemLocale" value="false"/>-->
+        <property name="defaultEncoding" value="UTF-8"/>
+        <property name="basenames">
+            <list>
+                <value>/WEB-INF/classes/messages</value>
+            </list>
+        </property>
+    </bean>
+
+    <!-- Mappings -->
+    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
+        <property name="interceptors">
+            <list>
+                <ref bean="localeChangeInterceptor"/>
+            </list>
+        </property>
+
+        <property name="mappings">
+            <props>
+                <prop key="/visualization">controller</prop>
+            </props>
+        </property>
+    </bean>
+
+    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
+        <property name="prefix" value="/"/>
+        <property name="suffix" value=".jsp"/>
+    </bean>
+
+    <bean id="myMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
+        <property name="defaultMethodName" value="home"/>
+        <property name="paramName" value="methodName"/>
+    </bean>
+
+    <bean id="controllerEther" class="com.ether.ControllerEther">
+        <property name="jsonHelper" ref="jsonHelper"/>
+        <property name="methodNameResolver" ref="myMethodNameResolver"/>
+    </bean>
+
+    <bean id="controller" class="com.ether.Controller" parent="controllerEther">
+        <property name="etherService" ref="etherService"/>
+    </bean>
+
+</beans>
Index: /ether_2012/web/WEB-INF/tags/htmlCss.tag
===================================================================
--- /ether_2012/web/WEB-INF/tags/htmlCss.tag	(revision 319)
+++ /ether_2012/web/WEB-INF/tags/htmlCss.tag	(revision 319)
@@ -0,0 +1,6 @@
+<%@ attribute name="cssFile" required="true" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<c:if test="${not empty cssFile}">
+    <link rel="stylesheet" type="text/css" href="resources/css/${cssFile}.css"/>
+</c:if>
Index: /ether_2012/web/WEB-INF/tags/htmlJs.tag
===================================================================
--- /ether_2012/web/WEB-INF/tags/htmlJs.tag	(revision 319)
+++ /ether_2012/web/WEB-INF/tags/htmlJs.tag	(revision 319)
@@ -0,0 +1,6 @@
+<%@ attribute name="jsFile" required="true" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<c:if test="${not empty jsFile}">
+	<script type="text/javascript" src="resources/js/${jsFile}.js"></script>
+</c:if>
Index: /ether_2012/web/WEB-INF/tags/htmlJsp.tag
===================================================================
--- /ether_2012/web/WEB-INF/tags/htmlJsp.tag	(revision 319)
+++ /ether_2012/web/WEB-INF/tags/htmlJsp.tag	(revision 319)
@@ -0,0 +1,6 @@
+<%@ attribute name="jspFile" required="true" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<c:if test="${not empty jspFile}">
+	<jsp:include page="${jspFile}.jsp" />
+</c:if>
Index: /ether_2012/web/WEB-INF/tags/htmlResourceJsp.tag
===================================================================
--- /ether_2012/web/WEB-INF/tags/htmlResourceJsp.tag	(revision 319)
+++ /ether_2012/web/WEB-INF/tags/htmlResourceJsp.tag	(revision 319)
@@ -0,0 +1,6 @@
+<%@ attribute name="jspFile" required="true" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<c:if test="${not empty jspFile}">
+	<jsp:include page="/resources/jsp/${jspFile}.jsp" />
+</c:if>
Index: /ether_2012/web/WEB-INF/tlds/struts-bean.tld
===================================================================
--- /ether_2012/web/WEB-INF/tlds/struts-bean.tld	(revision 319)
+++ /ether_2012/web/WEB-INF/tlds/struts-bean.tld	(revision 319)
@@ -0,0 +1,379 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+
+
+
+
+
+<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
+<taglib>
+<tlibversion>1.2</tlibversion>
+<jspversion>1.1</jspversion>
+<shortname>bean</shortname>
+<uri>http://struts.apache.org/tags-bean</uri>
+<tag>
+<name>cookie</name>
+<tagclass>org.apache.struts.taglib.bean.CookieTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.CookieTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>multiple</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>define</name>
+<tagclass>org.apache.struts.taglib.bean.DefineTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.DefineTei</teiclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>toScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>type</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>header</name>
+<tagclass>org.apache.struts.taglib.bean.HeaderTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.HeaderTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>multiple</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>include</name>
+<tagclass>org.apache.struts.taglib.bean.IncludeTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.IncludeTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>anchor</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>forward</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>href</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>transaction</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>message</name>
+<tagclass>org.apache.struts.taglib.bean.MessageTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>arg0</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>arg1</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>arg2</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>arg3</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>arg4</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>key</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>page</name>
+<tagclass>org.apache.struts.taglib.bean.PageTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.PageTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>plateform</name>
+<tagclass>org.apache.struts.taglib.bean.ParameterTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.ParameterTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>multiple</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>resource</name>
+<tagclass>org.apache.struts.taglib.bean.ResourceTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.ResourceTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>input</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>size</name>
+<tagclass>org.apache.struts.taglib.bean.SizeTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.SizeTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>collection</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>struts</name>
+<tagclass>org.apache.struts.taglib.bean.StrutsTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.StrutsTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>formBean</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>forward</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>mapping</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>write</name>
+<tagclass>org.apache.struts.taglib.bean.WriteTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>filter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>format</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>formatKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ignore</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+</taglib>
Index: /ether_2012/web/WEB-INF/tlds/struts-html.tld
===================================================================
--- /ether_2012/web/WEB-INF/tlds/struts-html.tld	(revision 319)
+++ /ether_2012/web/WEB-INF/tlds/struts-html.tld	(revision 319)
@@ -0,0 +1,3032 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+
+
+
+
+
+
+
+<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
+<taglib>
+<tlibversion>1.2</tlibversion>
+<jspversion>1.1</jspversion>
+<shortname>html</shortname>
+<uri>http://struts.apache.org/tags-html</uri>
+<tag>
+<name>base</name>
+<tagclass>org.apache.struts.taglib.html.BaseTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>target</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>server</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>button</name>
+<tagclass>org.apache.struts.taglib.html.ButtonTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>cancel</name>
+<tagclass>org.apache.struts.taglib.html.CancelTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>checkbox</name>
+<tagclass>org.apache.struts.taglib.html.CheckboxTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>errors</name>
+<tagclass>org.apache.struts.taglib.html.ErrorsTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>file</name>
+<tagclass>org.apache.struts.taglib.html.FileTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>accept</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>maxlength</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>size</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>form</name>
+<tagclass>org.apache.struts.taglib.html.FormTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>action</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>acceptCharset</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>enctype</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>focus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>focusIndex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>method</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onreset</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onsubmit</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scriptLanguage</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>target</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>frame</name>
+<tagclass>org.apache.struts.taglib.html.FrameTag</tagclass>
+<attribute>
+<name>action</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>module</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>anchor</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>forward</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>frameborder</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>frameName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>href</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>longdesc</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>marginheight</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>marginwidth</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>noresize</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scrolling</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>transaction</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>hidden</name>
+<tagclass>org.apache.struts.taglib.html.HiddenTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>write</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>html</name>
+<tagclass>org.apache.struts.taglib.html.HtmlTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>lang</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>xhtml</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>image</name>
+<tagclass>org.apache.struts.taglib.html.ImageTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>align</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>border</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>pageKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>src</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>srcKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>img</name>
+<tagclass>org.apache.struts.taglib.html.ImgTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>align</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>border</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>contextRelative</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>height</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>hspace</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>imageName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ismap</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>lowsrc</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>pageKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>action</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>module</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>src</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>srcKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>useLocalEncoding</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>usemap</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>vspace</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>width</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>javascript</name>
+<tagclass>org.apache.struts.taglib.html.JavascriptValidatorTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>cdata</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>dynamicJavascript</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>formName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>method</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scriptLanguage</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>src</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>staticJavascript</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>htmlComment</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>link</name>
+<tagclass>org.apache.struts.taglib.html.LinkTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>action</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>module</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>anchor</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>forward</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>href</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>linkName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>target</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>transaction</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>useLocalEncoding</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>messages</name>
+<tagclass>org.apache.struts.taglib.html.MessagesTag</tagclass>
+<teiclass>org.apache.struts.taglib.html.MessagesTei</teiclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>footer</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>message</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>multibox</name>
+<tagclass>org.apache.struts.taglib.html.MultiboxTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>option</name>
+<tagclass>org.apache.struts.taglib.html.OptionTag</tagclass>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>key</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>options</name>
+<tagclass>org.apache.struts.taglib.html.OptionsTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>collection</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>filter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>labelName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>labelProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>optionsCollection</name>
+<tagclass>org.apache.struts.taglib.html.OptionsCollectionTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>filter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>label</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>password</name>
+<tagclass>org.apache.struts.taglib.html.PasswordTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>maxlength</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>readonly</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>redisplay</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>size</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>radio</name>
+<tagclass>org.apache.struts.taglib.html.RadioTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>idName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>reset</name>
+<tagclass>org.apache.struts.taglib.html.ResetTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>rewrite</name>
+<tagclass>org.apache.struts.taglib.html.RewriteTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>action</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>module</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>anchor</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>forward</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>href</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>transaction</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>useLocalEncoding</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>select</name>
+<tagclass>org.apache.struts.taglib.html.SelectTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>multiple</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>size</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>submit</name>
+<tagclass>org.apache.struts.taglib.html.SubmitTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>text</name>
+<tagclass>org.apache.struts.taglib.html.TextTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>maxlength</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>readonly</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>size</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>textarea</name>
+<tagclass>org.apache.struts.taglib.html.TextareaTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>cols</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>readonly</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>rows</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>xhtml</name>
+<tagclass>org.apache.struts.taglib.html.XhtmlTag</tagclass>
+<bodycontent>empty</bodycontent>
+</tag>
+</taglib>
+
Index: /ether_2012/web/WEB-INF/web.xml
===================================================================
--- /ether_2012/web/WEB-INF/web.xml	(revision 319)
+++ /ether_2012/web/WEB-INF/web.xml	(revision 319)
@@ -0,0 +1,73 @@
+<?com.medias.xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+        "http://java.sun.com/dtd/web-app_2_3.dtd">
+<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+    <display-name>Project_source</display-name>
+
+    <welcome-file-list>Â Â 
+        Â Â Â Â Â Â Â Â <welcome-file>index.jsp</welcome-file>Â Â 
+    </welcome-file-list>
+    Â Â 
+
+    <context-param>
+        <param-name>contextConfigLocation</param-name>
+        <param-value>
+            classpath:dao-context.xml,
+            classpath:service-context.xml,
+            classpath:hibernate.cfg.xml,
+
+            classpath:json/json-context.xml
+        </param-value>
+    </context-param>
+
+    <listener>
+        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+    </listener>
+
+    <!-- TAGLIBS -->
+    <!--<taglib>-->
+    <!--<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>-->
+    <!--<taglib-location>/WEB-INF/tags/htmlJsp.tag</taglib-location>-->
+    <!--</taglib>-->
+
+    <!--<taglib>-->
+    <!--<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>-->
+    <!--<taglib-location>/WEB-INF/tags/htmlResourceJsp.tag</taglib-location>-->
+    <!--</taglib>-->
+
+    <!--<taglib>-->
+    <!--<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>-->
+    <!--<taglib-location>/WEB-INF/tags/htmlCss.tag</taglib-location>-->
+    <!--</taglib>-->
+
+    <!--<taglib>-->
+    <!--<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>-->
+    <!--<taglib-location>/WEB-INF/tags/htmlJs.tag</taglib-location>-->
+    <!--</taglib>-->
+
+    <!--SERVLETS -->
+    <servlet>
+        <servlet-name>visualization</servlet-name>
+        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+        <init-param>
+            <param-name>contextConfigLocation</param-name>
+            <param-value>
+                /WEB-INF/servlet-context.xml
+            </param-value>
+        </init-param>
+    </servlet>
+
+    <servlet-mapping>
+        <servlet-name>visualization</servlet-name>
+        <url-pattern>/visualization</url-pattern>
+    </servlet-mapping>
+
+    <session-config>
+        <session-timeout>60</session-timeout>
+        <!-- minute -->
+    </session-config>
+
+</web-app>
Index: /ether_2012/web/Web.iml
===================================================================
--- /ether_2012/web/Web.iml	(revision 319)
+++ /ether_2012/web/Web.iml	(revision 319)
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="Spring" name="Spring">
+      <configuration>
+        <fileset id="web: application context" name="MVC application context" removed="false">
+          <file>file://$MODULE_DIR$/src/json/json-context.xml</file>
+          <file>file://$MODULE_DIR$/../persistence/implementation/dao-context.xml</file>
+          <file>file://$MODULE_DIR$/../service/implementation/service-context.xml</file>
+          <file>file://$MODULE_DIR$/../persistence/implementation/hibernate.cfg.xml</file>
+        </fileset>
+      </configuration>
+    </facet>
+    <facet type="web" name="Web">
+      <configuration>
+        <descriptors>
+          <deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/WEB-INF/web.xml" />
+        </descriptors>
+        <webroots>
+          <root url="file://$MODULE_DIR$" relative="/" />
+        </webroots>
+      </configuration>
+    </facet>
+    <facet type="hibernate" name="Hibernate">
+      <configuration>
+        <datasource-map>
+          <unit-entry name="WEB-INF:classes:hibernate-medias.cfg.xml" />
+          <unit-entry name="sessionFactory" />
+        </datasource-map>
+        <deploymentDescriptor name="hibernate.cfg.xml" url="file://$MODULE_DIR$/../persistence/implementation/hibernate.cfg.xml" />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+    </content>
+    <orderEntry type="jdk" jdkName="1.6" jdkType="JavaSDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="Common" />
+    <orderEntry type="module" module-name="Service" />
+    <orderEntry type="module" module-name="Domain" />
+    <orderEntry type="module" module-name="Persistence" />
+    <orderEntry type="library" name="lib_spring" level="project" />
+    <orderEntry type="library" name="lib_common" level="project" />
+    <orderEntry type="library" name="lib_hibernate" level="project" />
+  </component>
+</module>
+
Index: /ether_2012/web/cathy/css/anytime.css
===================================================================
--- /ether_2012/web/cathy/css/anytime.css	(revision 319)
+++ /ether_2012/web/cathy/css/anytime.css	(revision 319)
@@ -0,0 +1,777 @@
+/*****************************************************************************
+ *  FILE:  anytime.css - The Any+Time(TM) JavaScript Library (stylesheet)
+ *
+ *  VERSION: 4.1112H
+ *
+ *  Copyright 2008-2010 Andrew M. Andrews III (www.AMA3.com). Some Rights 
+ *  Reserved. This work licensed under the Creative Commons Attribution-
+ *  Noncommercial-Share Alike 3.0 Unported License except in jurisdicitons
+ *  for which the license has been ported by Creative Commons International,
+ *  where the work is licensed under the applicable ported license instead.
+ *  For a copy of the unported license, visit
+ *  http://creativecommons.org/licenses/by-nc-sa/3.0/
+ *  or send a letter to Creative Commons, 171 Second Street, Suite 300,
+ *  San Francisco, California, 94105, USA.  For ported versions of the
+ *  license, visit http://creativecommons.org/international/
+ *
+ *  Alternative licensing arrangements may be made by contacting the
+ *  author at http://www.AMA3.com/contact/
+ *
+ *  This file provides default styling for the Any+Time JavaScript Library's
+ *  calendar widget.  The styles within can be overridden to customize the
+ *  picker's appearance for a particular platform.  jQuery UI styles (such
+ *  as those created by jQuery ThemeRoller) will override the styles in this
+ *  stylesheet.
+ *
+ *  These styles have been tested (but not extensively) on Windows Vista in
+ *  Internet Explorer 8.0, Firefox 3.0, Opera 10.10 and Safari 4.0.  Minor
+ *  variations in IE older versions of IE are to be expected, due to its
+ *  broken box model. Please report any other problems to the author via
+ *  the URL above.
+ *
+ *  Any+Time is a trademark of Andrew M. Andrews III.
+ ****************************************************************************/
+
+/*
+ *  The following styles ascertain that the types of elements used by
+ *  our picker have reasonable styles, especially font, font-size,
+ *  list-style-type, margin and padding.
+ */
+
+.AnyTime-pkr *
+{
+    border:0;
+    font: inherit;
+    font-size: x-small; 
+    font-style:normal;
+    font-weight:normal;
+    list-style-type:none;
+    margin:0;
+    padding:0;
+    white-space: nowrap;
+}
+
+/*
+ *  .AnyTime-win simulates a "window" that might be a popup or inline.
+ *  Styles should include background-color and border.  A window should 
+ *  be sized according to its contents; therefore, width and height
+ *  should NOT be specified.
+ */
+
+div.AnyTime-win
+{
+  background-color:#F0F0F1;
+  border:3px solid #C0C0C0;
+  font:normal normal normal xx-small/normal sans-serif;
+  padding-bottom:0.2em;
+  -moz-border-radius:6px;
+  -webkit-border-radius:6px;
+}
+
+/*
+ *  .AnyTime-pkr is the Date/Time picker, inserted into the page immediately 
+ *  after the input (text field) to which it corresponds.  The picker
+ *  attempts to size itself automatically based on its format fields;
+ *  therefore, do NOT set width or height.  This is empty by default,
+ *  because .AnyTime-win styles provide consistent window appearance.
+ */
+
+.AnyTime-pkr
+{
+}
+
+/*
+ *  .AnyTime-cloak covers an AnyTime-pkr whenever an AnyTime-yr-selector is placed over
+ *  it.  The picker cannot be accessed until the AnyTime-yr-selector has been
+ *  dismissed (possibly by clicking the AnyTime-cloak). The style usually
+ *  includes a background-color and opacity (and filter for MSIE opacity).
+ */
+
+.AnyTime-pkr .AnyTime-cloak
+{
+  background-color:#D7D7D7;
+  opacity:0.7;
+  filter:alpha(opacity=70);
+}
+
+/*
+ *  .AnyTime-hdr is the title bar at the top of a "window." In addition to
+ *  the title label, the title bar for popup (non-inline) pickers also
+ *  contains .AnyTime-x-btn.
+ */
+
+.AnyTime-pkr .AnyTime-hdr
+{
+  background-color:#D0D0D1;
+  color:#606062;
+  font-family:Arial,Helvetica,sans-serif;
+  font-size:medium;
+  font-weight:normal;
+  height:1em;
+  margin:0;
+  padding:0 0 0.4em 0;
+  text-align:center;
+  -moz-border-radius:2px;
+  -webkit-border-radius:2px;
+}
+
+/*
+ *  .AnyTime-x-btn is a pseudo-button that, when clicked, causes the entire
+ *  picker to disappear (the picker also disappears if the user clicks 
+ *  almost anywhere off of it, or presses ESC).  This is designed to have,
+ *  at minumum, a border and float:right.
+ */
+
+.AnyTime-pkr .AnyTime-x-btn
+{
+  background-color:#FCFCFF;
+  border:1px solid #F99;
+  color:#FF9F9F;
+  cursor:default;
+  float:right;
+  margin:0.3em;
+  text-align:center;
+  width:1.5em;
+  -moz-border-radius:0.4em;
+  -webkit-border-radius:0.4em;
+}
+
+/*
+ *  .AnyTime-btn is a pseudo-button for selection of a format field value.
+ *  Both height and float:left should be specified, but width is usually
+ *  left for different variations to specify (see classes .AnyTime-***-btn).
+ */
+
+.AnyTime-pkr .AnyTime-btn
+{
+  background-color:#FCFCFE;
+  border:1px solid #999;
+  color:#606062;
+  cursor:default;
+  float:left;
+  font-family:Arial,Helvetica,sans-serif;
+  height:1.5em;
+  margin-bottom:1px;
+  margin-right:1px;
+  padding-top:0.1em;
+  -moz-border-radius:0.4em;
+  -webkit-border-radius:0.4em;
+}
+
+/*
+ *  .AnyTime-body contains everything in thee picker except the title bar.
+ *  Because the picker attempts to size itself automatically based on
+ *  its format fields, do not width or height.
+ */
+
+.AnyTime-pkr .AnyTime-body
+{
+	padding:0.5em;
+}
+
+/*
+ *  .AnyTime-date contains all content (labels and pseudo-buttons) for selecting
+ *  a date (or part thereof).  It is designed to be float:left and should
+ *  have a small amount of paddding.
+ */
+
+.AnyTime-pkr .AnyTime-date
+{
+  float:left;
+  padding:0 0.5em;
+}
+
+/*
+ *  .AnyTime-lbl headings appear before each group of pseudo-buttons for a
+ *  particular format field.  Each specific label has a class, also.
+ *  Styles clear:left and height should be specified here.
+ */
+
+.AnyTime-pkr .AnyTime-lbl
+{
+  clear:left;
+  color:#606063;
+  font-family:Arial,Helvetica,sans-serif;
+  font-size:100%;
+  font-weight:normal;
+  font-style:normal;
+  height:1.3em;
+  margin:0;
+  padding:0;
+  text-align:center;
+}
+
+.AnyTime-pkr .AnyTime-lbl-yr,
+.AnyTime-pkr .AnyTime-lbl-mon,
+.AnyTime-pkr .AnyTime-lbl-dom,
+.AnyTime-pkr .AnyTime-lbl-hr,
+.AnyTime-pkr .AnyTime-lbl-min,
+.AnyTime-pkr .AnyTime-lbl-sec
+{
+}
+
+/*
+ *  .AnyTime-yrs contains the year-selection pseudo-buttons.
+ *  A height and width should be specified.
+ */
+
+.AnyTime-pkr .AnyTime-yrs
+{
+  height:2.6em;
+  text-align:center;
+  width:18.6em;
+}
+
+/*
+ *  Following are classes for the pseudo-buttons within .AnyTime-yrs
+ *  A width should be specified for each.
+ */
+
+.AnyTime-pkr .AnyTime-yrs-past-btn
+{
+  width:2.7em;
+}
+
+.AnyTime-pkr .AnyTime-yr-prior-btn,
+.AnyTime-pkr .AnyTime-yr-cur-btn,
+.AnyTime-pkr .AnyTime-yr-next-btn
+{
+  width:3.75em;
+}
+
+.AnyTime-pkr .AnyTime-yrs-ahead-btn
+{
+  width:2.7em;
+}
+
+/*
+ *  .AnyTime-mons
+ *  .AnyTime-mons contains the month-selection pseudo-buttons.
+ *  A height and width should be specified.
+ */
+
+.AnyTime-pkr .AnyTime-mons
+{
+  height:4.8em;
+  text-align:center;
+  width:18.8em;
+}
+
+/*
+ *  .AnyTime-mon-btn is for the pseudo-buttons within .AnyTime-mons
+ *  A width should be specified.
+ *  Each pseudo-button also has a class of its own.
+ */
+
+.AnyTime-pkr .AnyTime-mon-btn
+{
+  width:2.75em;
+}
+
+.AnyTime-pkr .AnyTime-mon1-btn,
+.AnyTime-pkr .AnyTime-mon2-btn,
+.AnyTime-pkr .AnyTime-mon3-btn,
+.AnyTime-pkr .AnyTime-mon4-btn,
+.AnyTime-pkr .AnyTime-mon5-btn,
+.AnyTime-pkr .AnyTime-mon6-btn,
+.AnyTime-pkr .AnyTime-mon8-btn,
+.AnyTime-pkr .AnyTime-mon9-btn,
+.AnyTime-pkr .AnyTime-mon10-btn,
+.AnyTime-pkr .AnyTime-mon11-btn,
+.AnyTime-pkr .AnyTime-mon12-btn
+{
+}
+
+.AnyTime-pkr .AnyTime-mon7-btn
+{
+	clear:left;
+}
+
+
+/*
+ *  .AnyTime-dom-table is the table containing days-of-the-month.
+ *  .AnyTime-dom-head is the table heading, containing days-of-the-week labels.
+ *  tr.AnyTime-dow is the row in the heading.
+ *  td.AnyTime-dow is a column heading; each heading has its own class, also.
+ *  .AnyTime-dom-body is the table heading, containing days-of-the-week labels.
+ *  .AnyTime-wk is a table row, containing pseudo-buttons for days.
+ *  Each week has its own class (.AnyTime-wk***), also.
+ */
+
+.AnyTime-pkr .AnyTime-dom-table
+{
+  background-color:#F0F0F1;
+  border:1px solid #E3E3E4;
+  border-spacing:1px;
+  width:18.6em;
+}
+
+.AnyTime-pkr .AnyTime-dom-head
+{
+}
+
+.AnyTime-pkr tr.AnyTime-dow
+{
+}
+
+.AnyTime-pkr th.AnyTime-dow
+{
+  background-color:#C0C0C1;
+  color:white;
+  font-family:Arial,Helvetica,sans-serif;
+  font-size:95%;
+  font-weight:normal;
+  font-style:normal;
+}
+
+.AnyTime-pkr .AnyTime-dow1,
+.AnyTime-pkr .AnyTime-dow2,
+.AnyTime-pkr .AnyTime-dow3,
+.AnyTime-pkr .AnyTime-dow4,
+.AnyTime-pkr .AnyTime-dow5,
+.AnyTime-pkr .AnyTime-dow6,
+.AnyTime-pkr .AnyTime-dow7
+{
+}
+
+.AnyTime-pkr .AnyTime-dom-body
+{
+}
+
+.AnyTime-pkr .AnyTime-wk
+{
+}
+
+.AnyTime-pkr .AnyTime-wk1,
+.AnyTime-pkr .AnyTime-wk2,
+.AnyTime-pkr .AnyTime-wk3,
+.AnyTime-pkr .AnyTime-wk4,
+.AnyTime-pkr .AnyTime-wk5,
+.AnyTime-pkr .AnyTime-wk6
+{
+}
+
+/*
+ *  .AnyTime-dom-btn is a pseudo-button for a day-of-the-month.
+ *  Styles width, text-align:right and float:none should be specified.
+ *  .AnyTime-dom-btn-filled is a button containing a specific day-of-the-month.
+ *  .AnyTime-dom-btn-empty is a button for an empty cell (no day-of-the-month).
+ *  .AnyTime-dom-btn-empty-above-filled is an empty button above a filled button.
+ *  .AnyTime-dom-btn-empty-before-filled is empty, left of a filled button.
+ *  .AnyTime-dom-btn-empty-after-filled is empty, right of a filled button.
+ *  .AnyTime-dom-btn-empty-below-filled is empty, below a filled button.
+ */
+
+.AnyTime-pkr .AnyTime-dom-btn
+{
+  float:none;
+  height:1.7em;
+  text-align:right;
+  padding:0 0.5em 0 0;
+}
+
+.AnyTime-pkr .AnyTime-dom-btn-filled
+{
+}
+
+.AnyTime-pkr .AnyTime-dom-btn-empty
+{
+    background-color:#F3F3F4;
+    border:1px solid #C0C0c1;
+}
+
+.AnyTime-pkr .AnyTime-dom-btn-empty-above-filled,
+.AnyTime-pkr .AnyTime-dom-btn-empty-before-filled,
+.AnyTime-pkr .AnyTime-dom-btn-empty-after-filled,
+.AnyTime-pkr .AnyTime-dom-btn-empty-below-filled
+{
+}
+
+/*
+ *  .AnyTime-time contains all content (labels and pseudo-buttons) for selecting
+ *  a time (or part thereof).  It is designed to be float:left and should
+ *  have a small amount of paddding.
+ */
+
+.AnyTime-pkr .AnyTime-time
+{
+  float:left;
+  padding:0 0 0 1em;
+  text-align:center;
+}
+
+/*
+ *  .AnyTime-hrs contains two columns (.AnyTime-hrs-am and .AnyTime-hrs-pm) of
+ *  pseudo-buttons for selecting hours. It is designed to be float:left, have
+ *  a width and padding.  The columns should each have width and float:left.
+ */
+
+.AnyTime-pkr .AnyTime-hrs
+{
+  float:left;
+  padding-left:0.5em;
+  padding-right:0.5em;
+  text-align:center;
+  width:7.2em;
+}
+
+.AnyTime-pkr .AnyTime-hrs-am,
+.AnyTime-pkr .AnyTime-hrs-pm
+{
+  float:left;
+  width:3.6em;
+}
+
+/*
+ *  .AnyTime-hr-btn is a pseudo-button for selecting an hour.
+ *  Style should include width.
+ *  Each button also has a style of its own. 
+ */
+
+.AnyTime-pkr .AnyTime-hr-btn
+{
+  text-align:right;
+  padding-right:0.25em;
+  width:3em;  
+}
+
+.AnyTime-pkr .AnyTime-hr0-btn,
+.AnyTime-pkr .AnyTime-hr1-btn,
+.AnyTime-pkr .AnyTime-hr2-btn,
+.AnyTime-pkr .AnyTime-hr3-btn,
+.AnyTime-pkr .AnyTime-hr4-btn,
+.AnyTime-pkr .AnyTime-hr5-btn,
+.AnyTime-pkr .AnyTime-hr6-btn,
+.AnyTime-pkr .AnyTime-hr7-btn,
+.AnyTime-pkr .AnyTime-hr8-btn,
+.AnyTime-pkr .AnyTime-hr9-btn,
+.AnyTime-pkr .AnyTime-hr10-btn,
+.AnyTime-pkr .AnyTime-hr11-btn,
+.AnyTime-pkr .AnyTime-hr12-btn,
+.AnyTime-pkr .AnyTime-hr13-btn,
+.AnyTime-pkr .AnyTime-hr14-btn,
+.AnyTime-pkr .AnyTime-hr15-btn,
+.AnyTime-pkr .AnyTime-hr16-btn,
+.AnyTime-pkr .AnyTime-hr17-btn,
+.AnyTime-pkr .AnyTime-hr18-btn,
+.AnyTime-pkr .AnyTime-hr19-btn,
+.AnyTime-pkr .AnyTime-hr20-btn,
+.AnyTime-pkr .AnyTime-hr21-btn,
+.AnyTime-pkr .AnyTime-hr22-btn,
+.AnyTime-pkr .AnyTime-hr23-btn
+{
+}
+
+/*
+ *  .AnyTime-mins contains two columns (.AnyTime-mins-tens and .AnyTime-mins-ones)
+ *  of pseudo-buttons for selecting minutes.
+ *  It is designed to be float:left, have a width and padding.
+ *  The columns should each have width and float:left.
+ */
+
+.AnyTime-pkr .AnyTime-mins
+{
+  float:left;
+  padding-left:0.5em;
+  padding-right:0.5em;
+  text-align:center;
+  width:4.7em;
+}
+
+.AnyTime-pkr .AnyTime-mins-tens,
+.AnyTime-pkr .AnyTime-mins-ones
+{
+  float:left;
+  width:2.3em;
+}
+
+/*
+ *  .AnyTime-min-ten-btn is a button in the .AnyTime-mins-tens column.
+ *  .AnyTime-min-one-btn is a button in the .AnyTime-ones-tens column.
+ *  A width should be specified.
+ *  Each button also has its own style.
+ */
+ 
+.AnyTime-pkr .AnyTime-min-ten-btn,
+.AnyTime-pkr .AnyTime-min-one-btn
+{
+  float:left;
+  text-align:center;
+  width:2em;
+}
+
+.AnyTime-pkr .AnyTime-min-ten-btn-empty,
+.AnyTime-pkr .AnyTime-min-one-btn-empty
+{
+    background-color:#F3F3F4;
+    border:1px solid #C0C0c1;
+}
+
+.AnyTime-pkr .AnyTime-min00-btn,
+.AnyTime-pkr .AnyTime-min10-btn, /*etc*/
+.AnyTime-pkr .AnyTime-min0-btn,
+.AnyTime-pkr .AnyTime-min1-btn /*etc*/
+{
+}
+
+/*
+ *  .AnyTime-secs contains two columns (.AnyTime-secs-tens and .AnyTime-secs-ones)
+ *  of pseudo-buttons for selecting seconds.
+ *  It is designed to be float:left, have a width and padding.
+ *  The columns should each have width and float:left.
+ */
+
+.AnyTime-pkr .AnyTime-secs
+{
+  float:left;
+  padding-left:0.5em;
+  padding-right:0.5em;
+  text-align:center;
+  width:4.7em;
+}
+
+.AnyTime-pkr .AnyTime-secs-tens,
+.AnyTime-pkr .AnyTime-secs-ones
+{
+  float:left;
+  width:2.3em;
+}
+
+/*
+ *  .AnyTime-sec-ten-btn is a button in the .AnyTime-secs-tens column.
+ *  .AnyTime-sec-one-btn is a button in the .AnyTime-ones-tens column.
+ *  A width should be specified.
+ *  Each button also has its own style.
+ */
+
+.AnyTime-pkr .AnyTime-sec-ten-btn,
+.AnyTime-pkr .AnyTime-sec-one-btn
+{
+  float:left;
+  text-align:center;
+  width:2em;
+}
+
+.AnyTime-pkr .AnyTime-sec-ten-btn-empty,
+.AnyTime-pkr .AnyTime-sec-one-btn-empty
+{
+    background-color:#F3F3F4;
+    border:1px solid #C0C0c1;
+}
+
+.AnyTime-pkr .AnyTime-sec00-btn,
+.AnyTime-pkr .AnyTime-sec10-btn, /*etc*/
+.AnyTime-pkr .AnyTime-sec0-btn,
+.AnyTime-pkr .AnyTime-sec1-btn /*etc*/
+{
+}
+
+
+
+/*
+ *  .AnyTime-offs contains the UTC offset (timezone) selection pseudo-buttons.
+ *  The container is designed to have clear:left, float:left and padding. 
+ *  The two buttons have their own styles, and .AnyTime-off-select-btn should
+ *  include a width.
+ *  The width of the container and the .AnyTime-off-cur-btn should not be
+ *  specified, as they are computed based on the width of the
+ *  .AnyTime-off-select-btn and the .AnyTime-time container.
+ */
+ 
+.AnyTime-pkr .AnyTime-offs
+{
+  clear:left;
+  float:left;
+  padding-left:0.5em;
+  padding-top:0.5em;
+  text-align:center;
+}
+
+.AnyTime-pkr .AnyTime-off-btn,
+.AnyTime-pkr .AnyTime-off-cur-btn
+{
+}
+
+.AnyTime-pkr .AnyTime-off-select-btn
+{
+  width:1.5em;
+}
+
+/*
+ *  .AnyTime-yr-selector is an overlay (popup) for selecting a specific year.
+ *  The picker attempts to size the overlay automatically, based on
+ *  whether "era" buttons are displayed; therefore, do not set width.
+ *  AnyTime-hdr-yr-selector is its title bar. 
+ *  AnyTime-body-yr-selector is its body.
+ */
+
+.AnyTime-pkr .AnyTime-yr-selector
+{
+}
+
+.AnyTime-pkr .AnyTime-hdr-yr-selector
+{
+}
+
+.AnyTime-pkr .AnyTime-body-yr-selector
+{
+  padding:1em;	
+}
+
+/*
+ *  .AnyTime-yr-mil is the column of millenium-selector pseudo-buttons.
+ *  .AnyTime-yr-cent is the column of century-selector pseudo-buttons.
+ *  .AnyTime-yr-dec is the column of decade-selector pseudo-buttons.
+ *  .AnyTime-yr-yr is the column of year-selector pseudo-buttons.
+ *  A width and float:left should be specified for each.
+ *
+ *  .AnyTime-mil-btn is a millenium-selector button.
+ *  .AnyTime-cent-btn is a century-selector button.
+ *  .AnyTime-dec-btn is a decade-selector button.
+ *  .AnyTime-yr-btn is a year-selector button.
+ *  Each button has its own class, also.
+ */
+
+.AnyTime-pkr .AnyTime-yr-mil,
+.AnyTime-pkr .AnyTime-yr-cent,
+.AnyTime-pkr .AnyTime-yr-dec,
+.AnyTime-pkr .AnyTime-yr-yr
+{
+  float:left;
+  width:2.5em;
+}
+
+.AnyTime-pkr .AnyTime-mil-btn,
+.AnyTime-pkr .AnyTime-cent-btn,
+.AnyTime-pkr .AnyTime-dec-btn,
+.AnyTime-pkr .AnyTime-yr-btn
+{
+  float:left;
+  text-align:center;
+  width:2em;
+}
+
+.AnyTime-pkr .AnyTime-mil0-btn,
+.AnyTime-pkr .AnyTime-mil1-btn, /* etc */
+.AnyTime-pkr .AnyTime-cent0-btn,
+.AnyTime-pkr .AnyTime-cent1-btn, /* etc */
+.AnyTime-pkr .AnyTime-dec0-btn,
+.AnyTime-pkr .AnyTime-dec1-btn, /* etc */
+.AnyTime-pkr .AnyTime-yr0-btn,
+.AnyTime-pkr .AnyTime-yr1-btn /* etc */
+{
+}
+
+/*
+ *  .AnyTime-yr-era contains the column of era-selection pseudo-buttons.
+ *  A width and float:left should be specified.
+ *  Each era button has class .AnyTime-era-btn (with width) as well as
+ *  its own class.
+ */
+
+.AnyTime-pkr .AnyTime-yr-era
+{
+  float:left;
+  padding-left:1em;
+  width:4.1em;
+}
+
+.AnyTime-pkr .AnyTime-era-btn
+{
+  text-align:center;
+  width:3em;
+}
+
+.AnyTime-pkr .AnyTime-bce-btn,
+.AnyTime-pkr .AnyTime-ce-btn
+{
+}
+
+
+/*
+ *  .AnyTime-off-selector is an overlay (popup) for selecting a specific year.
+ *  The picker attempts to size the overlay automatically, based on
+ *  its contents; therefore, do not set width.
+ *  .AnyTime-hdr-off-selector is its title bar. 
+ *  .AnyTime-body-off-selector is its body.
+ *  .AnyTime-off-off is the column of offset-selector pseudo-buttons.
+ *  .AnyTime-off-off-btn is an offset-selector pseudo-button.
+ *  .AnyTime-off-off-last-btn is the last offset-selector pseudo-button.
+ */
+
+.AnyTime-pkr .AnyTime-off-selector
+{
+}
+
+.AnyTime-pkr .AnyTime-hdr-off-selector
+{
+}
+
+.AnyTime-pkr .AnyTime-body-off-selector
+{
+  margin:0.5em;  
+}
+.AnyTime-pkr .AnyTime-off-off
+{
+}
+
+.AnyTime-pkr .AnyTime-off-off-btn
+{
+  clear:left;
+  padding-left:1em;
+  padding-right:1em;
+  text-align:left;
+}
+
+.AnyTime-pkr .AnyTime-off-off-last-btn
+{
+}
+
+/*
+ *  .AnyTime-cur-btn is applied to every pseudo-button that represents
+ *  a currently-selected value.  They should stand out from the other
+ *  buttons, using a different background-color, border, color, font,
+ *  font-style and/or font-weight.  Note that color alone is not
+ *  sufficient for color-blind users to differentiate the buttons.
+ */
+
+.AnyTime-pkr .AnyTime-cur-btn
+{
+  border:1px solid #333334;
+  background-color:#C0C0C1;
+  color:#FCFCFE;
+  font-weight:bold;
+}
+
+/*
+ *  .AnyTime-out-btn is applied to every pseudo-button that represents
+ *  a value that should not be selected because it would make the value.
+ *  out-of-range.  Typically, this is to give it a "grayed-out" appearance.
+ *  Note that color alone is not sufficient for color-blind users to
+ *  differentiate the buttons, but since there's no harm in pressing these
+ *  buttons, it's probably no big deal.  
+ */
+
+.AnyTime-pkr .AnyTime-out-btn
+{
+    background-color:#F0F0F1;
+    border:1px solid #C0C0c1;
+}
+
+/*
+ *  .AnyTime-focus-btn is applied to the single pseudo-button that appears to
+ *  have keyboard focus.  It should stand out from all other buttons,
+ *  using a different background-color, border, color, font, font-style
+ *  and/or font-weight.  Note that color alone is not sufficient for
+ *  color-blind users to differentiate the button.  Because most UIs
+ *  represent focus using a dashed or dotted border, this is recommended.
+ */
+
+.AnyTime-pkr .AnyTime-focus-btn
+{
+  border:1px dashed black;
+}
+
+/*
+ *  END OF FILE
+ */
Index: /ether_2012/web/cathy/css/blueprint-css/.gitignore
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/.gitignore	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/.gitignore	(revision 319)
@@ -0,0 +1,5 @@
+*.swp
+*.svn
+*.DS_Store
+tmp/*
+lib/settings.yml
Index: /ether_2012/web/cathy/css/blueprint-css/AUTHORS.textile
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/AUTHORS.textile	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/AUTHORS.textile	(revision 319)
@@ -0,0 +1,43 @@
+h1. Blueprint CSS Framework Authors and Contributors
+
+Blueprint is based on the work of many talented people. It is
+through their good intentions we are allowed to use many of the
+techniques found in the framework.
+
+h2. Current Team
+
+Blueprint was realized and maintained through version 0.7.1 by
+"Olav Bjorkoy":http://bjorkoy.com who has sinced passed the torch
+to the current team. They are:
+
+Admins:
+* "Christian Montoya":http://christianmontoya.net
+* "Josh Clayton":http://jdclayton.com
+
+Contributors:
+* "Franz Josef Kaiser":http://github.com/franz-josef-kaiser
+* "Glenn Rempe":http://www.rempe.us/
+* "Chris Eppstein":http://chriseppstein.github.com/
+* "Sean K. Stewart":http://seankstewart.com/
+
+h2. Original CSS authors
+
+The first iteration of Blueprint was built upon many conventions
+and ideas that were developed by true CSS experts.
+
+The grid and typography is based on work by:
+* "Jeff Croft":http://jeffcroft.com
+* "Nathan Borror":http://nathanborror.com/
+* "Christian Metts":http://mintchaos.com
+* "Wilson Miner":http://www.wilsonminer.com
+
+The CSS reset is based on work by:
+* "Eric Meyer":http://www.meyerweb.com/eric
+
+The Fancy Type plugin is based on work by:
+* "Mark Boulton":http://www.markboulton.co.uk
+* "Typogrify":http://typogrify.googlecode.com
+
+(However, remember that these people are not involved with the
+framework, so please don't waste their time or yours by asking 
+them for support.)
Index: /ether_2012/web/cathy/css/blueprint-css/CHANGELOG
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/CHANGELOG	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/CHANGELOG	(revision 319)
@@ -0,0 +1,168 @@
+Blueprint CSS Framework Change Log
+----------------------------------------------------------------
+
+Version 1.0 - Date September 29, 2010
+--
+  New features:
+    * Added detailed explanations to core uncompressed CSS files [CMM]
+    * Added .info and .alert classes to forms.css [CMM]
+    * Fixed numerous bugs in forms, including the fieldset padding bug in IE6-8 [CMM]
+    * Fixed specificity problems in typography.css and grid.css [CMM]
+    * See Lighthouse for more bug fixes 
+
+Version 0.9 - Date May 29, 2009
+--
+  New features:
+    * Changed all conditional comments to [if lt IE 8] for IE 8 compatibility [CMM]
+    * Updated forms code to align inline form elements, with additions for IE 6 [CMM]
+      * Use <form class="inline"> for inline forms
+      * Use classes "text", "button", "radio" and "checkbox" on inputs for IE 6 compatibility
+
+
+Version 0.8 - Date November 11, 2008
+--
+  New features:
+    * Much of the flexibility of 0.6 has been pushed back into the core [CMM]
+    * Plugins from 0.6 are now back in the core [CMM]
+
+  Bug fixes:
+    * Lots. See http://blueprintcss.lighthouseapp.com/projects/15318-blueprint-css
+
+
+Version 0.7.1 - Date February 21, 2008
+--
+  New features:
+    * Rubydoc for compressor [JC]
+
+  Bug fixes:
+    * Fixed bug in the compressor related to Rubygems. [JC]
+    * <tt> should be inline, not block. [OFB]
+
+
+Version 0.7 - February 19, 2008
+--
+  New features:
+    * New directory structure. [OFB]
+    * New compressor script. [JC]
+      * Ability to set custom namespace for BP classes. [JC]
+      * Optional custom column count and widths. [JC]
+      * Ability to add your own CSS files. [JC]
+      * Custom output paths. [JC]
+      * Support for multiple projects. [JC]
+      * Semantic class naming from CSS rules. [JC]
+      * Automatic compression for plugins. [JC]
+    * Compressed version of ie.css. [OFB]
+    * Alternating table row colors. [OFB]
+    * Added class .showgrid to see the grid of any column or container. [OFB]
+    * No need for .column! You now have to use divs for columns,
+      but you can still use span/prepend/append for other elements as well.
+      In other words, div.span-x now implies that the element is a .column. [OFB]
+
+  Bug fixes:
+    * Sidebar alignment in tests/sample.html. [OFB]
+    * Line-height on sub/sup. [OFB]
+    * Clearfix not properly applied to container. [OFB]
+    * Misc validation errors in tests. [OFB]
+    * Proper margin on address. [OFB]
+    * Unwanted bottom margin on nested lists. [OFB]
+    * Form labels with unwanted fancy-type indentation. [OFB]
+    * Proper margin on all form elements. [OFB]
+    * No margins for images in headings. [OFB]
+    * Push-x bottom margin. [OFB]
+    * Vertical align set to middle on tables. [OFB]
+    * Improved .notice, .error and .success color contrast. [OFB]
+    * Size of input[text]. [OFB]
+    * Baseline alignment of <h4>. [OFB]
+
+  Misc:
+    * Improved structure in print.css. [OFB]
+    * Dual-licensed under MIT and GPL licenses. [OFB]
+    * Changed name of .clear to .clearfix, and added .clear (clear:both;). [OFB]
+
+
+Version 0.6 - September 21, 2007
+--
+  * Created a new plugin, "iepngfix", that adds support for PNG transparency in IE5.5+ [OFB]
+  * Added an IE stylesheet, updated the test files and the readme accordingly [OFB]
+  * Re-added improved support for em units [OFB]
+  * Lots of minor changes to typography.css and reset.css, provided by Christian Montoya [OFB]
+  * Extracted the fancy typography section in typography.css to a new plugin [OFB]
+  * Extracted the support for CSS buttons into a new plugin. [OFB]
+  * Added new plugin structure. [OFB]
+  * Changed some default fonts so that BP works better with ClearType in XP [OFB]
+  * Re-added the hack for clearing floats without extra markup. [OFB]
+  * Added Changelog.txt to track changes in each release. [GR]
+  * Cleaned up and rationalized SVN dir structure. [GR, OFB]
+  * print.css : removed reference to 'baseline.png' as it no longer exists. [GR]
+  * grid.css : removed reference to '.first' css class as it no longer exists. [GR]
+  * Added append-13 to append-23 and prepend-13 to prepend-23 to allow pushing elements
+    to both extreme sides of the grid. Added test cases to tests/grid.css [GR]
+  * Moved test sample files to blueprint/tests sub-directory so tests stay with the code. [GR]
+  * Consolidated all references to release version number to screen.css [OFB]
+  * Added ruby script (generate_compressed_css.rb) to scripts dir, and 'csstidy' binary (OS X Universal)
+    for generating tidied version of Blueprint (lib/compressed.css).
+  * Consolidated test pages into one single page (test.html).  Uses compressed stylesheet by default.  This ensures test of
+    the chain of generation.  (todo) Intention is to delete other test files if single file works well. (todo) ensure singular
+    test file contains latest changes to other test files.   [GR]
+  * Moved the blueprint framework to its own folder in the package, so that the tests, script,
+    license and readme don't clutter up our BP folder. [OFB]
+  * Re-saved grid.png with Photoshop to remove Fireworks data which was bloating it.
+    Now its about 3KB instead of 40+KB. Resolves Issue 22. [GR]
+  * Moved compressed files to new compressed dir [OFB]
+  * print.css is now also being generated by the compressor ruby script and is available for use.
+  * Added new script 'validate_css.rb' which will validate all css files and present a report with
+    a local java binary of the W3C validator.
+  * Created an experimental CSS classes plugin, by popular demand. [OFB]
+  * Improved handling of multi-line headings. [OFB]
+  * Improved styling of <table>s, you may now use .span classes on <th>s to create tables that follow the grid. [OFB]
+  * Added support for indented paragraphs to the Fancy-type plugin. [OFB]
+  * Added a new plugin: link-icons. [OFB]
+  * Seperated the plugins tests into their own file. [OFB]
+  * Re-structured some of the tests.html sections. [OFB]
+  * Added class ".colborder" to grid.css. [OFB]
+  * Added .error, .notice and .success classes to typography.css. [OFB]
+  * Added tests for more elements which gets reset in reset.css [OFB, GR]
+  * Added forms.css, awaiting implementation. Moved form styling from typography.css [OFB]
+  * Updated compressor script to include forms.css [OFB]
+  * Improved forms.html tests for upcoming forms.css implementation. This will change based on the
+    markup that forms.css will use. [OFB]
+  * Fixed clearing image in button element bug in buttons.css [OFB]
+  * Fixed bug where IE6 clips pushed/pulled elements. [OFB]
+  * Fixed typo in grid.css formula. [OFB]
+  * Fixed varying formatting across core files. [OFB]
+  * Fixed legend element in IE6. [OFB]
+  * Fixed indentation in test files. [OFB]
+  * Removed tests for plugins not bundled with the next release. [OFB]
+  * Improved styling of <h3>. [OFB]
+  * Fixed indentation bug in ul/ol, removed some redundant styling. [OFB]
+  * Fixed validation errors in tests. [OFB]
+  * Changed IE stylesheet condition comment to include all versions of IE. [OFB]
+  * Started on a new approach for the PNG plugin. Will not be included in this release. [OFB]
+  * Fixed incorrect rendering of ol in IE6/7. [OFB]
+  * Created a new, spiffier sample page. [OFB]
+
+
+Version 0.5 - August 28, 2007
+--
+  * Changed grid width from 14 to 24 columns [OFB]
+  * Removed 'first' CSS class and the need to apply it to the first column in a row of columns. [OFB]
+  * Reverted to using pixels instead of em units to specify vertical spacing due to baseline issues with
+    all browsers except Firefox. [OFB]
+  * New set of default fonts. (Experimental) [OFB]
+  * Added test files [OFB]
+
+
+Version 0.4 - August 11, 2007
+--
+  * All font sizes and vertical margins are now elastic, through the use of em units.
+    Resizing works great in every tested browser. [OFB]
+  * Comes with a new, compressed version of BP, which reduces the size of the core files by 60 percent. [OFB]
+  * Support for incremental leading, contributed by Mark Boulton. [OFB]
+  * Adds perfected CSS buttons, by Kevin Hale of Particletree fame. [OFB]
+  * Fixes all known IE bugs. [OFB]
+  * Loads of minor fixes and additions. [OFB]
+
+
+Version 0.3 - March 8, 2007
+--
+  * Initial release of Blueprint (versions 0.1 and 0.2 were internal only).
Index: /ether_2012/web/cathy/css/blueprint-css/LICENSE
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/LICENSE	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/LICENSE	(revision 319)
@@ -0,0 +1,22 @@
+Copyright (c) 2007 - 2010 blueprintcss.org
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
Index: /ether_2012/web/cathy/css/blueprint-css/README.textile
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/README.textile	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/README.textile	(revision 319)
@@ -0,0 +1,83 @@
+h1. Blueprint CSS Framework Readme
+
+Welcome to Blueprint! This is a CSS framework designed to cut down on your CSS development time. It gives you a solid foundation to build your own CSS on. Here are some of the features BP provides out-of-the-box:
+
+* An easily customizable grid
+* Sensible default typography
+* A typographic baseline
+* Perfected browser CSS reset
+* A stylesheet for printing
+* Powerful scripts for customization
+* Absolutely no bloat!
+
+h2. Project Info
+
+* *Web*: "http://blueprintcss.org":http://blueprintcss.org
+* *Source*: "http://github.com/joshuaclayton/blueprint-css":http://github.com/joshuaclayton/blueprint-css
+* *Wiki*: "http://github.com/joshuaclayton/blueprint-css/wikis/home":http://github.com/joshuaclayton/blueprint-css/wikis/home
+* *Bug/Feature Tracking*: "http://blueprintcss.lighthouseapp.com":http://blueprintcss.lighthouseapp.com
+
+h2. Setup Instructions
+
+Here's how you set up Blueprint on your site.
+
+# Upload the "blueprint" folder in this folder to your server, and place it in whatever folder you'd like. A good choice would be your CSS folder.
+# Add the following three lines to every @<head/>@ of your site. Make sure the three @href@ paths are correct (here, BP is in my CSS folder): <pre><code>
+<link rel="stylesheet" href="css/blueprint/screen.css" type="text/css" media="screen, projection">
+<link rel="stylesheet" href="css/blueprint/print.css" type="text/css" media="print">
+<!--[if lt IE 8]>
+  <link rel="stylesheet" href="css/blueprint/ie.css" type="text/css" media="screen, projection">
+<![endif]--></code></pre>
+Remember to include trailing slashes (" />") in these lines if you're using XHTML.
+# For development, add the .showgrid class to any container or column to see the underlying grid. Check out the @plugins@ directory for more advanced functionality.
+
+
+h2. Tutorials
+
+* "How to customize BP with the compressor script":http://jdclayton.com/blueprints_compress_a_walkthrough.html
+* "How to use a grid in a layout":http://subtraction.com/2007/03/18/oh-yeeaahh
+* "How to use a baseline in your typography":http://alistapart.com/articles/settingtypeontheweb
+
+h2. Files in Blueprint
+
+The framework has a few files you should check out. Every file in the @src@ directory contains lots of (hopefully) clarifying comments.
+
+Compressed files (these go in the HTML):
+
+* @blueprint/screen.css@
+* @blueprint/print.css@
+* @blueprint/ie.css@
+
+Source files:
+* @blueprint/src/reset.css@<br/>
+This file resets CSS values that browsers tend to set for you.
+* @blueprint/src/grid.css@<br/>
+This file sets up the grid (it's true). It has a lot of classes you apply to @<div/>@ elements to set up any sort of column-based grid.
+* @blueprint/lib/blueprint/grid.css.erb@<br/>
+This file is used by the compressor (see below) when generating grids. All changes to grid.css are mirrored in this file, manually. 
+* @blueprint/src/typography.css@<br/>
+This file sets some default typography. It also has a few methods for some really fancy stuff to do with your text.
+* @blueprint/src/forms.css@<br/>
+Includes some minimal styling of forms.
+* @blueprint/src/print.css@<br/>
+This file sets some default print rules, so that printed versions of your site looks better than they usually would. It should be included on every page.
+* @blueprint/src/ie.css@<br/>
+Includes every hack for our beloved IE6 and 7.
+
+Scripts:
+* @lib/compress.rb@<br/>
+A Ruby script for compressing and customizing your CSS. Set a custom namespace, column count, widths, output paths, multiple projects, and semantic class names. See commenting in @compress.rb@ or run @$ruby compress.rb -h@ for more information.
+* @lib/validate.rb@<br/>
+Validates the Blueprint core files with the W3C CSS validator.
+
+Other:
+* @blueprint/plugins/@<br/>
+Contains additional functionality in the form of simple plugins for Blueprint. See individual readme files in the directory of each plugin for further instructions.
+* @tests/@<br/>
+Contains html files which tests most aspects of Blueprint. Open @tests/index.html@ for further instructions.
+
+h2. Extra Information
+
+* For credits and origins, see AUTHORS.
+* For license instructions, see LICENSE.
+* For the latest updates, see CHANGELOG.
Index: /ether_2012/web/cathy/css/blueprint-css/TUTORIAL.textile
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/TUTORIAL.textile	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/TUTORIAL.textile	(revision 319)
@@ -0,0 +1,206 @@
+h1. Blueprint CSS Framework Tutorial
+
+Welcome to this tutorial on Blueprint. It will give you a thorough intro to what you can do with the framework, and a few notes on what you shouldn't do with it. Let's get started.
+
+h2. About Blueprint
+  
+Blueprint is a CSS framework, designed to cut down on your development time. It gives you a solid foundation to build your CSS on top of, including some sensible default typography, a customizable grid, a print stylesheet and much more.
+
+However, BP is not a silver bullet, and it's best suited for websites where each page may require its own design. Take a look at existing BP pages before deciding if the framework is right for you. You may also check out the test files in the @tests@ directory, which demonstrates most of the features in Blueprint.
+
+The word "framework" may be a bit misleading in this context, since BP does not make suggestions on how you should organize or write your CSS. It's more like a "css toolbox" with helpful bits and pieces, from which you may pick and choose based on your needs. 
+
+h2. Structural Overview
+		
+From the bottom up, here are the CSS layers in Blueprint:
+
+#	*CSS reset*: Removes any default CSS rules set by each browser.
+#	*Typography*: Gives you some nice default typography and colors.
+#	*Grid*: Provides a set of CSS classes for making grid layouts.
+
+The second part of Blueprint are the scripts, which let you customize most
+aspects of the framework, from column count and widths, to output paths and
+CSS class namespaces. We have two scripts:
+
+# *Compressor*: For compressing and customizing the source files.
+# *Validator*: 	For validating the Blueprint core files.
+
+That's the quick overview, so now we can finally get into the details. First, we'll take 
+a look at the CSS in Blueprint. We'll then move on to the scripts, where I'll show you 
+how to customize the framework.
+
+h2. Setting Up Blueprint
+
+To use Blueprint, you must include three files in your HTML:
+
+* @blueprint/screen.css@:	All CSS for screen, projection viewing.
+* @blueprint/print.css@: A basic stylesheet for printing.
+* @blueprint/ie.css@:	A few needed corrections for Internet Explorer
+
+To include them, use the following HTML (make sure the href paths are correct):
+<pre><code>
+  <link rel="stylesheet" href="css/blueprint/screen.css" type="text/css" media="screen, projection">
+  <link rel="stylesheet" href="css/blueprint/print.css" type="text/css" media="print"> 
+  <!--[if lt IE 8]>
+    <link rel="stylesheet" href="css/blueprint/ie.css" type="text/css" media="screen, projection">
+  <![endif]-->
+</code></pre>
+Remember to add trailing slashes if you're using XHTML (" />"). 
+
+h2. Using the CSS in Blueprint
+
+As mentioned before, there's basically three layers of CSS in Blueprint. The first two layers, the browser CSS reset and the default typography, apply themselves by changing the CSS of standard HTML elements. In other words, you don't need to change anything in these files. If you, for instance, want to change the font size, do this in your own stylesheet, so that it's easy to upgrade Blueprint when new versions arrive.
+
+h3. Classes for Typography
+	
+While the typography of Blueprint mainly applies itself, there's a few classes
+provided. Here's a list of their names and what they do:
+
+<dl>
+  <dt>@.small@</dt><dd>Makes the text of this element smaller.</dd>
+  <dt>@.large@</dt><dd>Makes the text of this element larger.</dd>
+  <dt>@.hide@</dt><dd>Hides an element.</dd>
+  <dt>@.quiet@</dt><dd>Tones down the font color for this element.</dd>
+  <dt>@.loud@</dt><dd>Makes this elements text black.</dd>
+  <dt>@.highlight@</dt><dd>Adds a yellow background to the text.</dd>
+  <dt>@.added@</dt><dd>Adds green background to the text.</dd>
+  <dt>@.removed@</dt><dd>Adds red background to the text.</dd>
+  <dt>@.first@</dt><dd>Removes any left sided margin/padding from the element.</dd>
+  <dt>@.last@</dt><dd>Removes any right sided margin/padding from the element.</dd>
+  <dt>@.top@</dt><dd>Removes any top margin/padding from the element.</dd>
+  <dt>@.bottom@</dt><dd>Removes any bottom margin/padding from the element.</dd>
+</dl>
+
+h3. Styling Forms
+				
+To make Blueprint style your input elements, each text input element should
+have the class @.text@, or @.title@, where @.text@ is the normal size,
+and @.title@ gives you an input field with larger text.
+
+There's also a few classes you may use for success and error messages:
+
+<dl>
+	<dt>@div.error@</dt><dd>Creates an error box (red).</dd>
+	<dt>@div.notice@</dt><dd>Creates a box for notices (yellow).</dd>
+	<dt>@div.success@</dt><dd>Creates a box for success messages (green).</dd>
+</dl>				
+
+h3. Creating a Grid
+
+The third layer is the grid CSS classes, which is the tool Blueprint gives you to create almost any kind of grid layout for your site. Keep in mind that most of the CSS behind the grid can be customized (explained below). In this section however, I'm using the default settings.
+
+The default grid is made up of 24 columns, each spanning 30px, with a 10px margin between each column. The total width comes to 950px, which is a good width for 1024x768 resolution displays. If you're interested in a narrower design, see the section on customizing the grid, below.
+
+So how do you set up a grid? By using classes provided by Blueprint. To create a column, make a new @<div/>@, and apply one of the @.span-x@ classes to it. For instance, if you want a 3-column setup, with two narrow and one wide column, a header and a footer here's how you do it:
+
+<pre>			
+  <div class="container">
+  	<div class="span-24">
+  		The header
+  	</div>
+
+  	<div class="span-4">
+  		The first column
+  	</div>
+  	<div class="span-16">
+  		The center column
+  	</div>
+  	<div class="span-4 last">
+  		The last column
+  	</div>
+	
+  	<div class="span-24">
+  		The footer
+  	</div>
+  </div>
+</pre>
+  			
+In addition to the spans, there are two important classes you need to know about. First of all, every Blueprint site needs to be wrapped in a div with the class @.container@, which is usually placed right after the body tag. 
+
+Second, the last column in a row (which by default has 24 columns), needs the class @.last@ to remove its left hand margin. Note, however, that each @.span-24@ don't need the @.last@ class, since these always span the entire width of the page.
+
+To create basic grids, this is all you need to know. The grid CSS however, provides many more classes for more intricate designs. To see some of them in action, check out the files in @tests/parts/@. These files demonstrate what's possible with the grid in Blueprint.
+
+Here's a quick overview of the other classes you can use in to make your grid:
+
+<dl>
+  <dt>@.append-x@</dt><dd>Appends x number of empty columns after a column.</dd>
+  <dt>@.prepend-x@</dt><dd>Preppends x number of empty columns before a column.</dd>
+  <dt>@.push-x@</dt><dd>Pushes a column x columns to the left. Can be used to swap columns.</dd>
+  <dt>@.pull-x@</dt><dd>Pulls a column x columns to the right. Can be used to swap columns.</dd>
+  <dt>@.border@</dt><dd>Applies a border to the right side of the column.</dd>
+  <dt>@.colborder@</dt><dd>Appends one empty column, with a border down the middle.</dd>
+  <dt>@.clear@</dt><dd>Makes a column drop below a row, regardless of space.</dd>
+	<dt>@.showgrid@</dt><dd>Add to container or column to see the grid and baseline.</dd>
+</dl>
+
+In this list, @x@ is a number from 1 through 23 for append/prepend and 1 through 24 for push/pull. These numbers will of course change if you set a new number of columns in the settings file. 
+
+Here's another example where we have four columns of equal width, with a border between the two first and the two last columns, as well as a four column gap in the middle:
+
+<pre>				
+	<div class="container">
+		<div class="span-5 border">
+			The first column
+		</div>
+		<div class="span-5 append-4">
+			The second column
+		</div>
+		<div class="span-5 border">
+			The third column
+		</div>
+		<div class="span-5 last">
+			The fourth (last) column
+		</div>
+	</div>
+</pre>				
+
+You may also nest columns to achieve the desired layout. Here's a setup where we want four rectangles with two on top and two below on the first half of the page, and one single column spanning the second half of the page:
+
+<pre>				
+	<div class="container">
+		<div class="span-12">
+			<div class="span-6">
+				Top left
+			</div>
+			<div class="span-6 last">
+				Top right
+			</div>
+			<div class="span-6">
+				Bottom left
+			</div>
+			<div class="span-6 last">
+				Bottom right
+			</div>
+		</div>
+		<div class="span-12 last">
+			Second half of page
+		</div>
+	</div>
+</pre>
+
+Try this code in your browser it it's difficult to understand what it would look like. To see more examples on how to use these classes, check out @/tests/parts/grid.html@.
+
+h2. The Scripts
+	
+Blueprint comes with two scripts: one for compressing and customizing the CSS, and one for validating the core CSS files, which is handy if you're making changes to these files.
+
+h3. The Validator
+				
+The validator has a fairly simple job - validate the CSS in the core BP files.  The script uses a bundled version of the W3C CSS validator to accomplish this.  To run it, you'll need to have Ruby installed on your machine. You can then run the script like so: @$ ruby validate.rb@.
+
+Note that there are a few validation errors shipping with Blueprint. These are known, and comes from a few CSS hacks needed to ensure consistent rendering across the vast browser field.
+		
+h3. The Compressor
+		
+As the files you'll include in your HTML are the compressed versions of the core CSS files, you'll have to recompress the core if you've made any changes.  This is what the compressor script is for.
+
+In addition this is where you customize the grid. To customize the grid, a special settings file is used, and the new CSS is generated once you run the compressor. The new compressed files will then reflect your settings file.
+
+To recompress, you just have to run the script. This will parse the core CSS files and output new compressed files in the blueprint folder. As with the validator, Ruby has to be installed to use this script. In the @lib@ directory, run: @$ruby compress.rb@
+
+Calling this file by itself will pull files from @blueprint/src@ and concatenate them into three files; @ie.css@, @print.css@, and @screen.css@. However, argument variables can be set to change how this works. Calling @$ruby compress.rb -h@ will reveal basic arguments you can pass to the script.
+		
+h3. Custom Settings
+
+To learn how to use custom settings, read through the documentation within @lib/compress.rb@
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/ie.css
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/ie.css	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/ie.css	(revision 319)
@@ -0,0 +1,36 @@
+/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0
+ http://blueprintcss.org
+
+   * Copyright (c) 2007-Present. See LICENSE for more info.
+   * See README for instructions on how to use Blueprint.
+   * For credits and origins, see AUTHORS.
+   * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */
+
+/* ie.css */
+body {text-align:center;}
+.container {text-align:left;}
+* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 {display:inline;overflow-x:hidden;}
+* html legend {margin:0px -8px 16px 0;padding:0;}
+sup {vertical-align:text-top;}
+sub {vertical-align:text-bottom;}
+html>body p code {*white-space:normal;}
+hr {margin:-8px auto 11px;}
+img {-ms-interpolation-mode:bicubic;}
+.clearfix, .container {display:inline-block;}
+* html .clearfix, * html .container {height:1%;}
+fieldset {padding-top:0;}
+legend {margin-top:-0.2em;margin-bottom:1em;margin-left:-0.5em;}
+textarea {overflow:auto;}
+label {vertical-align:middle;position:relative;top:-0.25em;}
+input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;}
+input.text:focus, input.title:focus {border-color:#666;}
+input.text, input.title, textarea, select {margin:0.5em 0;}
+input.checkbox, input.radio {position:relative;top:.25em;}
+form.inline div, form.inline p {vertical-align:middle;}
+form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;}
+button, input.button {position:relative;top:0.25em;}
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/buttons/readme.txt
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/buttons/readme.txt	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/buttons/readme.txt	(revision 319)
@@ -0,0 +1,32 @@
+Buttons
+
+* Gives you great looking CSS buttons, for both <a> and <button>.
+* Demo: particletree.com/features/rediscovering-the-button-element
+
+
+Credits
+----------------------------------------------------------------
+
+* Created by Kevin Hale [particletree.com]
+* Adapted for Blueprint by Olav Bjorkoy [bjorkoy.com]
+
+
+Usage
+----------------------------------------------------------------
+
+1) Add this plugin to lib/settings.yml.
+   See compress.rb for instructions.
+
+2) Use the following HTML code to place the buttons on your site:
+
+  <button type="submit" class="button positive">
+    <img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/> Save
+  </button>
+
+  <a class="button" href="/password/reset/">
+    <img src="css/blueprint/plugins/buttons/icons/key.png" alt=""/> Change Password
+  </a>
+
+  <a href="#" class="button negative">
+    <img src="css/blueprint/plugins/buttons/icons/cross.png" alt=""/> Cancel
+  </a>
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/buttons/screen.css
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/buttons/screen.css	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/buttons/screen.css	(revision 319)
@@ -0,0 +1,97 @@
+/* -------------------------------------------------------------- 
+  
+   buttons.css
+   * Gives you some great CSS-only buttons.
+   
+   Created by Kevin Hale [particletree.com]
+   * particletree.com/features/rediscovering-the-button-element
+
+   See Readme.txt in this folder for instructions.
+
+-------------------------------------------------------------- */
+
+a.button, button {
+  display:block;
+  float:left;
+  margin: 0.7em 0.5em 0.7em 0;
+  padding:5px 10px 5px 7px;   /* Links */
+  
+  border:1px solid #dedede;
+  border-top:1px solid #eee;
+  border-left:1px solid #eee;
+
+  background-color:#f5f5f5;
+  font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;
+  font-size:100%;
+  line-height:130%;
+  text-decoration:none;
+  font-weight:bold;
+  color:#565656;
+  cursor:pointer;
+}
+button {
+  width:auto;
+  overflow:visible;
+  padding:4px 10px 3px 7px;   /* IE6 */
+}
+button[type] {
+  padding:4px 10px 4px 7px;   /* Firefox */
+  line-height:17px;           /* Safari */
+}
+*:first-child+html button[type] {
+  padding:4px 10px 3px 7px;   /* IE7 */
+}
+button img, a.button img{
+  margin:0 3px -3px 0 !important;
+  padding:0;
+  border:none;
+  width:16px;
+  height:16px;
+  float:none;
+}
+
+
+/* Button colors
+-------------------------------------------------------------- */
+
+/* Standard */
+button:hover, a.button:hover{
+  background-color:#dff4ff;
+  border:1px solid #c2e1ef;
+  color:#336699;
+}
+a.button:active{
+  background-color:#6299c5;
+  border:1px solid #6299c5;
+  color:#fff;
+}
+
+/* Positive */
+body .positive {
+  color:#529214;
+}
+a.positive:hover, button.positive:hover {
+  background-color:#E6EFC2;
+  border:1px solid #C6D880;
+  color:#529214;
+}
+a.positive:active {
+  background-color:#529214;
+  border:1px solid #529214;
+  color:#fff;
+}
+
+/* Negative */
+body .negative {
+  color:#d12f19;
+}
+a.negative:hover, button.negative:hover {
+  background-color:#fbe3e4;
+  border:1px solid #fbc2c4;
+  color:#d12f19;
+}
+a.negative:active {
+  background-color:#d12f19;
+  border:1px solid #d12f19;
+  color:#fff;
+}
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/fancy-type/readme.txt
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/fancy-type/readme.txt	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/fancy-type/readme.txt	(revision 319)
@@ -0,0 +1,14 @@
+Fancy Type
+
+* Gives you classes to use if you'd like some 
+  extra fancy typography. 
+
+Credits and instructions are specified above each class
+in the fancy-type.css file in this directory.
+
+
+Usage
+----------------------------------------------------------------
+
+1) Add this plugin to lib/settings.yml.
+   See compress.rb for instructions.
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/fancy-type/screen.css
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/fancy-type/screen.css	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/fancy-type/screen.css	(revision 319)
@@ -0,0 +1,71 @@
+/* --------------------------------------------------------------
+
+   fancy-type.css
+   * Lots of pretty advanced classes for manipulating text.
+
+   See the Readme file in this folder for additional instructions.
+
+-------------------------------------------------------------- */
+
+/* Indentation instead of line shifts for sibling paragraphs. */
+   p + p { text-indent:2em; margin-top:-1.5em; }
+   form p + p  { text-indent: 0; } /* Don't want this in forms. */
+
+
+/* For great looking type, use this code instead of asdf:
+   <span class="alt">asdf</span>
+   Best used on prepositions and ampersands. */
+
+.alt {
+  color: #666;
+  font-family: "Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif;
+  font-style: italic;
+  font-weight: normal;
+}
+
+
+/* For great looking quote marks in titles, replace "asdf" with:
+   <span class="dquo">&#8220;</span>asdf&#8221;
+   (That is, when the title starts with a quote mark).
+   (You may have to change this value depending on your font size). */
+
+.dquo { margin-left: -.5em; }
+
+
+/* Reduced size type with incremental leading
+   (http://www.markboulton.co.uk/journal/comments/incremental_leading/)
+
+   This could be used for side notes. For smaller type, you don't necessarily want to
+   follow the 1.5x vertical rhythm -- the line-height is too much.
+
+   Using this class, it reduces your font size and line-height so that for
+   every four lines of normal sized type, there is five lines of the sidenote. eg:
+
+   New type size in em's:
+     10px (wanted side note size) / 12px (existing base size) = 0.8333 (new type size in ems)
+
+   New line-height value:
+     12px x 1.5 = 18px (old line-height)
+     18px x 4 = 72px
+     72px / 5 = 14.4px (new line height)
+     14.4px / 10px = 1.44 (new line height in em's) */
+
+p.incr, .incr p {
+  font-size: 10px;
+  line-height: 1.44em;
+  margin-bottom: 1.5em;
+}
+
+
+/* Surround uppercase words and abbreviations with this class.
+   Based on work by JÃžrgen Arnor GÃ¥rdsÃž Lom [http://twistedintellect.com/] */
+
+.caps {
+  font-variant: small-caps;
+  letter-spacing: 1px;
+  text-transform: lowercase;
+  font-size:1.2em;
+  line-height:1%;
+  font-weight:bold;
+  padding:0 2px;
+}
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/readme.txt
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/readme.txt	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/readme.txt	(revision 319)
@@ -0,0 +1,18 @@
+Link Icons
+* Icons for links based on protocol or file type.
+
+This is not supported in IE versions < 7.
+
+
+Credits
+----------------------------------------------------------------
+
+* Marc Morgan
+* Olav Bjorkoy  [bjorkoy.com]
+
+
+Usage
+----------------------------------------------------------------
+
+1) Add this line to your HTML:
+  <link rel="stylesheet" href="css/blueprint/plugins/link-icons/screen.css" type="text/css" media="screen, projection">
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/screen.css
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/screen.css	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/link-icons/screen.css	(revision 319)
@@ -0,0 +1,40 @@
+/* --------------------------------------------------------------
+
+   link-icons.css
+   * Icons for links based on protocol or file type.
+
+   See the Readme file in this folder for additional instructions.
+
+-------------------------------------------------------------- */
+
+/* Use this class if a link gets an icon when it shouldn't. */
+body a.noicon {
+  background:transparent none !important;
+  padding:0 !important;
+  margin:0 !important;
+}
+
+/* Make sure the icons are not cut */
+a[href^="http:"], a[href^="mailto:"], a[href^="http:"]:visited,
+a[href$=".pdf"], a[href$=".doc"], a[href$=".xls"], a[href$=".rss"],
+a[href$=".rdf"], a[href^="aim:"] {
+  padding:2px 22px 2px 0;
+  margin:-2px 0;
+  background-repeat: no-repeat;
+  background-position: right center;
+}
+
+/* External links */
+a[href^="http:"]          { background-image: url(icons/external.png); }
+a[href^="mailto:"]        { background-image: url(icons/email.png); }
+a[href^="http:"]:visited  { background-image: url(icons/visited.png); }
+
+/* Files */
+a[href$=".pdf"]   { background-image: url(icons/pdf.png); }
+a[href$=".doc"]   { background-image: url(icons/doc.png); }
+a[href$=".xls"]   { background-image: url(icons/xls.png); }
+
+/* Misc */
+a[href$=".rss"],
+a[href$=".rdf"]   { background-image: url(icons/feed.png); }
+a[href^="aim:"]   { background-image: url(icons/im.png); }
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/rtl/readme.txt
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/rtl/readme.txt	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/rtl/readme.txt	(revision 319)
@@ -0,0 +1,10 @@
+RTL
+* Mirrors Blueprint, so it can be used with Right-to-Left languages.
+
+By Ran Yaniv Hartstein, ranh.co.il
+
+Usage
+----------------------------------------------------------------
+
+1) Add this line to your HTML:
+   <link rel="stylesheet" href="css/blueprint/plugins/rtl/screen.css" type="text/css" media="screen, projection">
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/rtl/screen.css
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/rtl/screen.css	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/plugins/rtl/screen.css	(revision 319)
@@ -0,0 +1,110 @@
+/* --------------------------------------------------------------
+
+   rtl.css
+   * Mirrors Blueprint for left-to-right languages
+
+   By Ran Yaniv Hartstein [ranh.co.il]
+
+-------------------------------------------------------------- */
+
+body .container { direction: rtl; }
+body .column, body .span-1, body .span-2, body .span-3, body .span-4, body .span-5, body .span-6, body .span-7, body .span-8, body .span-9, body .span-10, body .span-11, body .span-12, body .span-13, body .span-14, body .span-15, body .span-16, body .span-17, body .span-18, body .span-19, body .span-20, body .span-21, body .span-22, body .span-23, body .span-24 {
+  float: right;
+  margin-right: 0;
+  margin-left: 10px;
+  text-align:right;
+}
+
+body div.last { margin-left: 0; }
+body table .last { padding-left: 0; }
+
+body .append-1   { padding-right: 0; padding-left: 40px; }
+body .append-2   { padding-right: 0; padding-left: 80px; }
+body .append-3   { padding-right: 0; padding-left: 120px; }
+body .append-4   { padding-right: 0; padding-left: 160px; }
+body .append-5   { padding-right: 0; padding-left: 200px; }
+body .append-6   { padding-right: 0; padding-left: 240px; }
+body .append-7   { padding-right: 0; padding-left: 280px; }
+body .append-8   { padding-right: 0; padding-left: 320px; }
+body .append-9   { padding-right: 0; padding-left: 360px; }
+body .append-10  { padding-right: 0; padding-left: 400px; }
+body .append-11  { padding-right: 0; padding-left: 440px; }
+body .append-12  { padding-right: 0; padding-left: 480px; }
+body .append-13  { padding-right: 0; padding-left: 520px; }
+body .append-14  { padding-right: 0; padding-left: 560px; }
+body .append-15  { padding-right: 0; padding-left: 600px; }
+body .append-16  { padding-right: 0; padding-left: 640px; }
+body .append-17  { padding-right: 0; padding-left: 680px; }
+body .append-18  { padding-right: 0; padding-left: 720px; }
+body .append-19  { padding-right: 0; padding-left: 760px; }
+body .append-20  { padding-right: 0; padding-left: 800px; }
+body .append-21  { padding-right: 0; padding-left: 840px; }
+body .append-22  { padding-right: 0; padding-left: 880px; }
+body .append-23  { padding-right: 0; padding-left: 920px; }
+
+body .prepend-1   { padding-left: 0; padding-right: 40px; }
+body .prepend-2   { padding-left: 0; padding-right: 80px; }
+body .prepend-3   { padding-left: 0; padding-right: 120px; }
+body .prepend-4   { padding-left: 0; padding-right: 160px; }
+body .prepend-5   { padding-left: 0; padding-right: 200px; }
+body .prepend-6   { padding-left: 0; padding-right: 240px; }
+body .prepend-7   { padding-left: 0; padding-right: 280px; }
+body .prepend-8   { padding-left: 0; padding-right: 320px; }
+body .prepend-9   { padding-left: 0; padding-right: 360px; }
+body .prepend-10  { padding-left: 0; padding-right: 400px; }
+body .prepend-11  { padding-left: 0; padding-right: 440px; }
+body .prepend-12  { padding-left: 0; padding-right: 480px; }
+body .prepend-13  { padding-left: 0; padding-right: 520px; }
+body .prepend-14  { padding-left: 0; padding-right: 560px; }
+body .prepend-15  { padding-left: 0; padding-right: 600px; }
+body .prepend-16  { padding-left: 0; padding-right: 640px; }
+body .prepend-17  { padding-left: 0; padding-right: 680px; }
+body .prepend-18  { padding-left: 0; padding-right: 720px; }
+body .prepend-19  { padding-left: 0; padding-right: 760px; }
+body .prepend-20  { padding-left: 0; padding-right: 800px; }
+body .prepend-21  { padding-left: 0; padding-right: 840px; }
+body .prepend-22  { padding-left: 0; padding-right: 880px; }
+body .prepend-23  { padding-left: 0; padding-right: 920px; }
+
+body .border {
+  padding-right: 0;
+  padding-left: 4px;
+  margin-right: 0;
+  margin-left: 5px;
+  border-right: none;
+  border-left: 1px solid #eee;
+}
+
+body .colborder {
+  padding-right: 0;
+  padding-left: 24px;
+  margin-right: 0;
+  margin-left: 25px;
+  border-right: none;
+  border-left: 1px solid #eee;
+}
+
+body .pull-1  { margin-left: 0; margin-right: -40px; }
+body .pull-2  { margin-left: 0; margin-right: -80px; }
+body .pull-3  { margin-left: 0; margin-right: -120px; }
+body .pull-4  { margin-left: 0; margin-right: -160px; }
+
+body .push-0  { margin: 0 18px 0 0; }
+body .push-1  { margin: 0 18px 0 -40px; }
+body .push-2  { margin: 0 18px 0 -80px; }
+body .push-3  { margin: 0 18px 0 -120px; }
+body .push-4  { margin: 0 18px 0 -160px; }
+body .push-0, body .push-1, body .push-2,
+body .push-3, body .push-4 { float: left; }
+
+
+/* Typography with RTL support */
+body h1,body h2,body h3,
+body h4,body h5,body h6 { font-family: Arial, sans-serif; }
+html body { font-family: Arial, sans-serif;  }
+body pre,body code,body tt { font-family: monospace; }
+
+/* Mirror floats and margins on typographic elements */
+body p img { float: right; margin: 1.5em 0 1.5em 1.5em; }
+body dd, body ul, body ol { margin-left: 0; margin-right: 1.5em;}
+body td, body th { text-align:right; }
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/print.css
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/print.css	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/print.css	(revision 319)
@@ -0,0 +1,29 @@
+/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0
+ http://blueprintcss.org
+
+   * Copyright (c) 2007-Present. See LICENSE for more info.
+   * See README for instructions on how to use Blueprint.
+   * For credits and origins, see AUTHORS.
+   * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */
+
+/* print.css */
+body {line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#000;background:none;font-size:10pt;}
+.container {background:none;}
+hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;}
+hr.space {background:#fff;color:#fff;visibility:hidden;}
+h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;}
+code {font:.9em "Courier New", Monaco, Courier, monospace;}
+a img {border:none;}
+p img.top {margin-top:0;}
+blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;}
+.small {font-size:.9em;}
+.large {font-size:1.1em;}
+.quiet {color:#999;}
+.hide {display:none;}
+a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;}
+#a:link:after, a:visited:after {content:" (" attr(href) ")";font-size:90%;}
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/screen.css
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/screen.css	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/screen.css	(revision 319)
@@ -0,0 +1,265 @@
+/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0
+ http://blueprintcss.org
+
+   * Copyright (c) 2007-Present. See LICENSE for more info.
+   * See README for instructions on how to use Blueprint.
+   * For credits and origins, see AUTHORS.
+   * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */
+
+/* reset.css */
+html {margin:0;padding:0;border:0;}
+body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}
+article, aside, dialog, figure, footer, header, hgroup, nav, section {display:block;}
+body {line-height:1.5;background:white;}
+table {border-collapse:separate;border-spacing:0;}
+caption, th, td {text-align:left;font-weight:normal;float:none !important;}
+table, th, td {vertical-align:middle;}
+blockquote:before, blockquote:after, q:before, q:after {content:'';}
+blockquote, q {quotes:"" "";}
+a img {border:none;}
+:focus {outline:0;}
+
+/* typography.css */
+html {font-size:100.01%;}
+body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;}
+h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;}
+h1 {font-size:3em;line-height:1;margin-bottom:0.5em;}
+h2 {font-size:2em;margin-bottom:0.75em;}
+h3 {font-size:1.5em;line-height:1;margin-bottom:1em;}
+h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;}
+h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;}
+h6 {font-size:1em;font-weight:bold;}
+h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;}
+p {margin:0 0 1.5em;}
+.left {float:left !important;}
+p .left {margin:1.5em 1.5em 1.5em 0;padding:0;}
+.right {float:right !important;}
+p .right {margin:1.5em 0 1.5em 1.5em;padding:0;}
+a:focus, a:hover {color:#09f;}
+a {color:#06c;text-decoration:underline;}
+blockquote {margin:1.5em;color:#666;font-style:italic;}
+strong, dfn {font-weight:bold;}
+em, dfn {font-style:italic;}
+sup, sub {line-height:0;}
+abbr, acronym {border-bottom:1px dotted #666;}
+address {margin:0 0 1.5em;font-style:italic;}
+del {color:#666;}
+pre {margin:1.5em 0;white-space:pre;}
+pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;}
+li ul, li ol {margin:0;}
+ul, ol {margin:0 1.5em 1.5em 0;padding-left:1.5em;}
+ul {list-style-type:disc;}
+ol {list-style-type:decimal;}
+dl {margin:0 0 1.5em 0;}
+dl dt {font-weight:bold;}
+dd {margin-left:1.5em;}
+table {margin-bottom:1.4em;width:100%;}
+th {font-weight:bold;}
+thead th {background:#c3d9ff;}
+th, td, caption {padding:4px 10px 4px 5px;}
+tbody tr:nth-child(even) td, tbody tr.even td {background:#e5ecf9;}
+tfoot {font-style:italic;}
+caption {background:#eee;}
+.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;}
+.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;}
+.hide {display:none;}
+.quiet {color:#666;}
+.loud {color:#000;}
+.highlight {background:#ff0;}
+.added {background:#060;color:#fff;}
+.removed {background:#900;color:#fff;}
+.first {margin-left:0;padding-left:0;}
+.last {margin-right:0;padding-right:0;}
+.top {margin-top:0;padding-top:0;}
+.bottom {margin-bottom:0;padding-bottom:0;}
+
+/* forms.css */
+label {font-weight:bold;}
+fieldset {padding:0 1.4em 1.4em 1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;}
+legend {font-weight:bold;font-size:1.2em;margin-top:-0.2em;margin-bottom:1em;}
+fieldset, #IE8#HACK {padding-top:1.4em;}
+legend, #IE8#HACK {margin-top:0;margin-bottom:0;}
+input[type=text], input[type=password], input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;}
+input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus {border-color:#666;}
+select {background-color:#fff;border-width:1px;border-style:solid;}
+input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;}
+input.text, input.title {width:300px;padding:5px;}
+input.title {font-size:1.5em;}
+textarea {width:390px;height:250px;padding:5px;}
+form.inline {line-height:3;}
+form.inline p {margin-bottom:0;}
+.error, .alert, .notice, .success, .info {padding:0.8em;margin-bottom:1em;border:2px solid #ddd;}
+.error, .alert {background:#fbe3e4;color:#8a1f11;border-color:#fbc2c4;}
+.notice {background:#fff6bf;color:#514721;border-color:#ffd324;}
+.success {background:#e6efc2;color:#264409;border-color:#c6d880;}
+.info {background:#d5edf8;color:#205791;border-color:#92cae4;}
+.error a, .alert a {color:#8a1f11;}
+.notice a {color:#514721;}
+.success a {color:#264409;}
+.info a {color:#205791;}
+
+/* grid.css */
+.container {width:950px;margin:0 auto;}
+.showgrid {background:url(src/grid.png);}
+.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {float:left;margin-right:10px;}
+.last {margin-right:0;}
+.span-1 {width:30px;}
+.span-2 {width:70px;}
+.span-3 {width:110px;}
+.span-4 {width:150px;}
+.span-5 {width:190px;}
+.span-6 {width:230px;}
+.span-7 {width:270px;}
+.span-8 {width:310px;}
+.span-9 {width:350px;}
+.span-10 {width:390px;}
+.span-11 {width:430px;}
+.span-12 {width:470px;}
+.span-13 {width:510px;}
+.span-14 {width:550px;}
+.span-15 {width:590px;}
+.span-16 {width:630px;}
+.span-17 {width:670px;}
+.span-18 {width:710px;}
+.span-19 {width:750px;}
+.span-20 {width:790px;}
+.span-21 {width:830px;}
+.span-22 {width:870px;}
+.span-23 {width:910px;}
+.span-24 {width:950px;margin-right:0;}
+input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {border-left-width:1px;border-right-width:1px;padding-left:5px;padding-right:5px;}
+input.span-1, textarea.span-1 {width:18px;}
+input.span-2, textarea.span-2 {width:58px;}
+input.span-3, textarea.span-3 {width:98px;}
+input.span-4, textarea.span-4 {width:138px;}
+input.span-5, textarea.span-5 {width:178px;}
+input.span-6, textarea.span-6 {width:218px;}
+input.span-7, textarea.span-7 {width:258px;}
+input.span-8, textarea.span-8 {width:298px;}
+input.span-9, textarea.span-9 {width:338px;}
+input.span-10, textarea.span-10 {width:378px;}
+input.span-11, textarea.span-11 {width:418px;}
+input.span-12, textarea.span-12 {width:458px;}
+input.span-13, textarea.span-13 {width:498px;}
+input.span-14, textarea.span-14 {width:538px;}
+input.span-15, textarea.span-15 {width:578px;}
+input.span-16, textarea.span-16 {width:618px;}
+input.span-17, textarea.span-17 {width:658px;}
+input.span-18, textarea.span-18 {width:698px;}
+input.span-19, textarea.span-19 {width:738px;}
+input.span-20, textarea.span-20 {width:778px;}
+input.span-21, textarea.span-21 {width:818px;}
+input.span-22, textarea.span-22 {width:858px;}
+input.span-23, textarea.span-23 {width:898px;}
+input.span-24, textarea.span-24 {width:938px;}
+.append-1 {padding-right:40px;}
+.append-2 {padding-right:80px;}
+.append-3 {padding-right:120px;}
+.append-4 {padding-right:160px;}
+.append-5 {padding-right:200px;}
+.append-6 {padding-right:240px;}
+.append-7 {padding-right:280px;}
+.append-8 {padding-right:320px;}
+.append-9 {padding-right:360px;}
+.append-10 {padding-right:400px;}
+.append-11 {padding-right:440px;}
+.append-12 {padding-right:480px;}
+.append-13 {padding-right:520px;}
+.append-14 {padding-right:560px;}
+.append-15 {padding-right:600px;}
+.append-16 {padding-right:640px;}
+.append-17 {padding-right:680px;}
+.append-18 {padding-right:720px;}
+.append-19 {padding-right:760px;}
+.append-20 {padding-right:800px;}
+.append-21 {padding-right:840px;}
+.append-22 {padding-right:880px;}
+.append-23 {padding-right:920px;}
+.prepend-1 {padding-left:40px;}
+.prepend-2 {padding-left:80px;}
+.prepend-3 {padding-left:120px;}
+.prepend-4 {padding-left:160px;}
+.prepend-5 {padding-left:200px;}
+.prepend-6 {padding-left:240px;}
+.prepend-7 {padding-left:280px;}
+.prepend-8 {padding-left:320px;}
+.prepend-9 {padding-left:360px;}
+.prepend-10 {padding-left:400px;}
+.prepend-11 {padding-left:440px;}
+.prepend-12 {padding-left:480px;}
+.prepend-13 {padding-left:520px;}
+.prepend-14 {padding-left:560px;}
+.prepend-15 {padding-left:600px;}
+.prepend-16 {padding-left:640px;}
+.prepend-17 {padding-left:680px;}
+.prepend-18 {padding-left:720px;}
+.prepend-19 {padding-left:760px;}
+.prepend-20 {padding-left:800px;}
+.prepend-21 {padding-left:840px;}
+.prepend-22 {padding-left:880px;}
+.prepend-23 {padding-left:920px;}
+.border {padding-right:4px;margin-right:5px;border-right:1px solid #ddd;}
+.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #ddd;}
+.pull-1 {margin-left:-40px;}
+.pull-2 {margin-left:-80px;}
+.pull-3 {margin-left:-120px;}
+.pull-4 {margin-left:-160px;}
+.pull-5 {margin-left:-200px;}
+.pull-6 {margin-left:-240px;}
+.pull-7 {margin-left:-280px;}
+.pull-8 {margin-left:-320px;}
+.pull-9 {margin-left:-360px;}
+.pull-10 {margin-left:-400px;}
+.pull-11 {margin-left:-440px;}
+.pull-12 {margin-left:-480px;}
+.pull-13 {margin-left:-520px;}
+.pull-14 {margin-left:-560px;}
+.pull-15 {margin-left:-600px;}
+.pull-16 {margin-left:-640px;}
+.pull-17 {margin-left:-680px;}
+.pull-18 {margin-left:-720px;}
+.pull-19 {margin-left:-760px;}
+.pull-20 {margin-left:-800px;}
+.pull-21 {margin-left:-840px;}
+.pull-22 {margin-left:-880px;}
+.pull-23 {margin-left:-920px;}
+.pull-24 {margin-left:-960px;}
+.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;}
+.push-1 {margin:0 -40px 1.5em 40px;}
+.push-2 {margin:0 -80px 1.5em 80px;}
+.push-3 {margin:0 -120px 1.5em 120px;}
+.push-4 {margin:0 -160px 1.5em 160px;}
+.push-5 {margin:0 -200px 1.5em 200px;}
+.push-6 {margin:0 -240px 1.5em 240px;}
+.push-7 {margin:0 -280px 1.5em 280px;}
+.push-8 {margin:0 -320px 1.5em 320px;}
+.push-9 {margin:0 -360px 1.5em 360px;}
+.push-10 {margin:0 -400px 1.5em 400px;}
+.push-11 {margin:0 -440px 1.5em 440px;}
+.push-12 {margin:0 -480px 1.5em 480px;}
+.push-13 {margin:0 -520px 1.5em 520px;}
+.push-14 {margin:0 -560px 1.5em 560px;}
+.push-15 {margin:0 -600px 1.5em 600px;}
+.push-16 {margin:0 -640px 1.5em 640px;}
+.push-17 {margin:0 -680px 1.5em 680px;}
+.push-18 {margin:0 -720px 1.5em 720px;}
+.push-19 {margin:0 -760px 1.5em 760px;}
+.push-20 {margin:0 -800px 1.5em 800px;}
+.push-21 {margin:0 -840px 1.5em 840px;}
+.push-22 {margin:0 -880px 1.5em 880px;}
+.push-23 {margin:0 -920px 1.5em 920px;}
+.push-24 {margin:0 -960px 1.5em 960px;}
+.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:left;position:relative;}
+div.prepend-top, .prepend-top {margin-top:1.5em;}
+div.append-bottom, .append-bottom {margin-bottom:1.5em;}
+.box {padding:1.5em;margin-bottom:1.5em;background:#e5eCf9;}
+hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:1px;margin:0 0 1.45em;border:none;}
+hr.space {background:#fff;color:#fff;visibility:hidden;}
+.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;}
+.clearfix, .container {display:block;}
+.clear {clear:both;}
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/src/forms.css
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/src/forms.css	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/src/forms.css	(revision 319)
@@ -0,0 +1,81 @@
+/* --------------------------------------------------------------
+
+   forms.css
+   * Sets up some default styling for forms
+   * Gives you classes to enhance your forms
+
+   Usage:
+   * For text fields, use class .title or .text
+   * For inline forms, use .inline (even when using columns)
+
+-------------------------------------------------------------- */
+
+/* 
+	A special hack is included for IE8 since it does not apply padding 
+	correctly on fieldsets
+ */ 
+label       { font-weight: bold; }
+fieldset    { padding:0 1.4em 1.4em 1.4em; margin: 0 0 1.5em 0; border: 1px solid #ccc; }
+legend      { font-weight: bold; font-size:1.2em; margin-top:-0.2em; margin-bottom:1em; }
+
+fieldset, #IE8#HACK { padding-top:1.4em; } 
+legend, #IE8#HACK { margin-top:0; margin-bottom:0; }
+
+/* Form fields
+-------------------------------------------------------------- */
+
+/* 
+  Attribute selectors are used to differentiate the different types 
+  of input elements, but to support old browsers, you will have to 
+  add classes for each one. ".title" simply creates a large text  
+  field, this is purely for looks.
+ */
+input[type=text], input[type=password],
+input.text, input.title,
+textarea {
+  background-color:#fff;
+  border:1px solid #bbb;
+}
+input[type=text]:focus, input[type=password]:focus,
+input.text:focus, input.title:focus,
+textarea:focus {
+  border-color:#666;
+}
+select { background-color:#fff; border-width:1px; border-style:solid; }
+
+input[type=text], input[type=password],
+input.text, input.title,
+textarea, select {
+  margin:0.5em 0;
+}
+
+input.text,
+input.title   { width: 300px; padding:5px; }
+input.title   { font-size:1.5em; }
+textarea      { width: 390px; height: 250px; padding:5px; }
+
+/* 
+  This is to be used on forms where a variety of elements are 
+  placed side-by-side. Use the p tag to denote a line. 
+ */
+form.inline { line-height:3; }
+form.inline p { margin-bottom:0; }
+
+
+/* Success, info, notice and error/alert boxes
+-------------------------------------------------------------- */
+
+.error,
+.alert, 
+.notice,
+.success, 
+.info 			{ padding: 0.8em; margin-bottom: 1em; border: 2px solid #ddd; }
+
+.error, .alert { background: #fbe3e4; color: #8a1f11; border-color: #fbc2c4; }
+.notice     { background: #fff6bf; color: #514721; border-color: #ffd324; }
+.success    { background: #e6efc2; color: #264409; border-color: #c6d880; }
+.info 			{ background: #d5edf8; color: #205791; border-color: #92cae4; }
+.error a, .alert a { color: #8a1f11; }
+.notice a   { color: #514721; }
+.success a  { color: #264409; }
+.info a			{ color: #205791; }
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/src/grid.css
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/src/grid.css	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/src/grid.css	(revision 319)
@@ -0,0 +1,281 @@
+/* --------------------------------------------------------------
+
+   grid.css
+   * Sets up an easy-to-use grid of 24 columns.
+
+   By default, the grid is 950px wide, with 24 columns
+   spanning 30px, and a 10px margin between columns.
+
+   If you need fewer or more columns, namespaces or semantic
+   element names, use the compressor script (lib/compress.rb)
+
+-------------------------------------------------------------- */
+
+/* A container should group all your columns. */
+.container {
+  width: 950px;
+  margin: 0 auto;
+}
+
+/* Use this class on any .span / container to see the grid. */
+.showgrid {
+  background: url(src/grid.png);
+}
+
+
+/* Columns
+-------------------------------------------------------------- */
+
+/* Sets up basic grid floating and margin. */
+.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {
+  float: left;
+  margin-right: 10px;
+}
+
+/* The last column in a row needs this class. */
+.last { margin-right: 0; }
+
+/* Use these classes to set the width of a column. */
+.span-1 {width: 30px;}
+
+.span-2 {width: 70px;}
+.span-3 {width: 110px;}
+.span-4 {width: 150px;}
+.span-5 {width: 190px;}
+.span-6 {width: 230px;}
+.span-7 {width: 270px;}
+.span-8 {width: 310px;}
+.span-9 {width: 350px;}
+.span-10 {width: 390px;}
+.span-11 {width: 430px;}
+.span-12 {width: 470px;}
+.span-13 {width: 510px;}
+.span-14 {width: 550px;}
+.span-15 {width: 590px;}
+.span-16 {width: 630px;}
+.span-17 {width: 670px;}
+.span-18 {width: 710px;}
+.span-19 {width: 750px;}
+.span-20 {width: 790px;}
+.span-21 {width: 830px;}
+.span-22 {width: 870px;}
+.span-23 {width: 910px;}
+.span-24 {width:950px; margin-right:0;}
+
+/* Use these classes to set the width of an input. */
+input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {
+  border-left-width: 1px;
+  border-right-width: 1px;
+  padding-left: 5px;
+  padding-right: 5px;
+}
+
+input.span-1, textarea.span-1 { width: 18px; }
+input.span-2, textarea.span-2 { width: 58px; }
+input.span-3, textarea.span-3 { width: 98px; }
+input.span-4, textarea.span-4 { width: 138px; }
+input.span-5, textarea.span-5 { width: 178px; }
+input.span-6, textarea.span-6 { width: 218px; }
+input.span-7, textarea.span-7 { width: 258px; }
+input.span-8, textarea.span-8 { width: 298px; }
+input.span-9, textarea.span-9 { width: 338px; }
+input.span-10, textarea.span-10 { width: 378px; }
+input.span-11, textarea.span-11 { width: 418px; }
+input.span-12, textarea.span-12 { width: 458px; }
+input.span-13, textarea.span-13 { width: 498px; }
+input.span-14, textarea.span-14 { width: 538px; }
+input.span-15, textarea.span-15 { width: 578px; }
+input.span-16, textarea.span-16 { width: 618px; }
+input.span-17, textarea.span-17 { width: 658px; }
+input.span-18, textarea.span-18 { width: 698px; }
+input.span-19, textarea.span-19 { width: 738px; }
+input.span-20, textarea.span-20 { width: 778px; }
+input.span-21, textarea.span-21 { width: 818px; }
+input.span-22, textarea.span-22 { width: 858px; }
+input.span-23, textarea.span-23 { width: 898px; }
+input.span-24, textarea.span-24 { width: 938px; }
+
+/* Add these to a column to append empty cols. */
+
+.append-1 { padding-right: 40px;}
+.append-2 { padding-right: 80px;}
+.append-3 { padding-right: 120px;}
+.append-4 { padding-right: 160px;}
+.append-5 { padding-right: 200px;}
+.append-6 { padding-right: 240px;}
+.append-7 { padding-right: 280px;}
+.append-8 { padding-right: 320px;}
+.append-9 { padding-right: 360px;}
+.append-10 { padding-right: 400px;}
+.append-11 { padding-right: 440px;}
+.append-12 { padding-right: 480px;}
+.append-13 { padding-right: 520px;}
+.append-14 { padding-right: 560px;}
+.append-15 { padding-right: 600px;}
+.append-16 { padding-right: 640px;}
+.append-17 { padding-right: 680px;}
+.append-18 { padding-right: 720px;}
+.append-19 { padding-right: 760px;}
+.append-20 { padding-right: 800px;}
+.append-21 { padding-right: 840px;}
+.append-22 { padding-right: 880px;}
+.append-23 { padding-right: 920px;}
+
+/* Add these to a column to prepend empty cols. */
+
+.prepend-1 { padding-left: 40px;}
+.prepend-2 { padding-left: 80px;}
+.prepend-3 { padding-left: 120px;}
+.prepend-4 { padding-left: 160px;}
+.prepend-5 { padding-left: 200px;}
+.prepend-6 { padding-left: 240px;}
+.prepend-7 { padding-left: 280px;}
+.prepend-8 { padding-left: 320px;}
+.prepend-9 { padding-left: 360px;}
+.prepend-10 { padding-left: 400px;}
+.prepend-11 { padding-left: 440px;}
+.prepend-12 { padding-left: 480px;}
+.prepend-13 { padding-left: 520px;}
+.prepend-14 { padding-left: 560px;}
+.prepend-15 { padding-left: 600px;}
+.prepend-16 { padding-left: 640px;}
+.prepend-17 { padding-left: 680px;}
+.prepend-18 { padding-left: 720px;}
+.prepend-19 { padding-left: 760px;}
+.prepend-20 { padding-left: 800px;}
+.prepend-21 { padding-left: 840px;}
+.prepend-22 { padding-left: 880px;}
+.prepend-23 { padding-left: 920px;}
+
+
+/* Border on right hand side of a column. */
+.border {
+  padding-right: 4px;
+  margin-right: 5px;
+  border-right: 1px solid #ddd;
+}
+
+/* Border with more whitespace, spans one column. */
+.colborder {
+#  padding-right: 24px;
+  margin-right: 25px;
+  border-right: 1px solid #ddd;
+  min-height: 28em;
+}
+
+
+/* Use these classes on an element to push it into the
+next column, or to pull it into the previous column.  */
+
+
+.pull-1 { margin-left: -40px; }
+.pull-2 { margin-left: -80px; }
+.pull-3 { margin-left: -120px; }
+.pull-4 { margin-left: -160px; }
+.pull-5 { margin-left: -200px; }
+.pull-6 { margin-left: -240px; }
+.pull-7 { margin-left: -280px; }
+.pull-8 { margin-left: -320px; }
+.pull-9 { margin-left: -360px; }
+.pull-10 { margin-left: -400px; }
+.pull-11 { margin-left: -440px; }
+.pull-12 { margin-left: -480px; }
+.pull-13 { margin-left: -520px; }
+.pull-14 { margin-left: -560px; }
+.pull-15 { margin-left: -600px; }
+.pull-16 { margin-left: -640px; }
+.pull-17 { margin-left: -680px; }
+.pull-18 { margin-left: -720px; }
+.pull-19 { margin-left: -760px; }
+.pull-20 { margin-left: -800px; }
+.pull-21 { margin-left: -840px; }
+.pull-22 { margin-left: -880px; }
+.pull-23 { margin-left: -920px; }
+.pull-24 { margin-left: -960px; }
+
+.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float: left; position:relative;}
+
+
+.push-1 { margin: 0 -40px 1.5em 40px; }
+.push-2 { margin: 0 -80px 1.5em 80px; }
+.push-3 { margin: 0 -120px 1.5em 120px; }
+.push-4 { margin: 0 -160px 1.5em 160px; }
+.push-5 { margin: 0 -200px 1.5em 200px; }
+.push-6 { margin: 0 -240px 1.5em 240px; }
+.push-7 { margin: 0 -280px 1.5em 280px; }
+.push-8 { margin: 0 -320px 1.5em 320px; }
+.push-9 { margin: 0 -360px 1.5em 360px; }
+.push-10 { margin: 0 -400px 1.5em 400px; }
+.push-11 { margin: 0 -440px 1.5em 440px; }
+.push-12 { margin: 0 -480px 1.5em 480px; }
+.push-13 { margin: 0 -520px 1.5em 520px; }
+.push-14 { margin: 0 -560px 1.5em 560px; }
+.push-15 { margin: 0 -600px 1.5em 600px; }
+.push-16 { margin: 0 -640px 1.5em 640px; }
+.push-17 { margin: 0 -680px 1.5em 680px; }
+.push-18 { margin: 0 -720px 1.5em 720px; }
+.push-19 { margin: 0 -760px 1.5em 760px; }
+.push-20 { margin: 0 -800px 1.5em 800px; }
+.push-21 { margin: 0 -840px 1.5em 840px; }
+.push-22 { margin: 0 -880px 1.5em 880px; }
+.push-23 { margin: 0 -920px 1.5em 920px; }
+.push-24 { margin: 0 -960px 1.5em 960px; }
+
+.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float: left; position:relative;}
+
+
+/* Misc classes and elements
+-------------------------------------------------------------- */
+
+/* In case you need to add a gutter above/below an element */
+div.prepend-top, .prepend-top {
+  margin-top:1.5em;
+}
+div.append-bottom, .append-bottom {
+  margin-bottom:1.5em;
+}
+
+/* Use a .box to create a padded box inside a column.  */
+.box {
+  padding: 1.5em;
+  margin-bottom: 1.5em;
+  background: #e5eCf9;
+}
+
+/* Use this to create a horizontal ruler across a column. */
+hr {
+  background: #ddd;
+  color: #ddd;
+  clear: both;
+  float: none;
+  width: 100%;
+  height: 1px;
+  margin: 0 0 1.45em;
+  border: none;
+}
+
+hr.space {
+  background: #fff;
+  color: #fff;
+  visibility: hidden;
+}
+
+
+/* Clearing floats without extra markup
+   Based on How To Clear Floats Without Structural Markup by PiE
+   [http://www.positioniseverything.net/easyclearing.html] */
+
+.clearfix:after, .container:after {
+  content: "\0020";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+  overflow:hidden;
+}
+.clearfix, .container {display: block;}
+
+/* Regular clearing
+   apply to column that should drop below previous ones. */
+
+.clear { clear:both; }
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/src/ie.css
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/src/ie.css	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/src/ie.css	(revision 319)
@@ -0,0 +1,79 @@
+/* --------------------------------------------------------------
+
+   ie.css
+
+   Contains every hack for Internet Explorer,
+   so that our core files stay sweet and nimble.
+
+-------------------------------------------------------------- */
+
+/* Make sure the layout is centered in IE5 */
+body { text-align: center; }
+.container { text-align: left; }
+
+/* Fixes IE margin bugs */
+* html .column, * html .span-1, * html .span-2,
+* html .span-3, * html .span-4, * html .span-5,
+* html .span-6, * html .span-7, * html .span-8,
+* html .span-9, * html .span-10, * html .span-11,
+* html .span-12, * html .span-13, * html .span-14,
+* html .span-15, * html .span-16, * html .span-17,
+* html .span-18, * html .span-19, * html .span-20,
+* html .span-21, * html .span-22, * html .span-23,
+* html .span-24 { display:inline; overflow-x: hidden; }
+
+
+/* Elements
+-------------------------------------------------------------- */
+
+/* Fixes incorrect styling of legend in IE6. */
+* html legend { margin:0px -8px 16px 0; padding:0; }
+
+/* Fixes wrong line-height on sup/sub in IE. */
+sup { vertical-align:text-top; }
+sub { vertical-align:text-bottom; }
+
+/* Fixes IE7 missing wrapping of code elements. */
+html>body p code { *white-space: normal; }
+
+/* IE 6&7 has problems with setting proper <hr> margins. */
+hr  { margin:-8px auto 11px; }
+
+/* Explicitly set interpolation, allowing dynamically resized images to not look horrible */
+img { -ms-interpolation-mode:bicubic; }
+
+/* Clearing
+-------------------------------------------------------------- */
+
+/* Makes clearfix actually work in IE */
+.clearfix, .container { display:inline-block; }
+* html .clearfix,
+* html .container { height:1%; }
+
+
+/* Forms
+-------------------------------------------------------------- */
+
+/* Fixes padding on fieldset */
+fieldset { padding-top:0; }
+legend { margin-top:-0.2em; margin-bottom:1em; margin-left:-0.5em; }
+
+/* Makes classic textareas in IE 6 resemble other browsers */
+textarea { overflow:auto; }
+
+/* Makes labels behave correctly in IE 6 and 7 */
+label { vertical-align:middle; position:relative; top:-0.25em; }
+
+/* Fixes rule that IE 6 ignores */
+input.text, input.title, textarea { background-color:#fff; border:1px solid #bbb; }
+input.text:focus, input.title:focus { border-color:#666; }
+input.text, input.title, textarea, select { margin:0.5em 0; }
+input.checkbox, input.radio { position:relative; top:.25em; }
+
+/* Fixes alignment of inline form elements */
+form.inline div, form.inline p { vertical-align:middle; }
+form.inline input.checkbox, form.inline input.radio,
+form.inline input.button, form.inline button {
+  margin:0.5em 0;
+}
+button, input.button { position:relative;top:0.25em; }
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/src/print.css
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/src/print.css	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/src/print.css	(revision 319)
@@ -0,0 +1,92 @@
+/* --------------------------------------------------------------
+
+   print.css
+   * Gives you some sensible styles for printing pages.
+   * See Readme file in this directory for further instructions.
+
+   Some additions you'll want to make, customized to your markup:
+   #header, #footer, #navigation { display:none; }
+
+-------------------------------------------------------------- */
+
+body {
+  line-height: 1.5;
+  font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
+  color:#000;
+  background: none;
+  font-size: 10pt;
+}
+
+
+/* Layout
+-------------------------------------------------------------- */
+
+.container {
+  background: none;
+}
+
+hr {
+  background:#ccc;
+  color:#ccc;
+  width:100%;
+  height:2px;
+  margin:2em 0;
+  padding:0;
+  border:none;
+}
+hr.space {
+  background: #fff;
+  color: #fff;
+  visibility: hidden;
+}
+
+
+/* Text
+-------------------------------------------------------------- */
+
+h1,h2,h3,h4,h5,h6 { font-family: "Helvetica Neue", Arial, "Lucida Grande", sans-serif; }
+code { font:.9em "Courier New", Monaco, Courier, monospace; }
+
+a img { border:none; }
+p img.top { margin-top: 0; }
+
+blockquote {
+  margin:1.5em;
+  padding:1em;
+  font-style:italic;
+  font-size:.9em;
+}
+
+.small  { font-size: .9em; }
+.large  { font-size: 1.1em; }
+.quiet  { color: #999; }
+.hide   { display:none; }
+
+
+/* Links
+-------------------------------------------------------------- */
+
+a:link, a:visited {
+  background: transparent;
+  font-weight:700;
+  text-decoration: underline;
+}
+
+/* 
+	This has been the source of many questions in the past. This 
+	snippet of CSS appends the URL of each link within the text. 
+	The idea is that users printing your webpage will want to know 
+	the URLs they go to. If you want to remove this functionality, 
+	comment out this snippet and make sure to re-compress your files.
+ */
+a:link:after, a:visited:after {
+  content: " (" attr(href) ")";
+  font-size: 90%;
+}
+
+/* If you're having trouble printing relative links, uncomment and customize this:
+   (note: This is valid CSS3, but it still won't go through the W3C CSS Validator) */
+
+/* a[href^="/"]:after {
+  content: " (http://www.yourdomain.com" attr(href) ") ";
+} */
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/src/reset.css
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/src/reset.css	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/src/reset.css	(revision 319)
@@ -0,0 +1,67 @@
+/* --------------------------------------------------------------
+
+   reset.css
+   * Resets default browser CSS.
+
+-------------------------------------------------------------- */
+
+html { 
+	margin:0; 
+	padding:0; 
+	border:0; 
+}
+
+body, div, span, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, code,
+del, dfn, em, img, q, dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, dialog, figure, footer, header,
+hgroup, nav, section {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+/* This helps to make newer HTML5 elements behave like DIVs in older browers */ 
+article, aside, dialog, figure, footer, header,
+hgroup, nav, section {
+    display:block;
+}
+
+/* Line-height should always be unitless! */
+body {
+  line-height: 1.5;
+  background: white; 
+}
+
+/* Tables still need 'cellspacing="0"' in the markup. */
+table { 
+	border-collapse: separate; 
+	border-spacing: 0; 
+}
+/* float:none prevents the span-x classes from breaking table-cell display */
+caption, th, td { 
+	text-align: left; 
+	font-weight: normal; 
+	float:none !important; 
+}
+table, th, td { 
+	vertical-align: middle; 
+}
+
+/* Remove possible quote marks (") from <q>, <blockquote>. */
+blockquote:before, blockquote:after, q:before, q:after { content: ''; }
+blockquote, q { quotes: "" ""; }
+
+/* Remove annoying border on linked images. */
+a img { border: none; }
+
+/* Remember to define your own focus styles! */
+:focus { outline: 0; }
Index: /ether_2012/web/cathy/css/blueprint-css/blueprint/src/typography.css
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/blueprint/src/typography.css	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/blueprint/src/typography.css	(revision 319)
@@ -0,0 +1,123 @@
+/* --------------------------------------------------------------
+
+   typography.css
+   * Sets up some sensible default typography.
+
+-------------------------------------------------------------- */
+
+/* Default font settings.
+   The font-size percentage is of 16px. (0.75 * 16px = 12px) */
+html { font-size:100.01%; }
+body {
+  font-size: 75%;
+  color: #222;
+  background: #fff;
+  font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
+}
+
+
+/* Headings
+-------------------------------------------------------------- */
+
+h1,h2,h3,h4,h5,h6 { font-weight: normal; color: #111; }
+
+h1 { font-size: 3em; line-height: 1; margin-bottom: 0.5em; }
+h2 { font-size: 2em; margin-bottom: 0.75em; }
+h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1em; }
+h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; }
+h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.5em; }
+h6 { font-size: 1em; font-weight: bold; }
+
+h1 img, h2 img, h3 img,
+h4 img, h5 img, h6 img {
+  margin: 0;
+}
+
+
+/* Text elements
+-------------------------------------------------------------- */
+
+p           { margin: 0 0 1.5em; }
+/* 
+	These can be used to pull an image at the start of a paragraph, so 
+	that the text flows around it (usage: <p><img class="left">Text</p>) 
+ */
+.left  			{ float: left !important; }
+p .left			{ margin: 1.5em 1.5em 1.5em 0; padding: 0; }
+.right 			{ float: right !important; }
+p .right 		{ margin: 1.5em 0 1.5em 1.5em; padding: 0; }
+
+a:focus,
+a:hover     { color: #09f; }
+a           { color: #06c; text-decoration: underline; }
+
+blockquote  { margin: 1.5em; color: #666; font-style: italic; }
+strong,dfn	{ font-weight: bold; }
+em,dfn      { font-style: italic; }
+sup, sub    { line-height: 0; }
+
+abbr,
+acronym     { border-bottom: 1px dotted #666; }
+address     { margin: 0 0 1.5em; font-style: italic; }
+del         { color:#666; }
+
+pre         { margin: 1.5em 0; white-space: pre; }
+pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height: 1.5; }
+
+
+/* Lists
+-------------------------------------------------------------- */
+
+li ul,
+li ol       { margin: 0; }
+ul, ol      { margin: 0 1.5em 1.5em 0; padding-left: 1.5em; }
+
+ul          { list-style-type: disc; }
+ol          { list-style-type: decimal; }
+
+dl          { margin: 0 0 1.5em 0; }
+dl dt       { font-weight: bold; }
+dd          { margin-left: 1.5em;}
+
+
+/* Tables
+-------------------------------------------------------------- */
+
+/* 
+	Because of the need for padding on TH and TD, the vertical rhythm 
+	on table cells has to be 27px, instead of the standard 18px or 36px 
+	of other elements. 
+ */ 
+table       { margin-bottom: 1.4em; width:100%; }
+th          { font-weight: bold; }
+thead th    { background: #c3d9ff; }
+th,td,caption { padding: 4px 10px 4px 5px; }
+/*
+	You can zebra-stripe your tables in outdated browsers by adding 
+	the class "even" to every other table row. 
+ */
+tbody tr:nth-child(even) td, 
+tbody tr.even td  { 
+	background: #e5ecf9; 
+}
+tfoot       { font-style: italic; }
+caption     { background: #eee; }
+
+
+/* Misc classes
+-------------------------------------------------------------- */
+
+.small      { font-size: .8em; margin-bottom: 1.875em; line-height: 1.875em; }
+.large      { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; }
+.hide       { display: none; }
+
+.quiet      { color: #666; }
+.loud       { color: #000; }
+.highlight  { background:#ff0; }
+.added      { background:#060; color: #fff; }
+.removed    { background:#900; color: #fff; }
+
+.first      { margin-left:0; padding-left:0; }
+.last       { margin-right:0; padding-right:0; }
+.top        { margin-top:0; padding-top:0; }
+.bottom     { margin-bottom:0; padding-bottom:0; }
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/blueprint.rb
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/blueprint.rb	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/blueprint.rb	(revision 319)
@@ -0,0 +1,39 @@
+require 'fileutils'
+module Blueprint
+  # path to the root Blueprint directory
+  ROOT_PATH =             File.join(File.expand_path(File.dirname(__FILE__)), "../../")
+  # path to where the Blueprint CSS files are stored
+  BLUEPRINT_ROOT_PATH =   File.join(Blueprint::ROOT_PATH, "blueprint")
+  # path to where the Blueprint CSS raw CSS files are stored
+  SOURCE_PATH =           File.join(Blueprint::BLUEPRINT_ROOT_PATH, "src")
+  # path to where the Blueprint CSS generated test files are stored
+  TEST_PATH =             File.join(Blueprint::ROOT_PATH, "tests")
+  # path to the root of the Blueprint scripts
+  LIB_PATH =              File.join(Blueprint::ROOT_PATH, "lib", "blueprint")
+  # path to where Blueprint plugins are stored
+  PLUGINS_PATH =          File.join(Blueprint::BLUEPRINT_ROOT_PATH, "plugins")
+  # settings YAML file where custom user settings are saved
+  SETTINGS_FILE =         File.join(Blueprint::ROOT_PATH, "lib", "settings.yml")
+  # path to validator jar file to validate generated CSS files
+  VALIDATOR_FILE =        File.join(Blueprint::LIB_PATH, "validate", "css-validator.jar")
+  # hash of compressed and source CSS files
+  CSS_FILES = {
+    "screen.css"   => ["reset.css", "typography.css", "forms.css", "grid.css"],
+    "print.css"    => ["print.css"],
+    "ie.css"       => ["ie.css"]
+  }
+
+  # default number of columns for Blueprint layout
+  COLUMN_COUNT =          24
+  # default column width (in pixels) for Blueprint layout
+  COLUMN_WIDTH =          30
+  # default gutter width (in pixels) for Blueprint layout
+  GUTTER_WIDTH =          10
+  
+  INPUT_PADDING =         5
+  INPUT_BORDER =          1
+end
+
+Dir["#{File.join(Blueprint::LIB_PATH)}/*"].each do |file|
+  require file if file =~ /\.rb$/ && file !~ /blueprint\.rb/
+end
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/compressor.rb
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/compressor.rb	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/compressor.rb	(revision 319)
@@ -0,0 +1,290 @@
+require "yaml"
+require "optparse"
+module Blueprint
+  class Compressor
+    TEST_FILES = ["index.html",
+                  "parts/elements.html",
+                  "parts/forms.html",
+                  "parts/grid.html",
+                  "parts/sample.html"]
+
+    attr_accessor :namespace, :custom_css, :custom_layout, :semantic_classes, :project_name, :plugins
+    attr_reader   :custom_path, :loaded_from_settings, :destination_path, :script_name
+
+    # overridden setter method for destination_path
+    # also sets custom_path flag on Blueprint::Compressor instance
+    def destination_path=(path)
+      @destination_path = path
+      @custom_path = @destination_path != Blueprint::BLUEPRINT_ROOT_PATH
+    end
+
+    # constructor
+    def initialize
+      # set up defaults
+      @script_name = File.basename($0)
+      @loaded_from_settings = false
+      @settings_file = Blueprint::SETTINGS_FILE
+      self.namespace = ""
+      self.destination_path = Blueprint::BLUEPRINT_ROOT_PATH
+      self.custom_layout = CustomLayout.new
+      self.project_name = nil
+      self.custom_css = {}
+      self.semantic_classes = {}
+      self.plugins = []
+
+      self.options.parse!(ARGV)
+      initialize_project_from_yaml(self.project_name)
+    end
+
+    # generates output CSS based on any args passed in
+    # overwrites any existing CSS, as well as grid.png and tests
+    def generate!
+      output_header       # information to the user (in the console) describing custom settings
+      generate_css_files  # loops through Blueprint::CSS_FILES to generate output CSS
+      generate_tests      # updates HTML with custom namespaces in order to test the generated library.  TODO: have tests kick out to custom location
+      output_footer       # informs the user that the CSS generation process is complete
+    end
+
+    def options #:nodoc:#
+      OptionParser.new do |o|
+        o.set_summary_indent("  ")
+        o.banner =    "Usage: #{@script_name} [options]"
+        o.define_head "Blueprint Compressor"
+        o.separator ""
+        o.separator "options"
+        o.on( "-fSETTINGS_FILE", "--settings_file=SETTINGS_FILE", String,
+              "Specify a non-default settings file path.") { |file| @settings_file = file }
+        o.on( "-oOUTPUT_PATH", "--output_path=OUTPUT_PATH", String,
+              "Define a different path to output generated CSS files to.") { |path| self.destination_path = path }
+        o.on( "-nBP_NAMESPACE", "--namespace=BP_NAMESPACE", String,
+              "Define a namespace prepended to all Blueprint classes (e.g. .your-ns-span-24)") { |ns| self.namespace = ns }
+        o.on( "-pPROJECT_NAME", "--project=PROJECT_NAME", String,
+              "If using the settings.yml file, PROJECT_NAME is the project name you want to export") {|project| @project_name = project }
+        o.on( "--column_width=COLUMN_WIDTH", Integer,
+              "Set a new column width (in pixels) for the output grid") {|cw| self.custom_layout.column_width = cw }
+        o.on( "--gutter_width=GUTTER_WIDTH", Integer,
+              "Set a new gutter width (in pixels) for the output grid") {|gw| self.custom_layout.gutter_width = gw }
+        o.on( "--column_count=COLUMN_COUNT", Integer,
+              "Set a new column count for the output grid") {|cc| self.custom_layout.column_count = cc }
+        #o.on("-v", "--verbose", "Turn on verbose output.") { |$verbose| }
+        o.on("-h", "--help", "Show this help message.") { puts o; exit }
+      end
+    end
+
+    private
+
+    # attempts to load output settings from settings.yml
+    def initialize_project_from_yaml(project_name = nil)
+      # ensures project_name is set and settings.yml is present
+      return unless (project_name && File.exist?(@settings_file))
+
+      # loads yaml into hash
+      projects = YAML::load(File.path_to_string(@settings_file))
+
+      if (project = projects[project_name]) # checks to see if project info is present
+        self.destination_path = if self.destination_path == Blueprint::BLUEPRINT_ROOT_PATH
+                                  project["path"]
+                                else
+                                  self.destination_path
+                                end
+        self.destination_path   ||= Blueprint::BLUEPRINT_ROOT_PATH
+        self.namespace =        project["namespace"]        || ""
+        self.custom_css =       project["custom_css"]       || {}
+        self.semantic_classes = project["semantic_classes"] || {}
+        self.plugins =          project["plugins"]          || []
+
+        if (layout = project["custom_layout"])
+          self.custom_layout = CustomLayout.new(:column_count =>  layout["column_count"],
+                                                :column_width =>  layout["column_width"],
+                                                :gutter_width =>  layout["gutter_width"],
+                                                :input_padding => layout["input_padding"],
+                                                :input_border =>  layout["input_border"])
+        end
+        @loaded_from_settings = true
+      end
+    end
+
+    def generate_css_files
+      Blueprint::CSS_FILES.each do |output_file_name, css_source_file_names|
+        css_output_path = File.join(destination_path, output_file_name)
+        puts "\n    Assembling to #{custom_path ? css_output_path : "default blueprint path"}"
+
+        # CSS file generation
+        css_output = css_file_header # header included on all three Blueprint-generated files
+        css_output += "\n\n"
+
+        # Iterate through src/ .css files and compile to individual core compressed file
+        css_source_file_names.each do |css_source_file|
+          puts "      + src/#{css_source_file}"
+          css_output += "/* #{css_source_file} */\n" if css_source_file_names.any?
+
+          source_options = if self.custom_layout && css_source_file == "grid.css"
+            self.custom_layout.generate_grid_css
+          else
+            File.path_to_string File.join(Blueprint::SOURCE_PATH, css_source_file)
+          end
+
+          css_output += Blueprint::CSSParser.new(source_options,
+                                                 :namespace => namespace).to_s
+          css_output += "\n"
+        end
+
+        #append CSS from plugins
+        css_output = append_plugin_css(css_output, output_file_name)
+
+        # append CSS from custom files
+        css_output = append_custom_css(css_output, output_file_name)
+
+        #save CSS to correct path, stripping out any extra whitespace at the end of the file
+        File.string_to_file(css_output.rstrip, css_output_path)
+      end
+
+      # append semantic class names if set
+      append_semantic_classes
+
+      #attempt to generate a grid.png file
+      if (grid_builder = GridBuilder.new(:column_width => self.custom_layout.column_width,
+                                         :gutter_width => self.custom_layout.gutter_width,
+                                         :output_path => File.join(self.destination_path, "src")))
+        grid_builder.generate!
+      end
+    end
+
+    def append_custom_css(css, current_file_name)
+      # check to see if a custom (non-default) location was used for output files
+      # if custom path is used, handle custom CSS, if any
+      return css unless self.custom_path and self.custom_css[current_file_name]
+
+      self.custom_css[current_file_name].each do |custom_css|
+        overwrite_base = custom_css || "my-#{current_file_name}"
+        overwrite_path = File.join(destination_path, overwrite_base)
+        overwrite_css = if File.exists?(overwrite_path)
+                          File.path_to_string(overwrite_path)
+                        else
+                          ""
+                        end
+
+        # if there's CSS present, add it to the CSS output
+        unless overwrite_css.blank?
+          puts "      + custom styles (#{custom_css})\n"
+          css += "/* #{overwrite_base} */\n"
+          css += CSSParser.new(overwrite_css).to_s + "\n"
+        end
+      end
+
+      css
+    end
+
+    def append_plugin_css(css, current_file_name)
+      return css unless self.plugins.any?
+
+      plugin_css = ""
+
+      self.plugins.each do |plugin|
+        plugin_file_specific  = File.join(Blueprint::PLUGINS_PATH, plugin, current_file_name)
+        plugin_file_generic   = File.join(Blueprint::PLUGINS_PATH, plugin, "#{plugin}.css")
+
+        file = if File.exists?(plugin_file_specific)
+          plugin_file_specific
+        elsif File.exists?(plugin_file_generic) && current_file_name =~ /^screen|print/
+          plugin_file_generic
+        end
+
+        if file
+          puts "      + #{plugin} plugin\n"
+          plugin_css += "/* #{plugin} */\n"
+          plugin_css += CSSParser.new(File.path_to_string(file)).to_s + "\n"
+
+          Dir.glob(File.join(File.dirname(file), "**", "**")).each do |cp|
+            short_path = cp.gsub(/#{File.dirname(file)}./ , "")
+            # make directory if it doesn't exist
+            directory = File.dirname(short_path)
+            if directory != "."
+              FileUtils.mkdir_p(File.join(destination_path, directory))
+            end
+
+            unless File.directory?(File.join(File.dirname(file), short_path)) || cp == file
+              FileUtils.cp(cp, File.join(destination_path, short_path))
+            end
+          end
+        end
+      end
+
+      css += plugin_css
+    end
+
+    def append_semantic_classes
+      screen_output_path = File.join(self.destination_path, "screen.css")
+      semantic_classes = SemanticClassNames.new(:namespace => self.namespace,
+                                                :source_file => screen_output_path)
+      semantic_styles = semantic_classes.css_from_assignments(self.semantic_classes)
+      return if semantic_styles.blank?
+
+      css = File.path_to_string(screen_output_path)
+      css += "\n\n/* semantic class names */\n"
+      css += semantic_styles
+      File.string_to_file(css.rstrip, screen_output_path)
+    end
+
+    def generate_tests
+      puts "\n    Updating namespace to \"#{namespace}\" in test files:"
+      test_files = Compressor::TEST_FILES.map do |file|
+        File.join(Blueprint::TEST_PATH, *file.split(/\//))
+      end
+
+      test_files.each do |file|
+        puts "      + #{file}"
+        Namespace.new(file, namespace)
+      end
+    end
+
+    def output_header
+      puts "\n"
+      puts "  #{"*" * 100}"
+      puts "  **"
+      puts "  **   Blueprint CSS Compressor"
+      puts "  **"
+      puts "  **   Builds compressed files from the source directory."
+      puts "  **"
+      puts "  **   Loaded from settings.yml" if loaded_from_settings
+      puts "  **   Namespace: '#{namespace}'" unless namespace.blank?
+      puts "  **   Output to: #{destination_path}"
+      puts "  **   Grid Settings:"
+      puts "  **     - Column Count: #{self.custom_layout.column_count}"
+      puts "  **     - Column Width: #{self.custom_layout.column_width}px"
+      puts "  **     - Gutter Width: #{self.custom_layout.gutter_width}px"
+      puts "  **     - Total Width : #{self.custom_layout.page_width}px"
+      puts "  **"
+      puts "  #{"*" * 100}"
+    end
+
+    def output_footer
+      puts "\n\n"
+      puts "  #{"*" * 100}"
+      puts "  **"
+      puts "  **   Done!"
+      puts "  **   Your compressed files and test files are now up-to-date."
+      puts "  **"
+      puts "  #{"*" * 100}\n\n"
+    end
+
+    def css_file_header
+%(/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0
+ http://blueprintcss.org
+
+   * Copyright (c) 2007-Present. See LICENSE for more info.
+   * See README for instructions on how to use Blueprint.
+   * For credits and origins, see AUTHORS.
+   * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */)
+    end
+
+    def putsv(str)
+      puts str if $verbose
+    end
+  end
+end
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/core_ext.rb
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/core_ext.rb	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/core_ext.rb	(revision 319)
@@ -0,0 +1,39 @@
+class String
+  # see if string has any content
+  def blank?; self.length.zero?; end
+
+  # strip space after :, remove newlines, replace multiple spaces with only one space, remove comments
+  def strip_space!
+    replace self.gsub(/:\s*/, ":").gsub(/\n/, "").gsub(/\s+/, " ").gsub(/(\/\*).*?(\*\/)/, "")
+  end
+
+  # remove newlines, insert space after comma, replace two spaces with one space after comma
+  def strip_selector_space!
+    replace self.gsub(/\n/, "").gsub(",", ", ").gsub(",  ", ", ")
+  end
+
+  # remove leading whitespace, remove end whitespace
+  def strip_side_space!
+    replace self.gsub(/^\s+/, "").gsub(/\s+$/, $/)
+  end
+end
+
+class NilClass
+  def blank?
+    true
+  end
+end
+
+class File
+  # string output from file
+  def self.path_to_string(path)
+    File.new(path).read
+  end
+
+  # saves a string to a specified file path
+  def self.string_to_file(string, path)
+    directory = File.dirname(path)
+    FileUtils.mkdir_p directory unless File.directory?(directory)
+    File.open(path, "w") { |f| f << string }
+  end
+end
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/css_parser.rb
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/css_parser.rb	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/css_parser.rb	(revision 319)
@@ -0,0 +1,72 @@
+module Blueprint
+  # Strips out most whitespace and can return a hash or string of parsed data
+  class CSSParser
+    attr_accessor :namespace
+    attr_reader   :css_output, :raw_data
+
+    # ==== Options
+    # * <tt>css_string</tt> String of CSS data
+    # * <tt>options</tt>
+    #   * <tt>:namespace</tt> -- Namespace to use when generating output
+    def initialize(css_string = "", options = {})
+      @raw_data     = css_string
+      @namespace    = options[:namespace] || ""
+      compress(@raw_data)
+    end
+
+    # returns string of CSS which can be saved to a file or otherwise
+    def to_s
+      @css_output
+    end
+
+    # returns a hash of all CSS data passed
+    #
+    # ==== Options
+    # * <tt>data</tt> -- CSS string; defaults to string passed into the constructor
+    def parse(data = nil)
+      data ||= @raw_data
+
+      # wrapper array holding hashes of css tags/rules
+      css_out = []
+      # clear initial spaces
+      data.strip_side_space!.strip_space!
+
+      # split on end of assignments
+      data.split('}').each_with_index do |assignments, index|
+        # split again to separate tags from rules
+        tags, styles = assignments.split('{').map{|a| a.strip_side_space!}
+        unless styles.blank?
+          # clean up tags and apply namespaces as needed
+          tags.strip_selector_space!
+          tags.gsub!(/\./, ".#{namespace}") unless namespace.blank?
+
+          # split on semicolon to iterate through each rule
+          rules = []
+          styles.split(";").each do |key_val_pair|
+            unless key_val_pair.nil?
+              # split by property/val and append to rules array with correct declaration
+              property, value = key_val_pair.split(":", 2).map {|kv| kv.strip_side_space! }
+              break unless property && value
+              rules << "#{property}:#{value};"
+            end
+          end
+          # now keeps track of index as hashes don't keep track of position
+          # (which will be fixed in Ruby 1.9)
+          unless tags.blank? || rules.to_s.blank?
+            css_out << {:tags => tags, :rules => rules.join, :idx => index}
+          end
+        end
+      end
+      css_out
+    end
+
+    private
+
+    def compress(data)
+      @css_output = ""
+      parse(data).flatten.sort_by {|i| i[:idx]}.each do |line|
+        @css_output += "#{line[:tags]} {#{line[:rules]}}\n"
+      end
+    end
+  end
+end
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/custom_layout.rb
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/custom_layout.rb	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/custom_layout.rb	(revision 319)
@@ -0,0 +1,72 @@
+require 'erb'
+module Blueprint
+  # Generates a custom grid file, using ERB to evaluate custom settings
+  class CustomLayout
+    # path to ERB file used for CSS template
+    CSS_ERB_FILE = File.join(Blueprint::LIB_PATH, 'grid.css.erb')
+
+    attr_writer :column_count, :column_width, :gutter_width, :input_padding,
+                :input_border
+
+    # Column count of generated CSS.  Returns itself or Blueprint's default
+    def column_count
+      (@column_count || Blueprint::COLUMN_COUNT).to_i
+    end
+
+    # Column width (in pixels) of generated CSS.  Returns itself or Blueprint's default
+    def column_width
+      (@column_width || Blueprint::COLUMN_WIDTH).to_i
+    end
+
+    # Gutter width (in pixels) of generated CSS.  Returns itself or Blueprint's default
+    def gutter_width
+      (@gutter_width || Blueprint::GUTTER_WIDTH).to_i
+    end
+
+    def input_padding
+      (@input_padding || Blueprint::INPUT_PADDING).to_i
+    end
+
+    def input_border
+      (@input_border || Blueprint::INPUT_BORDER).to_i
+    end
+
+    # Returns page width (in pixels)
+    def page_width
+      column_count * (column_width + gutter_width) - gutter_width
+    end
+
+    # ==== Options
+    # * <tt>options</tt>
+    #   * <tt>:column_count</tt> -- Sets the column count of generated CSS
+    #   * <tt>:column_width</tt> -- Sets the column width (in pixels) of generated CSS
+    #   * <tt>:gutter_width</tt> -- Sets the gutter width (in pixels) of generated CSS
+    #   * <tt>:input_padding</tt> -- Sets the input padding width (in pixels) of generated CSS
+    #   * <tt>:input_border</tt> -- Sets the border width (in pixels) of generated CSS
+    def initialize(options = {})
+      @column_count   = options[:column_count]
+      @column_width   = options[:column_width]
+      @gutter_width   = options[:gutter_width]
+      @input_padding  = options[:input_padding]
+      @input_border   = options[:input_border]
+    end
+
+    # Boolean value if current settings are Blueprint's defaults
+    def default?
+      self.column_width == Blueprint::COLUMN_WIDTH &&
+      self.column_count == Blueprint::COLUMN_COUNT &&
+      self.gutter_width == Blueprint::GUTTER_WIDTH &&
+      self.input_padding == Blueprint::INPUT_PADDING &&
+      self.input_border == Blueprint::INPUT_BORDER
+    end
+
+    # Loads grid.css.erb file, binds it to current instance, and returns output
+    def generate_grid_css
+      # loads up erb template to evaluate custom widths
+      css = ERB::new(File.path_to_string(CustomLayout::CSS_ERB_FILE))
+
+      # bind it to this instance
+      css.result(binding)
+    end
+  end
+end
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/grid.css.erb
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/grid.css.erb	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/grid.css.erb	(revision 319)
@@ -0,0 +1,146 @@
+/* --------------------------------------------------------------
+
+   grid.css
+   * Sets up an easy-to-use grid of 24 columns.
+
+   By default, the grid is 950px wide, with 24 columns
+   spanning 30px, and a 10px margin between columns.
+
+   If you need fewer or more columns, namespaces or semantic
+   element names, use the compressor script (lib/compress.rb)
+
+-------------------------------------------------------------- */
+
+/* A container should group all your columns. */
+.container {
+  width: <%= page_width %>px;
+  margin: 0 auto;
+}
+
+/* Use this class on any .span-# / .container to see the grid. */
+.showgrid {
+  background: url(src/grid.png);
+}
+
+
+/* Columns
+-------------------------------------------------------------- */
+
+/* Sets up basic grid floating and margin. */
+.column, <%= (1..column_count).map {|c| ".span-#{c}" }.join(", ") %> {
+  float: left;
+  margin-right: <%= gutter_width %>px;
+}
+
+/* The last column in a row needs this class. */
+.last { margin-right: 0; }
+
+/* Use these classes to set the width of a column. */
+.span-1 {width: <%= column_width %>px;}
+<% (2..column_count-1).each do |column| %>
+.span-<%= column %> {width: <%= (column_width + ((column - 1) * (column_width + gutter_width))).to_i %>px;<%= "margin-right: 0;" if column == column_count %>}<% end %>
+.span-<%= column_count %> {width:<%= page_width %>px; margin-right:0;}
+
+/* Use these classes to set the width of an input. */
+<%= (1..column_count).map {|column| "input.span-#{column}, textarea.span-#{column}"}.join(", ") %> {
+  border-left-width: <%= input_border %>px;
+  border-right-width: <%= input_border %>px;
+  padding-left: <%= input_padding %>px;
+  padding-right: <%= input_padding %>px;
+}
+<% (1..column_count).each do |column| %>
+input.span-<%= column %>, textarea.span-<%= column %> { width: <%= ((column_width + gutter_width) * (column - 1) + column_width - 2*(input_padding + input_border))%>px; }<% end %>
+
+/* Add these to a column to append empty cols. */
+<% (1..(column_count-1)).each do |column| %>
+.append-<%= column %> { padding-right: <%= (column * (column_width + gutter_width)).to_i %>px;}<% end %>
+
+/* Add these to a column to prepend empty cols. */
+<% (1..(column_count-1)).each do |column| %>
+.prepend-<%= column %> { padding-left: <%= (column * (column_width + gutter_width)).to_i %>px;}<% end %>
+
+
+/* Border on right hand side of a column. */
+.border {
+  padding-right: <%= (gutter_width * 0.5 - 1).to_i %>px;
+  margin-right: <%= (gutter_width * 0.5).to_i %>px;
+  border-right: 1px solid #ddd;
+}
+
+/* Border with more whitespace, spans one column. */
+.colborder {
+  padding-right: <%= (column_width + 2*gutter_width - 1)/2.to_i %>px;
+  margin-right: <%= (column_width + 2 * gutter_width)/2.to_i %>px;
+  border-right: 1px solid #ddd;
+}
+
+
+/* Use these classes on an element to push it into the
+next column, or to pull it into the previous column.  */
+
+<% (1..column_count).each do |column| %>
+.pull-<%= column %> { margin-left: -<%= (column * (column_width + gutter_width)).to_i %>px; }<% end %>
+
+<%= (1..column_count).map {|c| ".pull-#{c}" }.join(", ") %> {float: left; position:relative;}
+
+<% (1..(column_count)).each do |column| %>
+.push-<%= column %> { margin: 0 -<%= (column * (column_width + gutter_width)).to_i %>px 1.5em <%= (column * (column_width + gutter_width)).to_i %>px; }<% end %>
+
+<%= (1..column_count).map {|c| ".push-#{c}" }.join(", ") %> {float: left; position:relative;}
+
+
+/* Misc classes and elements
+-------------------------------------------------------------- */
+
+/* In case you need to add a gutter above/below an element */
+div.prepend-top, .prepend-top {
+  margin-top:1.5em;
+}
+div.append-bottom, .append-bottom {
+  margin-bottom:1.5em;
+}
+
+/* Use a .box to create a padded box inside a column.  */
+.box {
+  padding: 1.5em;
+  margin-bottom: 1.5em;
+  background: #e5eCf9;
+}
+
+/* Use this to create a horizontal ruler across a column. */
+hr {
+  background: #ddd;
+  color: #ddd;
+  clear: both;
+  float: none;
+  width: 100%;
+  height: 1px;
+  margin: 0 0 1.45em;
+  border: none;
+}
+
+hr.space {
+  background: #fff;
+  color: #fff;
+  visibility: hidden;
+}
+
+
+/* Clearing floats without extra markup
+   Based on How To Clear Floats Without Structural Markup by PiE
+   [http://www.positioniseverything.net/easyclearing.html] */
+
+.clearfix:after, .container:after {
+  content: "\0020";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+  overflow:hidden;
+}
+.clearfix, .container {display: block;}
+
+/* Regular clearing
+   apply to column that should drop below previous ones. */
+
+.clear { clear:both; }
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/grid_builder.rb
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/grid_builder.rb	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/grid_builder.rb	(revision 319)
@@ -0,0 +1,63 @@
+begin
+  require "rubygems"
+  gem "rmagick"
+  require "rvg/rvg"
+rescue Exception => e
+  puts "  #{"*" * 100}"
+  puts "  **"
+  puts "  **   Warning:"
+  puts "  **   Could not load the Rmagick gem.  Please check your installation."
+  puts "  **   grid.png will not be generated."
+  puts "  **"
+  puts "  #{"*" * 100}\n"
+end
+
+module Blueprint
+  # Uses ImageMagick and RMagick to generate grid.png file
+  class GridBuilder
+    begin
+      include Magick
+    rescue Exception => e
+    end
+
+    attr_reader :column_width, :gutter_width, :output_path, :able_to_generate
+
+    # ==== Options
+    # * <tt>options</tt>
+    #   * <tt>:column_width</tt> -- Width (in pixels) of current grid column
+    #   * <tt>:gutter_width</tt> -- Width (in pixels) of current grid gutter
+    #   * <tt>:output_path</tt> -- Output path of grid.png file
+    def initialize(options={})
+      @able_to_generate = Magick::Long_version rescue false
+      return unless @able_to_generate
+      @column_width = options[:column_width] || Blueprint::COLUMN_WIDTH
+      @gutter_width = options[:gutter_width] || Blueprint::GUTTER_WIDTH
+      @output_path  = options[:output_path]  || Blueprint::SOURCE_PATH
+    end
+
+    # generates (overwriting if necessary) grid.png image to be tiled in background
+    def generate!
+      return false unless self.able_to_generate
+      total_width = self.column_width + self.gutter_width
+      height = 18
+      RVG::dpi = 100
+
+      width_in_inches = (total_width.to_f/RVG::dpi).in
+      height_in_inches = (height.to_f/RVG::dpi).in
+      rvg = RVG.new(width_in_inches, height_in_inches).viewbox(0, 0, total_width, height) do |canvas|
+        canvas.background_fill = "white"
+
+        canvas.g do |column|
+          column.rect(self.column_width - 1, height).styles(:fill => "#e8effb")
+        end
+
+        canvas.g do |baseline|
+          baseline.line(0, (height - 1), total_width, (height - 1)).styles(:fill => "#e9e9e9")
+        end
+      end
+
+      FileUtils.mkdir self.output_path unless File.exists? self.output_path
+      rvg.draw.write(File.join(self.output_path, "grid.png"))
+    end
+  end
+end
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/namespace.rb
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/namespace.rb	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/namespace.rb	(revision 319)
@@ -0,0 +1,38 @@
+module Blueprint
+  class Namespace
+
+    # Read html to string, remove namespace if any,
+    # set the new namespace, and update the test file.
+    def initialize(path, namespace)
+      html = File.path_to_string(path)
+      remove_current_namespace(html)
+      add_namespace(html, namespace)
+      File.string_to_file(html, path)
+    end
+
+    # adds namespace to BP classes in a html file
+    def add_namespace(html, namespace)
+      html.gsub!(/(class=")([a-zA-Z0-9\-_ ]*)(")/) do |m|
+        classes = m.to_s.split('"')[1].split(" ")
+        classes.map! { |c| c = namespace + c }
+        'class="' + classes.join(' ') + '"'
+      end
+      html
+    end
+
+    # removes a namespace from a string of html
+    def remove_current_namespace(html)
+      current = current_namespace(html)
+      html.gsub!(current, "")
+      html
+    end
+
+    # returns current namespace in test files
+    # based on container class
+    def current_namespace(html)
+      html =~ /class="([\S]+)container/
+      current_namespace = $1 if $1
+      current_namespace || ""
+    end
+  end
+end
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/semantic_class_names.rb
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/semantic_class_names.rb	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/semantic_class_names.rb	(revision 319)
@@ -0,0 +1,64 @@
+module Blueprint
+  # parses a hash of key/value pairs, key being output CSS selectors, value
+  # being a list of CSS selectors to draw from
+  class SemanticClassNames
+    attr_accessor :class_assignments
+    attr_reader   :namespace, :source_file
+
+    # ==== Options
+    # * <tt>options</tt>
+    #   * <tt>:namespace</tt> -- Namespace to be used when matching CSS selectors to draw from
+    #   * <tt>:source_file</tt> -- Source file to use as reference of CSS selectors.  Defaults to Blueprint's generated screen.css
+    #   * <tt>:class_assignments</tt> -- Hash of key/value pairs, key being output CSS selectors, value being a list of CSS selectors to draw from
+    def initialize(options = {})
+      @namespace = options[:namespace] || ""
+      @source_file = options[:source_file] || File.join(Blueprint::BLUEPRINT_ROOT_PATH, "screen.css")
+      self.class_assignments = options[:class_assignments] || {}
+    end
+
+    # Returns a CSS string of semantic selectors and associated styles
+    # ==== Options
+    # * <tt>assignments</tt> -- Hash of key/value pairs, key being output CSS selectors, value being a list of CSS selectors to draw from; defaults to what was passed in constructor or empty hash
+    def css_from_assignments(assignments = {})
+      assignments ||= self.class_assignments
+
+      # define a wrapper hash to hold all the new CSS assignments
+      output_css = {}
+
+      #loads full stylesheet into an array of hashes
+      blueprint_assignments = CSSParser.new(File.path_to_string(self.source_file)).parse
+
+      # iterates through each class assignment ('#footer' => '.span-24', '#header' => '.span-24')
+      assignments.each do |semantic_class, blueprint_classes|
+        # gathers all BP classes we're going to be mimicing
+        blueprint_classes = blueprint_classes.split(/,|\s/).select {|c| !c.blank? }.flatten.map {|c| c.strip }
+        classes = []
+        # loop through each BP class, grabbing the full hash (containing tags, index, and CSS rules)
+        blueprint_classes.each do |bp_class|
+          match = if bp_class.include?(".")
+                    bp_class.gsub(".", ".#{self.namespace}")
+                  else
+                    ".#{self.namespace}#{bp_class}"
+                  end
+          classes << blueprint_assignments.select do |line|
+            line[:tags] =~ Regexp.new(/^([\w\.\-\:]+, ?)*#{match}(, ?[\w\.\-\:]+)*$/)
+          end.uniq
+        end
+
+        # clean up the array
+        classes = classes.flatten.uniq
+
+        # set the semantic class to the rules gathered in classes, sorted by index
+        # this way, the styles will be applied in the correct order from top of file to bottom
+        output_css[semantic_class] = "#{classes.sort_by {|i| i[:idx] }.map {|i| i[:rules] }}"
+      end
+
+      # return the css in proper format
+      css = ""
+      output_css.each do |tags, rules|
+        css += "#{tags} {#{rules}}\n"
+      end
+      css
+    end
+  end
+end
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validate/COPYRIGHT.html
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validate/COPYRIGHT.html	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validate/COPYRIGHT.html	(revision 319)
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang='en' lang='en'>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<link rel="stylesheet" type="text/css" href="http://www.w3.org/StyleSheets/base.css" />
+<title>W3C IPR SOFTWARE NOTICE</title>
+</head>
+<body>
+<h1>W3C<sup>&reg;</sup> SOFTWARE NOTICE AND LICENSE</h1>
+
+<h3>Copyright &copy; 1997-2002 <a href="http://www.w3.org/">World
+Wide Web Consortium</a>, (<a
+href="http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de
+Recherche en Informatique et en Automatique</a>, <a
+href="http://www.keio.ac.jp/">Keio University</a>). All Rights
+Reserved. http://www.w3.org/Consortium/Legal/</h3>
+
+<p>This W3C work (including software, documents, or other related
+items) is being provided by the copyright holders under the
+following license. By obtaining, using and/or copying this work,
+you (the licensee) agree that you have read, understood, and will
+comply with the following terms and conditions:</p>
+
+<p>Permission to use, copy, modify, and distribute this software
+and its documentation, with or without modification,&nbsp; for any
+purpose and without fee or royalty is hereby granted, provided that
+you include the following on ALL copies of the software and
+documentation or portions thereof, including modifications, that
+you make:</p>
+
+<ol>
+<li>The full text of this NOTICE in a location viewable to users of
+the redistributed or derivative work.</li>
+
+<li>Any pre-existing intellectual property disclaimers, notices, or
+terms and conditions. If none exist, a short notice of the
+following form (hypertext is preferred, text is permitted) should
+be used within the body of any redistributed or derivative code:
+"Copyright &copy; [$date-of-software] <a
+href="http://www.w3.org/">World Wide Web Consortium</a>, (<a
+href="http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de
+Recherche en Informatique et en Automatique</a>, <a
+href="http://www.keio.ac.jp/">Keio University</a>). All Rights
+Reserved. http://www.w3.org/Consortium/Legal/"</li>
+
+<li>Notice of any changes or modifications to the W3C files,
+including the date changes were made. (We recommend you provide
+URIs to the location from which the code is derived.)</li>
+</ol>
+
+<p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND
+COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
+USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD
+PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
+
+<p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
+SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE
+SOFTWARE OR DOCUMENTATION.</p>
+
+<p>The name and trademarks of copyright holders may NOT be used in
+advertising or publicity pertaining to the software without
+specific, written prior permission. Title to copyright in this
+software and any associated documentation will at all times remain
+with copyright holders.</p>
+
+<p>____________________________________</p>
+
+<p>This formulation of W3C's notice and license became active on
+August 14 1998 so as to improve compatibility with GPL. This
+version ensures that W3C software licensing terms are no more
+restrictive than GPL and consequently W3C software may be
+distributed in GPL packages. See the <a
+href="copyright-software-19980519.html">older formulation</a> for
+the policy prior to this date. Please see our <a
+href="IPR-FAQ.html">Copyright FAQ</a> for common questions about
+using materials from our site, including specific terms and
+conditions for packages like libwww, Amaya, and Jigsaw. Other
+questions about this notice can be directed to <a
+href="mailto:site-policy@w3.org">site-policy@w3.org</a>.<br />
+&nbsp;</p>
+
+<p>&nbsp;</p>
+
+<address><a href="http://www.w3.org/Help/Webmaster.html">webmaster</a><br />
+ (last updated $Date: 2004/05/29 04:04:36 $)</address>
+
+</body>
+</html>
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validate/JIGSAW_COPYRIGHT
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validate/JIGSAW_COPYRIGHT	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validate/JIGSAW_COPYRIGHT	(revision 319)
@@ -0,0 +1,64 @@
+W3C IPR SOFTWARE NOTICE
+
+Copyright © 1995-1998 World Wide Web Consortium, (Massachusetts Institute of
+Technology, Institut National de Recherche en Informatique et en
+Automatique, Keio University). All Rights Reserved.
+http://www.w3.org/Consortium/Legal/
+
+This W3C work (including software, documents, or other related items) is
+being provided by the copyright holders under the following license. By
+obtaining, using and/or copying this work, you (the licensee) agree that you
+have read, understood, and will comply with the following terms and
+conditions:
+
+Permission to use, copy, and modify this software and its documentation,
+with or without modification,  for any purpose and without fee or royalty is
+hereby granted, provided that you include the following on ALL copies of the
+software and documentation or portions thereof, including modifications,
+that you make:
+
+  1. The full text of this NOTICE in a location viewable to users of the
+     redistributed or derivative work.
+  2. Any pre-existing intellectual property disclaimers, notices, or terms
+     and conditions. If none exist, a short notice of the following form
+     (hypertext is preferred, text is permitted) should be used within the
+     body of any redistributed or derivative code: "Copyright © World Wide
+     Web Consortium, (Massachusetts Institute of Technology, Institut
+     National de Recherche en Informatique et en Automatique, Keio
+     University). All Rights Reserved. http://www.w3.org/Consortium/Legal/"
+  3. Notice of any changes or modifications to the W3C files, including the
+     date changes were made. (We recommend you provide URIs to the location
+     from which the code is derived).
+
+In addition, creators of derivitive works must include the full text of this
+NOTICE in a location viewable to users of the derivitive work.
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
+MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
+PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE
+ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
+DOCUMENTATION.
+
+The name and trademarks of copyright holders may NOT be used in advertising
+or publicity pertaining to the software without specific, written prior
+permission. Title to copyright in this software and any associated
+documentation will at all times remain with copyright holders.
+
+____________________________________
+
+This formulation of W3C's notice and license became active on August 14
+1998. See the older formulation for the policy prior to this date. Please
+see our Copyright FAQ for common questions about using materials from our
+site, including specific terms and conditions for packages like libwww,
+Amaya, and Jigsaw. Other questions about this notice can be directed to
+site-policy@w3.org .
+
+
+
+
+webmaster
+(last updated 14-Aug-1998)
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validate/README.html
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validate/README.html	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validate/README.html	(revision 319)
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>CSS Validator Binary Distribution - Illumit</title>
+    <link title="RSS Feed" type="application/rss+xml" rel="alternate" href="http://www.illumit.com/site.rss" />
+  </head>
+  <body>
+    <h1>CSS Validator Binary Distribution</h1>
+    <p>This a binary distribution of <a href="http://jigsaw.w3.org/css-validator">W3C CSS Validator</a>.
+    It was built from the <a href="http://dev.w3.org/cvsweb/2002/css-validator">source</a> on June 25, 2006. 
+    No modifications were made.</p>
+    
+    <p>This distribution is provided <a href="README.html#asis">as is</a> to make testing a large number of CSS files easier.</p>
+    
+    
+    <h2>Requirements</h2>
+    <p>A Java 2 Virtual Machine is required to use the validator. 
+      You can download one from <a href="http://java.sun.com/">Sun</a> if you do not have one installed.</p>
+      
+    <h2>Usage</h2>
+    <h2>Summary</h2>
+    <p><code>java -jar <samp>~/css-validator/</samp>css-validator.jar [-options] files URLs</code></p>
+    <h2>Sample</h2>
+    <pre>
+    java -jar ~/css-validator/css-validator.jar f1.css http://illumit.com/
+    </pre>
+    <h2>Options</h2>
+    <dl>
+      <dt>-e</dt><dd>Show errors only.</dd>
+      <dt>-html</dt><dd>Output HTML.</dd>
+      <dt>-css1 | -css2 | -css21 | -css3 | -svg | -svgbasic | -svgtiny</dt>
+      <dd>Specify CSS version. CSS2 is the default.</dd>
+    </dl>
+
+    <h2>Support</h2>
+    
+    <p>If you have questions about how this distribution is built or packaged, 
+    <a href="mailto:contact@illumit.com">mailto:contact@illumit.com</a>.</p>
+
+    <p>Use the CSS Validator <a href="http://jigsaw.w3.org/css-validator/Email">Feedback</a> 
+      page if you have any questions or problems with the validator itself.</p>
+
+    <p class="Footnote">Updates are announced on via 
+        <a class="RSSLink" rel="alternate" type="application/rss+xml" href="http://www.illumit.com/site.rss">RSS</a></p>
+
+      <!--    
+    <h2>Contents</h2>
+    <ul>
+      <li><a href="css-validator.jar">css-validator.jar</a> Executable JAR package</li>
+      <li><a href="COPYRIGHT.html">COPYRIGHT.html</a> CSS Validator Copyright Notice</li>
+      <li><a href="css-validator-javadoc.jar">css-validator-javadoc.jar</a> CSS Validator API Docs</li>
+      <li>Required libraries:<ul>
+        <li><a href="jigsaw.jar">jigsaw.jar</a> and <a href="JIGSAW_COPYRIGHT">JIGSAW_COPYRIGHT</a></li>
+        <li><a href="xerces.jar">xerces.jar</a> and <a href="XERCES_COPYING.txt">XERCES_COPYING.txt</a></li>
+        </ul>
+      </li>
+    </ul>
+      -->
+    
+    <h2>Download</h2>
+    
+    <p>Download the css validator binary distribution <a href="css-validator.zip">css-validator.zip</a>. Extract the files (OS X and *ix users can use unzip).</p>
+    
+    
+    <h2><a name="asis">License Agreement</a></h2>
+    
+    <p>This is a binary distribution of <a href="http://jigsaw.w3.org/css-validator">W3C CSS Validator</a> Version 2.0
+    It was built from the <a href="http://dev.w3.org/cvsweb/2002/css-validator">source</a> on June 25, 2006. 
+    No modifications were made to the source.</p>
+    
+    <p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND 
+ILLUMIT L.L.C AND THE COPYRIGHT HOLDERS (W3C) MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
+USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD
+PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
+
+<p>ILLUMIT L.L.C AND THE COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
+SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE
+SOFTWARE OR DOCUMENTATION.</p>
+
+  </body>
+</html>
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validate/XERCES_COPYING.txt
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validate/XERCES_COPYING.txt	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validate/XERCES_COPYING.txt	(revision 319)
@@ -0,0 +1,56 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:  
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xerces" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written 
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
Index: /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validator.rb
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validator.rb	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/blueprint/validator.rb	(revision 319)
@@ -0,0 +1,49 @@
+module Blueprint
+  # Validates generated CSS against the W3 using Java
+  class Validator
+    attr_reader :error_count
+
+    def initialize
+      @error_count = 0
+    end
+
+    # Validates all three CSS files
+    def validate
+      java_path = `which java`.rstrip
+      raise "You do not have a Java installed, but it is required." if java_path.blank?
+
+      output_header
+
+      Blueprint::CSS_FILES.keys.each do |file_name|
+        css_output_path = File.join(Blueprint::BLUEPRINT_ROOT_PATH, file_name)
+        puts "\n\n  Testing #{css_output_path}"
+        puts "  Output ============================================================\n\n"
+        @error_count += 1 if !system("#{java_path} -jar '#{Blueprint::VALIDATOR_FILE}' -e '#{css_output_path}'")
+      end
+
+      output_footer
+    end
+
+    private
+
+    def output_header
+      puts "\n\n"
+      puts "  ************************************************************"
+      puts "  **"
+      puts "  **   Blueprint CSS Validator"
+      puts "  **   Validates output CSS files"
+      puts "  **"
+      puts "  ************************************************************"
+    end
+
+    def output_footer
+      puts "\n\n"
+      puts "  ************************************************************"
+      puts "  **"
+      puts "  **   Done!"
+      puts "  **   Your CSS files are#{" not" if error_count > 0} valid.#{"  You had #{error_count} error(s) within your files" if error_count > 0}"
+      puts "  **"
+      puts "  ************************************************************"
+    end
+  end
+end
Index: /ether_2012/web/cathy/css/blueprint-css/lib/compress.rb
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/compress.rb	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/compress.rb	(revision 319)
@@ -0,0 +1,167 @@
+#!/usr/bin/env ruby
+require File.join(File.dirname(__FILE__), "blueprint", "blueprint")
+
+# **Basic
+#
+#   Calling this file by itself will pull files from blueprint/src and
+#   concatenate them into three files; ie.css, print.css, and screen.css.
+#
+#     ruby compress.rb
+#
+#   However, argument variables can be set to change how this works.
+#
+#   Calling
+#
+#     ruby compress.rb -h
+#
+#   will reveal basic arguments you can pass to the compress.rb file.
+#
+# **Custom Settings
+#
+#   To use custom settings, the file need to be stored in settings.yml within
+#   this directory.  An example YAML file has been included.
+#
+#   Another ability is to use YAML (spec is at http://www.yaml.org/spec/1.1/)
+#   for project settings in a predefined structure and store all pertinent
+#   information there.  The YAML file has multiple keys (usually a named
+#   project) with a set of data that defines that project.  A sample structure
+#   can be found in settings.example.yml.
+#
+#   The basic structure is this:
+#
+#     Root nodes are project names.  You use these when calling compress.rb as such:
+#
+#       ruby compress.rb -p PROJECTNAME
+#
+#     A sample YAML with only roots and output paths would look like this:
+#
+#       project1:
+#         path: /path/to/my/project/stylesheets
+#       project2:
+#         path: /path/to/different/stylesheets
+#       project3:
+#         path: /path/to/another/projects/styles
+#
+#     You can then call
+#
+#       ruby compress.rb -p project1
+#
+#       or
+#
+#       ruby compress.rb -p project3
+#
+#     This would compress and export Blueprints CSS to the respective directory,
+#     checking for my-(ie|print|screen).css and appending it if present
+#
+#   A more advanced structure would look like this:
+#
+#       project1:
+#         path: /path/to/my/project/stylesheets
+#         namespace: custom-namespace-1-
+#         custom_css:
+#           ie.css:
+#             - custom-ie.css
+#           print.css:
+#             - docs.css
+#             - my-print-styles.css
+#           screen.css:
+#             - subfolder-of-stylesheets/sub_css.css
+#         custom_layout:
+#            column_count: 12
+#            column_width: 70
+#            gutter_width: 10
+#       project2:
+#         path: /path/to/different/stylesheets
+#         namespace: different-namespace-
+#         custom_css:
+#           screen.css:
+#             - custom_screen.css
+#         semantic_classes:
+#           "#footer, #header": column span-24 last
+#           "#content": column span-18 border
+#           "#extra-content": last span-6 column
+#           "div#navigation": last span-24 column
+#           "div.section, div.entry, .feeds": span-6 column
+#         plugins:
+#           - fancy-type
+#           - buttons
+#           - validations
+#       project3:
+#         path: /path/to/another/projects/styles
+#
+#     In a structure like this, a lot more assignment is occurring.  Custom
+#     namespaces are being set for two projects, while the third (project3)
+#     is just a simple path setting.
+#
+#     Also, custom CSS is being used that is appended at the end of its respective
+#     file.  So, in project1, print.css will have docs.css and my-print-styles.css
+#     instead of the default my-print.css.  Note that these files are relative
+#     to the path that you defined above; you can use subdirectories from the
+#     default path if you would like.
+#
+#     Another thing to note here is the custom_layout; if not defined, your
+#     generated CSS will default to the 24 column, 950px wide grid that has been
+#     standard with Blueprint for quite some time.  However, you can specify a
+#     custom grid setup if you would like.  The three options are column_count
+#     (the number of columns you want your grid to have), column width (the
+#     width in pixels that you want your columns to be), and gutter_width (the
+#     width in pixels you want your gutters - space between columns - to be).
+#     To use the Blueprint default, do not define this in your settings file.
+#
+#     Semantic classes are still in the works within Blueprint, but a simple
+#     implementation has been created.
+#
+#     Defining semantic_classes, with nodes underneath, will generate a class
+#     for each node which has rules of each class assigned to it.  For example,
+#     in project2 above, for '#footer, #header', elements with id's of footer
+#     and header will be assigned all the rules from the classes 'span-24,
+#     column, and last', while divs with classes either entry or section, as
+#     well as any element with class of feed, is assigned all the rules from
+#     'span-6 and column'.  Although it is a crude way do accomplish this, it
+#     keeps the generated CSS separate from the core BP CSS.
+#
+#     Also supported is plugins.  The compressor looks withinBLUEPRINT_DIR/blueprint/plugins
+#     to match against what's passed.  If the plugin name matches, it will append
+#     PLUGIN/(screen|print|ie).css to the corresponding CSS file.  It will append
+#     the plugin CSS to all three CSS files if there is a CSS file present named
+#     as the plugin (e.g. the fancy-type plugin with a fancy-type.css file found
+#     within the plugin directory)
+#
+#     In Ruby, the structure would look like this:
+#
+#     {
+#       'project1' => {
+#         'path' => '/path/to/my/project/stylesheets',
+#         'namespace' => 'custom-namespace-1-',
+#         'custom_css' => {
+#           'ie.css' => ['custom-ie.css'],
+#           'print.css' => ['docs.css', 'my-print-styles.css'],
+#           'screen.css' => ['subfolder-of-stylesheets/sub_css.css']
+#         },
+#         'custom_layout' => {
+#           'column_count' => 12,
+#           'column_width' => 70,
+#           'gutter_width' => 10
+#         }
+#       },
+#       'project2' => {
+#         'path' => '/path/to/different/stylesheets',
+#         'namespace' => 'different-namespace-',
+#         'custom_css' => {
+#           'screen.css' => ['custom_screen.css']
+#         },
+#         'semantic_classes' => {
+#           '#footer, #header' => 'column span-24 last',
+#           '#content' => 'column span-18 border',
+#           '#extra-content' => 'last span-6 column',
+#           'div#navigation' => 'last span-24 column',
+#           'div.section, div.entry, .feeds' => 'span-6 column'
+#         },
+#         'plugins' => ['fancy-type', 'buttons', 'validations']
+#       },
+#       'project3' => {
+#         'path' => '/path/to/another/projects/styles'
+#       }
+#     }
+
+Blueprint::Compressor.new.generate!
Index: /ether_2012/web/cathy/css/blueprint-css/lib/settings.example.yml
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/settings.example.yml	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/settings.example.yml	(revision 319)
@@ -0,0 +1,33 @@
+# refer to http://www.yaml.org/spec/1.1/ for clarification on YAML collections
+project1:
+  path: /path/to/my/project/stylesheets
+  namespace: custom-namespace-1-
+  custom_css:
+    ie.css:
+      - custom-ie.css
+    print.css:
+      - docs.css
+      - my-print-styles.css
+    screen.css:
+      - subfolder-of-stylesheets/sub_css.css
+  custom_layout:
+    column_count: 12
+    column_width: 70
+    gutter_width: 10
+  plugins:
+    - fancy-type
+    - buttons
+project2:
+  path: /path/to/different/stylesheets
+  namespace: different-namespace-
+  custom_css:
+    screen.css:
+      - custom_screen.css
+  semantic_classes:
+    "#footer, #header": ".span-24"
+    "#content": ".span-17, .colborder"
+    "#extra-content": ".span-6"
+    "div#navigation": ".span_24"
+    "div.section, div.entry, .feeds": ".span-6"
+project3:
+  path: /path/to/another/projects/styles
Index: /ether_2012/web/cathy/css/blueprint-css/lib/validate.rb
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/lib/validate.rb	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/lib/validate.rb	(revision 319)
@@ -0,0 +1,15 @@
+#!/usr/bin/env ruby
+
+require "blueprint/blueprint"
+require "blueprint/validator"
+
+# This script will validate the core Blueprint files.
+#
+# The files are not completely valid. This has to do
+# with a small number of CSS hacks needed to ensure
+# consistent rendering across browsers.
+#
+# To add your own CSS files for validation, see
+# /lib/blueprint/validator.rb
+
+Blueprint::Validator.new.validate
Index: /ether_2012/web/cathy/css/blueprint-css/tests/index.html
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/tests/index.html	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/tests/index.html	(revision 319)
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint test pages</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+    <style type="text/css" media="screen">
+      p, table, hr, .box { margin-bottom:25px; }
+      .box p { margin-bottom:10px; }
+    </style>
+  </head>
+  <body>
+
+    <div class="container">
+      <h1>Blueprint test pages</h1>
+      <hr>
+
+      <p>Welcome to the Blueprint test pages. The HTML files below test most HTML elements, as well as most classes provided by Blueprint.</p>
+
+      <table border="0" cellspacing="0" cellpadding="0">
+      	<thead>
+	        <tr>
+  	        <th class="span-6">Test page</th>
+    	    	<th class="span-8">Main files tested</th>
+      	  	<th class="span-10">Description</th>
+        	</tr>
+        </thead>
+        <tbody>
+					<tr>
+						<td><a href="parts/sample.html">Sample page</a></td>
+						<td>
+							<a href="../blueprint/src/grid.css">grid.css</a>,
+							<a href="../blueprint/src/typography.css">typography.css</a>
+						</td>
+						<td>A simple sample page, with common elements.</td>
+					</tr>
+					<tr class="even">
+						<td><a href="parts/grid.html">Grid</a></td>
+						<td>
+							<a href="../blueprint/src/grid.css">grid.css</a>
+						</td>
+						<td>Tests classes provided by grid.css.</td>
+					</tr>
+					<tr>
+						<td><a href="parts/elements.html">Typography</a></td>
+						<td>
+							<a href="../blueprint/src/typography.css">typography.css</a>
+						</td>
+						<td>Tests HTML elements which gets set in typography.css.</td>
+					</tr>
+					<tr class="even">
+						<td><a href="parts/forms.html">Forms</a></td>
+						<td>
+							<a href="../blueprint/src/forms.css">forms.css</a>
+						</td>
+						<td>Tests classes and default look provided by forms.css.</td>
+					</tr>
+				</tbody>
+      </table>
+
+      <p><em><strong>Note about the compressed versions:</strong></em>
+      These test files utilize the compressed files. In other words, if you change any of the source files,
+      you'll have to re-compress them with the ruby script in the scripts folder to see any&nbsp;changes.</p>
+
+      <div class="box">
+        <p>For more information and help, try these resources:</p>
+        <ul class="bottom">
+          <li><a href="http://blueprintcss.org">The Blueprint home page</a></li>
+          <li><a href="http://github.com/joshuaclayton/blueprint-css/wikis/home">The Blueprint Wiki</a></li>
+          <li><a href="http://groups.google.com/group/blueprintcss">The Blueprint mailing list</a></li>
+        </ul>
+      </div>
+
+      <p><a href="http://validator.w3.org/check?uri=referer">
+        <img src="parts/valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="top"></a></p>
+
+    </div>
+  </body>
+</html>
Index: /ether_2012/web/cathy/css/blueprint-css/tests/parts/elements.html
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/tests/parts/elements.html	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/tests/parts/elements.html	(revision 319)
@@ -0,0 +1,247 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint HTML Elements Tests</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+
+  </head>
+  <body>
+
+    <div class="container showgrid">
+      <h2>Tests for common HTML elements</h2>
+      <hr>
+      <h5>PARAGRAPHS <span class="alt">&amp;</span> BOXES</h5>
+      <div class="span-8">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor <sub>sub text</sub> ut labore et <sup>sup text</sup> magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+      </div>
+
+      <div class="span-8">
+        <p class="small">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        <p class="large">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+      </div>
+
+      <div class="span-8 last">
+
+        <div class="box">
+          <p class="last">Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+        </div>
+        <blockquote>
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+        </blockquote>
+
+      </div>
+      <hr>
+
+      <h5>LISTS</h5>
+
+      <div class="span-8">
+        <ul>
+          <li>Unordered list test</li>
+          <li>Another list element. Lorem ipsum dolor sit amet, consectetur adipisicing elit.</li>
+          <li>Yet another element in the list</li>
+          <li>Some long text. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Lorem ipsum dolor sit amet, consectetur adipisicing elit.</li>
+        </ul>
+        <ol>
+          <li>Ordered list test</li>
+          <li>Another list element</li>
+          <li>Yet another element in the list</li>
+        </ol>
+      </div>
+
+      <div class="span-8">
+        <ol>
+          <li>Ordered list</li>
+          <li>Here's a nested unordered list
+          <ul>
+            <li>Nested Unordered list</li>
+            <li>Nested ordered list
+            <ol>
+              <li>The first</li>
+              <li>And the second</li>
+            </ol>
+            </li>
+          </ul>
+          </li>
+          <li>Ordered List item</li>
+          <li>Nested Ordered list
+          <ol>
+            <li>Some point</li>
+            <li>Nested Unordered list
+            <ul>
+              <li>The first</li>
+              <li>And the second</li>
+            </ul>
+            </li>
+          </ol>
+          </li>
+        </ol>
+      </div>
+
+      <div class="span-8 last">
+        <dl>
+          <dt>definition list dt</dt>
+          <dd>definition list dd</dd>
+          <dt>definition list dt</dt>
+          <dd>definition list dd</dd>
+          <dt>Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</dt>
+          <dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</dd>
+          <dt>Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</dt>
+          <dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</dd>
+        </dl>
+      </div>
+      <hr>
+
+      <h5>HEADINGS</h5>
+
+      <div class="span-8">
+        <h1>H1: Lorem ipsum dolor sit amet</h1>
+        <h2>H2: Lorem ipsum dolor sit amet, consectetur elit</h2>
+        <h3>H3: Lorem ipsum dolor sit amet, consectetur adipisicing elit</h3>
+        <h4>H4: Lorem ipsum dolor sit amet, consectetur adipisicing elit adipis</h4>
+        <h5>H5: Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</h5>
+        <h6>H6: Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</h6>
+      </div>
+
+      <div class="span-8">
+        <h1>Heading 1</h1><hr>
+        <h2>Heading 2</h2><hr>
+        <h3>Heading 3</h3><hr>
+        <h4>Heading 4</h4><hr>
+        <h5>Heading 5</h5><hr>
+        <h6>Heading 6</h6>
+      </div>
+
+      <div class="span-8 last">
+        <h1>Heading 1</h1>
+        <h2>Heading 2</h2>
+        <h3>Heading 3</h3>
+        <h4>Heading 4</h4>
+        <h5>Heading 5</h5>
+        <h6>Heading 6</h6>
+      </div>
+      <hr>
+
+      <h5>MISC ELEMENTS</h5>
+
+      <div class="span-8">
+        <p>
+          <strong>&lt;strong&gt;</strong><br>
+          <del>&lt;del&gt; deleted</del><br>
+          <dfn>&lt;dfn&gt; dfn</dfn><br>
+          <em>&lt;em&gt; emphasis</em>
+        </p>
+        <p>
+          <a>&lt;a&gt; anchor</a><br>
+          <a href="elements.html#">&lt;a&gt; a + href</a>
+        </p>
+        <p>
+          <abbr title="extended abbr text should show when mouse over">&lt;abbr&gt; abbr - extended text when mouseover.</abbr><br>
+          <acronym title="extended acronym text should show when mouse over">&lt;acronym&gt; acronym - extended text when mouseover.</acronym>
+        </p>
+        <address>
+          &lt;address&gt;<br>
+          Donald Duck<br>
+          Box 555<br>
+          Disneyland
+        </address>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore dolore.</p>
+      </div>
+
+      <div class="span-8">
+        <table summary="This is the summary text for this table."  border="0" cellspacing="0" cellpadding="0">
+          <caption><em>A standard test table with a caption, tr, td elements</em></caption>
+          <tr>
+            <th class="span-4">Table Header One</th>
+            <th class="span-4 last">Table Header Two</th>
+          </tr>
+          <tr>
+            <td>TD One</td>
+            <td>TD Two</td>
+          </tr>
+          <tr>
+            <td colspan="2">TD colspan 2</td>
+          </tr>
+        </table>
+
+        <table summary="This is the summary text for this table."  border="0" cellspacing="0" cellpadding="0">
+          <caption><em>A test table with a thead, tfoot, and tbody elements</em></caption>
+          <thead>
+            <tr>
+              <th class="span-4">Table Header One</th>
+              <th class="span-4 last">Table Header Two</th>
+            </tr>
+          </thead>
+          <tfoot>
+            <tr>
+              <td colspan="2">tfoot footer</td>
+            </tr>
+          </tfoot>
+          <tbody>
+            <tr>
+              <td>TD One</td>
+              <td>TD Two</td>
+            </tr>
+            <tr>
+              <td>TD One</td>
+              <td>TD Two</td>
+            </tr>
+          </tbody>
+          <tbody>
+            <tr>
+              <td>TD One</td>
+              <td>TD Two</td>
+            </tr>
+            <tr>
+              <td>TD One</td>
+              <td>TD Two</td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+
+      <div class="span-8 last">
+
+<pre>&lt;pre&gt;
+pre  space1
+pre  space1
+pre    space2
+pre    space2
+pre tab
+pre tab</pre>
+
+        <code>&lt;code&gt;
+          Not indented
+          indent1
+          indent1
+          indent2
+          indent3</code>
+
+        <tt>&lt;tt&gt;
+          This tt text should be monospaced
+          and
+          wrap as if
+          one line of text
+          even though the code has newlines, spaces, and tabs.
+          It should be the same size as &lt;p&gt; text.
+        </tt>
+      </div>
+      <hr>
+
+      <p>
+        <a href="http://validator.w3.org/check?uri=referer">
+          <img src="valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="top">
+        </a>
+      </p>
+
+    </div>
+  </body>
+</html>
Index: /ether_2012/web/cathy/css/blueprint-css/tests/parts/forms.html
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/tests/parts/forms.html	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/tests/parts/forms.html	(revision 319)
@@ -0,0 +1,194 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+"http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint Forms Tests</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+  </head>
+  <body>
+    <div class="container showgrid">
+      <h1>Forms</h1>
+      <hr>
+
+      <div class="span-12">
+
+        <form id="dummy" action="" method="post">
+
+          <fieldset>
+            <legend>Simple sample form</legend>
+            <p>
+              <label for="dummy0">Text input (title)</label><br>
+              <input type="text" class="title" name="dummy0" id="dummy0" value="Field with class .title">
+            </p>
+
+            <p>
+              <label for="dummy1">Another field</label><br>
+              <input type="text" class="text" id="dummy1" name="dummy1" value="Field with class .text">
+            </p>
+
+            <p>
+              <label for="dummy2">Textarea</label><br>
+              <textarea name="dummy2" id="dummy2" rows="5" cols="20"></textarea>
+            </p>
+
+            <p>
+              <label for="dummy3">A password field</label><br>
+              <input type="password" class="text" id="dummy3" name="dummy3" value="Password field with class .text">
+            </p>
+
+            <p>
+              <input type="submit" value="Submit">
+              <input type="reset" value="Reset">
+            </p>
+
+          </fieldset>
+        </form>
+
+      </div>
+      <div class="span-12 last">
+
+        <div class="error">
+          This is a &lt;div&gt; with the class <strong>.error</strong>. <a href="forms.html#">Link</a>.
+        </div>
+        <div class="notice">
+          This is a &lt;div&gt; with the class <strong>.notice</strong>. <a href="forms.html#">Link</a>.
+        </div>
+        <div class="info">
+          This is a &lt;div&gt; with the class <strong>.info</strong>. <a href="forms.html#">Link</a>.
+        </div>
+        <div class="success">
+          This is a &lt;div&gt; with the class <strong>.success</strong>. <a href="forms.html#">Link</a>.
+        </div>
+
+        <fieldset>
+          <legend>Select, checkboxes, lists</legend>
+
+          <p>
+            <label for="dummy3">Select field</label><br>
+            <select id="dummy3" name="dummy3">
+              <option value="1">Ottawa</option>
+              <option value="2">Calgary</option>
+              <option value="3">Moosejaw</option>
+            </select>
+          </p>
+
+          <p>
+            <label for="dummy4">Select with groups</label><br>
+            <select id="dummy4" name="dummy4">
+              <option>Favorite pet</option>
+              <optgroup label="mammals">
+                <option>dog</option>
+                <option>cat</option>
+                <option>rabbit</option>
+                <option>horse</option>
+              </optgroup>
+              <optgroup label="reptiles">
+                <option>iguana</option>
+                <option>snake</option>
+              </optgroup>
+            </select>
+          </p>
+
+          <p><label>Radio buttons</label><br>
+            <input type="radio" name="example"> Radio one<br>
+            <input type="radio" name="example"> Radio two<br>
+            <input type="radio" name="example"> Radio three<br>
+          </p>
+
+          <p><label>Checkboxes</label><br>
+            <input type="checkbox"> Check one<br>
+            <input type="checkbox"> Check two<br>
+            <input type="checkbox"> Check three<br>
+          </p>
+
+        </fieldset>
+
+      </div>
+
+      <div class="span-24 last">
+
+        <fieldset>
+          <legend>Alignment</legend>
+
+          <p>
+            <label for="dummy5">Select field</label>
+            <select id="dummy5" name="dummy5">
+              <option value="1">Ottawa</option>
+              <option value="2">Calgary</option>
+              <option value="3">Moosejaw</option>
+            </select>
+          </p>
+
+          <p>
+            <label for="dummy6">Text input (title)</label>
+            <input type="text" class="title" name="dummy6" id="dummy6" value="Field with class .title">
+          </p>
+
+          <p>
+            <label for="dummy7">Select field</label>
+            <select id="dummy7" name="dummy7">
+              <option value="1">Ottawa</option>
+              <option value="2">Calgary</option>
+              <option value="3">Moosejaw</option>
+            </select>
+            <label for="dummy8">Another field</label>
+            <input type="text" class="text" id="dummy8" name="dummy8" value="Field with class .text">
+          </p>
+
+        </fieldset>
+
+      </div>
+
+      <div class="span-24 last">
+        <form action="" method="post" class="inline">
+          <fieldset>
+            <legend>A form with class "inline"</legend>
+            <div class="span-3">
+              <label for="a">Label A:</label>
+              <select id="a" name="a" >
+                <option value="0">All</option>
+              </select>
+            </div>
+            <div class="span-2">
+              some text
+            </div>
+            <div class="span-3">
+              <input type="checkbox" id="o" name="o" value="true" checked="checked" class="checkbox">checkbox one
+            </div>
+            <div class="span-3">
+              <label for="b">Label B:</label>
+              <select id="b" name="b" >
+                <option value="0">All</option>
+              </select>
+            </div>
+            <div class="span-2">
+              <a href="forms.html#">A Hyperlink</a>
+            </div>
+            <div class="span-8">
+              <input type="text" class="text" id="q" name="q" value="Field with class .text">
+            </div>
+            <div class="span-2 last">
+              <input type="submit" value="submit" class="button">
+            </div>
+          </fieldset>
+
+        </form>
+
+      </div>
+
+      <hr>
+
+      <p>
+        <a href="http://validator.w3.org/check?uri=referer">
+        <img src="valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="top"></a>
+      </p>
+
+    </div>
+  </body>
+</html>
Index: /ether_2012/web/cathy/css/blueprint-css/tests/parts/grid.html
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/tests/parts/grid.html	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/tests/parts/grid.html	(revision 319)
@@ -0,0 +1,163 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint Grid Tests</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+  </head>
+  <body>
+
+    <div class="container showgrid">
+      <h1>Blueprint Tests: grid.css</h1>
+      <div class="span-8">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-8">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-8 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 append-1">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 append-2">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 append-3 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 prepend-1">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 prepend-2">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 prepend-3 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <hr>
+      <div class="span-12 border">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+      </div>
+      <div class="span-12 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+      </div>
+      <hr>
+      <div class="span-1 prepend-1"><p>1</p></div>
+      <div class="span-1 prepend-2"><p>2</p></div>
+      <div class="span-1 prepend-3"><p>3</p></div>
+      <div class="span-1 prepend-4"><p>4</p></div>
+      <div class="span-1 prepend-5"><p>5</p></div>
+      <div class="span-1 prepend-3 last"><p>3</p></div>
+      <div class="span-1 append-1"><p>1</p></div>
+      <div class="span-1 append-2"><p>2</p></div>
+      <div class="span-1 append-3"><p>3</p></div>
+      <div class="span-1 append-4"><p>4</p></div>
+      <div class="span-1 append-5"><p>5</p></div>
+      <div class="span-1 append-3 last"><p>3</p></div>
+      <div class="span-1 border"><p>1</p></div>
+      <div class="span-1 border"><p>2</p></div>
+      <div class="span-1 border"><p>3</p></div>
+      <div class="span-1 border"><p>4</p></div>
+      <div class="span-1 border"><p>5</p></div>
+      <div class="span-1 border"><p>6</p></div>
+      <div class="span-1 border"><p>7</p></div>
+      <div class="span-1 border"><p>8</p></div>
+      <div class="span-1 border"><p>9</p></div>
+      <div class="span-1 border"><p>10</p></div>
+      <div class="span-1 border"><p>11</p></div>
+      <div class="span-1 border"><p>12</p></div>
+      <div class="span-1 border"><p>13</p></div>
+      <div class="span-1 border"><p>14</p></div>
+      <div class="span-1 border"><p>15</p></div>
+      <div class="span-1 border"><p>16</p></div>
+      <div class="span-1 border"><p>17</p></div>
+      <div class="span-1 border"><p>18</p></div>
+      <div class="span-1 border"><p>19</p></div>
+      <div class="span-1 border"><p>20</p></div>
+      <div class="span-1 border"><p>21</p></div>
+      <div class="span-1 border"><p>22</p></div>
+      <div class="span-1 border"><p>23</p></div>
+      <div class="span-1 last"><p>24</p></div>
+      <div class="span-4"><p>1</p></div>
+      <div class="span-4"><p>2</p></div>
+      <div class="span-4"><p>3</p></div>
+      <div class="span-4"><p>4</p></div>
+      <div class="span-4"><p>5</p></div>
+      <div class="span-4 last"><p>6</p></div>
+      <div class="prepend-23 span-1 last"><p>24</p></div>
+      <div class="prepend-1 span-1"><p>2</p></div>
+      <div class="prepend-20 span-1 append-1 last"><p>23</p></div>
+      <hr>
+      <div class="span-24">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+      </div>
+      <div class="span-12">
+        <div class="span-6">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.</p>
+        </div>
+        <div class="span-6 last">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        </div>
+        <div class="span-12 last">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        </div>
+      </div>
+      <div class="span-12 last">
+        <div class="span-6">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.</p>
+        </div>
+        <div class="span-6 last">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        </div>
+        <div class="span-12 last">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        </div>
+      </div>
+      <div class="span-14 prepend-5 append-5 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+      </div>
+      <hr>
+      <div class="span-12">
+        <h5>TESTING .PUSH-1 TO .PUSH-5</h5>
+        <div class="span-2"><img src="test-small.jpg" class="push-1"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2"><img src="test-small.jpg" class="push-2"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2"><img src="test-small.jpg" class="push-3"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2"><img src="test-small.jpg" class="push-4"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2"><img src="test-small.jpg" class="push-5"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+      </div>
+      <div class="span-12 last">
+        <h5>TESTING .PULL-1 TO .PULL-5</h5>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-1"></div>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-2"></div>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-3"></div>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-4"></div>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-5"></div>
+      </div>
+      <div class="span-24">
+        <p>
+          <a href="http://validator.w3.org/check?uri=referer">
+            <img src="valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="bottom">
+          </a>
+        </p>
+      </div>
+    </div>
+  </body>
+</html>
Index: /ether_2012/web/cathy/css/blueprint-css/tests/parts/sample.html
===================================================================
--- /ether_2012/web/cathy/css/blueprint-css/tests/parts/sample.html	(revision 319)
+++ /ether_2012/web/cathy/css/blueprint-css/tests/parts/sample.html	(revision 319)
@@ -0,0 +1,75 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint Sample Page</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+
+    <!-- Import fancy-type plugin for the sample page. -->
+    <link rel="stylesheet" href="../../blueprint/plugins/fancy-type/screen.css" type="text/css" media="screen, projection">
+  </head>
+  <body>
+    <div class="container">
+      <h1>A simple sample page</h1>
+      <hr>
+      <h2 class="alt">This sample page demonstrates a tiny fraction of what you get with Blueprint.</h2>
+      <hr>
+      <div class="span-7 colborder">
+        <h6>Here's a box</h6>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip.</p>
+      </div>
+      <div class="span-8 colborder">
+        <h6>And another box</h6>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat laboris nisi ut aliquip.</p>
+      </div>
+      <div class="span-7 last">
+        <h6>This box is aligned with the sidebar</h6>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip.</p>
+      </div>
+      <hr>
+      <hr class="space">
+      <div class="span-15 prepend-1 colborder">
+        <p><img src="test.jpg" class="top pull-1 left" alt="test">Lorem ipsum dolor sit amet, <em>consectetuer adipiscing elit</em>. Nunc congue ipsum vestibulum libero. Aenean vitae justo. Nam eget tellus. Etiam convallis, est eu lobortis mattis, lectus tellus tempus felis, a ultricies erat ipsum at metus.</p>
+        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. <a href="sample.html#">Morbi et risus</a>. Aliquam nisl. Nulla facilisi. Cras accumsan vestibulum ante. Vestibulum sed tortor. Praesent <span class="caps">SMALL CAPS</span> tempus fringilla elit. Ut elit diam, sagittis in, nonummy in, gravida non, nunc. Ut orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nam egestas, orci eu imperdiet malesuada, nisl purus fringilla odio, quis commodo est orci vitae justo. Aliquam placerat odio tincidunt nulla. Cras in libero. Aenean rutrum, magna non tristique posuere, erat odio eleifend nisl, non convallis est tortor blandit ligula. Nulla id augue.</p>
+        <p>Nullam mattis, odio ut tempus facilisis, metus nisl facilisis metus, auctor consectetuer felis ligula nec mauris. Vestibulum odio erat, fermentum at, commodo vitae, ultrices et, urna. Mauris vulputate, mi pulvinar sagittis condimentum, sem nulla aliquam velit, sed imperdiet mi purus eu magna. Nulla varius metus ut eros. Aenean aliquet magna eget orci. Class aptent taciti sociosqu ad litora.</p>
+        <p>Vivamus euismod. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel nibh ut turpis dictum sagittis. Aliquam vel velit a elit auctor sollicitudin. Nam vel dui vel neque lacinia pretium. Quisque nunc erat, venenatis id, volutpat ut, scelerisque sed, diam. Mauris ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec mattis. Morbi dignissim sollicitudin libero. Nulla lorem.</p>
+        <blockquote>
+          <p>Integer cursus ornare mauris. Praesent nisl arcu, imperdiet eu, ornare id, scelerisque ut, nunc. Praesent sagittis erat sed velit tempus imperdiet. Ut tristique, ante in interdum hendrerit, erat enim faucibus felis, quis rutrum mauris lorem quis sem. Vestibulum ligula nisi, mattis nec, posuere et, blandit eu, ligula. Nam suscipit placerat odio. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque tortor libero, venenatis vitae, rhoncus eu, placerat ut, mi. Nulla nulla.</p>
+        </blockquote>
+        <p>Maecenas vel metus quis magna pharetra fermentum. <em>Integer sit amet tortor</em>. Maecenas porttitor, pede sed gravida auctor, nulla augue aliquet elit, at pretium urna orci ut metus. Aliquam in dolor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, tellus id ornare posuere, quam nunc accumsan turpis, at convallis tellus orci et nisl. Phasellus congue neque a lorem.</p>
+        <hr>
+        <div class="span-7 colborder">
+          <h6>This is a nested column</h6>
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>
+        </div>
+        <div class="span-7 last">
+          <h6>This is another nested column</h6>
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>
+        </div>
+      </div>
+      <div class="span-7 last">
+        <h3>A <span class="alt">Simple</span> Sidebar</h3>
+        <p>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.</p>
+        <p>Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida. Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida.</p>
+        <p class="quiet">Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.</p>
+        <h5>Incremental leading</h5>
+        <p class="incr">Vestibulum ante ipsum primis in faucibus orci luctus vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus.</p>
+        <p class="incr">Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.</p>
+      </div>
+      <hr>
+      <h2 class="alt">You may pick and choose amongst these and many more features, so be bold.</h2>
+      <hr>
+      <p>
+        <a href="http://validator.w3.org/check?uri=referer">
+          <img src="valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="top">
+        </a>
+      </p>
+    </div>
+  </body>
+</html>
Index: /ether_2012/web/cathy/css/button.css
===================================================================
--- /ether_2012/web/cathy/css/button.css	(revision 319)
+++ /ether_2012/web/cathy/css/button.css	(revision 319)
@@ -0,0 +1,83 @@
+/** ****************************************************************** **/
+/** http://particletree.com/features/rediscovering-the-button-element/ **/
+/** ****************************************************************** **/
+
+/* BUTTONS */
+
+button {
+    display:block;
+    float:left;
+    margin:0 11px 0 0;
+    background-color:#f5f5f5;
+    border:1px solid #dedede;
+    border-top:1px solid #eee;
+    border-left:1px solid #eee;
+
+    font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;
+    font-size:100%;
+    line-height:130%;
+    text-decoration:none;
+    font-weight:bold;
+    color:#565656;
+    cursor:pointer;
+
+    width:auto;
+    overflow:visible;
+    padding:4px 6px 3px 6px; /* IE6 */
+}
+
+button[type]{
+    padding:5px 10px 5px 7px; /* Firefox */
+    line-height:17px; /* Safari */
+}
+
+*:first-child+html button[type]{
+    padding:4px 10px 3px 7px; /* IE7 */
+}
+
+.small{
+    font-size:80%;
+}
+
+button img{
+    margin:0 3px -3px 0 !important;
+    padding:0;
+    border:none;
+    width:16px;
+    height:16px;
+}
+
+
+/* STANDARD */
+button:hover{
+    background-color:#dff4ff;
+    border:1px solid #c2e1ef;
+    color:#336699;
+}
+
+/* POSITIVE */
+button.positive{
+    color:#529214;
+}
+button.positive:hover{
+    background-color:#E6EFC2;
+    border:1px solid #C6D880;
+    color:#529214;
+}
+
+/* NEGATIVE */
+button.negative{
+    color:#d12f19;
+}
+button.negative:hover{
+    background:#fbe3e4;
+    border:1px solid #fbc2c4;
+    color:#d12f19;
+}
+
+/* DISABLE */
+button.disable, button.disable:hover{
+    background-color:#CCCCCC;
+    border:1px solid #dedede;
+    color:#565656;
+}
Index: /ether_2012/web/cathy/css/ether.css
===================================================================
--- /ether_2012/web/cathy/css/ether.css	(revision 319)
+++ /ether_2012/web/cathy/css/ether.css	(revision 319)
@@ -0,0 +1,16 @@
+body {
+    font-size: 14px;
+}
+
+.containerSelect, .containerCalendar, .containerRadio, .containerResult {
+    margin-bottom: 10px;
+}
+
+/** ************************************ **/
+/** ************ LOADING *************** **/
+/** ************************************ **/
+.loading-classic {
+    background-image: url("../images/loading.gif");
+    height: 35px;
+    width: 35px;
+}
Index: /ether_2012/web/cathy/css/radio.css
===================================================================
--- /ether_2012/web/cathy/css/radio.css	(revision 319)
+++ /ether_2012/web/cathy/css/radio.css	(revision 319)
@@ -0,0 +1,32 @@
+.radio-button-container {
+    height: 21px;
+    position: relative;
+    margin-top: 5px;
+}
+
+.radio-button:hover {
+}
+
+.radio-button {
+    background: url(../images/radio_off.gif) no-repeat;
+    width: 21px;
+    height: 21px;
+    /*position: absolute;*/
+    top: 0;
+    left: 0;
+    margin-top: 5px;
+}
+
+.radio-button-checked {
+    background: url(../images/radio_on.gif) no-repeat;
+    width: 21px;
+    height: 21px;
+    position: absolute;
+    top: 0;
+    left: 0;
+}
+
+.radio-text {
+    position: absolute;
+    left: 20px;
+}
Index: /ether_2012/web/cathy/css/select.css
===================================================================
--- /ether_2012/web/cathy/css/select.css	(revision 319)
+++ /ether_2012/web/cathy/css/select.css	(revision 319)
@@ -0,0 +1,64 @@
+/* ********************************************* */
+/* **************** SELECT ********************* */
+/* ********************************************* */
+.select_container {
+    height: 20px;
+}
+
+.select_selectLeft {
+    background: url(../images/select_left.gif) no-repeat top left;
+    height: 20px;
+    width: 6px;
+    float: left;
+}
+
+.select_selectMiddle {
+    background: transparent url(../images/select_middle.gif) repeat-x;
+    height: 20px;
+    float: left;
+    font-size: 12px;
+    color: #70739C;
+    text-align: left;
+    white-space: nowrap;
+    overflow: hidden;
+    line-height: 18px;
+    padding-right: 7px;
+    padding-left: 2px;
+}
+
+.select_selectRight {
+    background: url(../images/select_right.gif) no-repeat top right;
+    height: 20px;
+    width: 20px;
+    float: left;
+}
+
+/* ********************************************* */
+/* **************** CHOICE ********************* */
+/* ********************************************* */
+.select_choicelist {
+    background-color: #ffffff;
+    display: none;
+    z-index: 15;
+    margin-top: -3px;
+    position: absolute; /* Hack IE6 and IE7 */
+    font-size: 12px;
+    color: #70739C;
+    overflow: hidden;
+    border: 1px solid #C0C0C0;
+}
+
+.select_item_middle {
+    width: 100%;
+    padding-left: 8px;
+    padding-right: 25px;
+}
+
+.select_item_middle:hover {
+    background-color: #70739C;
+    color: #E1DEF1;
+}
+
+.select_item_middle:active {
+    background-color: #04155D;
+}
Index: /ether_2012/web/cathy/js/Button.js
===================================================================
--- /ether_2012/web/cathy/js/Button.js	(revision 319)
+++ /ether_2012/web/cathy/js/Button.js	(revision 319)
@@ -0,0 +1,126 @@
+//********************************************************
+// Class Button
+// Display a button
+//
+// str value: Value to display in the button
+// dom parent: in which dom element to draw the button
+// int id: id of the dom element
+// func onclick: callback function when button clicked
+// str className : className of the general button
+// str classNameText : className for the button's text 
+//********************************************************
+
+var Button = Class.create({
+    initialize: function( param )
+    {
+        // Init
+        this.id = param.id ? param.id : "";
+        this.parent = param.parent ? param.parent : false;
+        this.value = param.value ? param.value : "";
+        this.className = param.className ? param.className : false;
+        this.classNameText = param.classNameText ? param.classNameText : false;
+        this.callbackOnClick = param.onClick ? param.onClick : false;
+        this.boolDisabled = false;
+        this.boolSelected = false;
+        this.boolDisplayed = false;
+
+        // Create button elements
+        this.divContainer = $(document.createElement("button"));
+        if(this.className)
+        	this.divContainer.className = this.className;
+        this.divContainer.atMe = this;
+        this.divContainer.id = this.id;
+        if( this.parent )
+            this.parent.appendChild(this.divContainer);
+
+        this.divText = $(document.createElement("div"));
+        if(this.classNameText)
+        	this.divText.className = "button_text";
+        this.divText.innerHTML = this.value;
+        this.divContainer.appendChild(this.divText);
+        
+        // Define button events
+        Event.observe(this.divContainer, 'click', this.onClick.bindAsEventListener(this));
+        Event.observe(this.divContainer, 'mouseover', this.onHover.bindAsEventListener(this));
+    },
+
+    // Getter / Setter ********************************************************
+
+    getContainer: function()
+    {
+        return this.divContainer;
+    },
+    
+    isDisable : function()
+    {
+        return this.boolDisabled;
+    },
+    
+    isSelected: function()
+    {
+        return this.boolSelected;
+    },
+    
+    setValue : function( value )
+    {
+        this.value = value;
+        this.divText.innerHTML = this.value;
+    },
+    
+    setCallbackOnClick : function( value )
+    {
+        this.callbackOnClick = value;
+    },
+    
+    // Actions ********************************************************
+
+    disable : function()
+    {
+        this.boolDisabled = true;
+        this.divContainer.addClassName("disable");
+    },
+    
+    enable : function()
+    {
+        this.boolDisabled = false;
+        this.divContainer.removeClassName("disable");
+    },
+    
+    select : function( value )
+    {
+        this.boolSelected = value;
+        if( this.boolSelected )
+            this.divContainer.addClassName("selected");
+        else
+            this.divContainer.removeClassName("selected");
+    },
+    
+    show : function()
+    {
+        this.boolDisplayed = true;
+        this.divContainer.style.display = "";
+    },
+
+    hide : function()
+    {
+        this.boolDisplayed = false;
+        this.divContainer.style.display = "none";
+    },
+
+    // Events ********************************************************
+
+    onClick : function( event )
+    {
+        if( !this.isDisable() && (undefined == event.detail || 1 == event.detail) )
+        {
+            if( this.callbackOnClick )
+                this.callbackOnClick();
+        }
+        Event.stop(event);
+    },
+
+    onHover : function( event )
+    {
+        Event.stop(event);
+    }
+});
Index: /ether_2012/web/cathy/js/Loading.js
===================================================================
--- /ether_2012/web/cathy/js/Loading.js	(revision 319)
+++ /ether_2012/web/cathy/js/Loading.js	(revision 319)
@@ -0,0 +1,33 @@
+//******************************************************************************
+// Loading interface
+// parameters :
+// parent : specify the parent of loading component
+// id : component id ( for css style )
+//******************************************************************************
+
+var Loading = Class.create({
+
+    initialize:function( parameters )
+    {
+        //Init parameters
+        this.parent = parameters.parent;
+        this.id = parameters.id;
+
+        //Create loading component
+        this.loadingDiv = document.createElement("div");
+        this.loadingDiv.id = this.id;
+        this.loadingDiv.className = "loading-classic";
+        this.parent.appendChild(this.loadingDiv);
+        this.hide();
+    } ,
+
+    display:function()
+    {
+        this.loadingDiv.style.display = "";
+    },
+
+    hide:function()
+    {
+        this.loadingDiv.style.display = "none";
+    }
+}) ;
Index: /ether_2012/web/cathy/js/Radio.js
===================================================================
--- /ether_2012/web/cathy/js/Radio.js	(revision 319)
+++ /ether_2012/web/cathy/js/Radio.js	(revision 319)
@@ -0,0 +1,81 @@
+var Radio = Class.create( {
+
+    // Public functions
+    initialize: function( objectParameter )
+    {
+        // Param
+        this.id = objectParameter.id;
+        this.parent = objectParameter.parent ? objectParameter.parent : document.body;
+        this.arrayButtons = $A();
+        this.currentButton = false;
+    },
+
+    add: function( itemValue, itemName, callback )
+    {
+        var divRadio = document.createElement( "div" );
+        divRadio.className = "radio-button-container";
+
+        var divButton = document.createElement( "div" );
+        divButton.className = "radio-button";
+        divButton.itemName = itemName;
+        divButton.itemValue = itemValue;
+        divButton.callback = callback;
+
+        var divText = document.createElement( "div" );
+        divText.className = "radio-text";
+        divText.innerHTML = itemName;
+
+        divRadio.appendChild( divText );
+        divRadio.appendChild( divButton );
+        this.parent.appendChild( divRadio );
+
+        Event.observe( divButton, 'click', this.select.bind( this, divButton ) );
+        Event.observe( divText, 'click', this.select.bind( this, divButton ) );
+
+        this.arrayButtons.push( divButton );
+
+        // select this radio if none is currently selected
+        if( !this.currentButton )
+            this.currentButton = divButton;
+
+        this.applyStyle();
+    },
+
+    select: function( event, divButton )
+    {
+        this.currentButton = event;
+        if( undefined != this.currentButton.callback )
+            this.currentButton.callback();
+        this.applyStyle();
+    },
+
+    setValue: function( value )
+    {
+        this.currentValue = value;
+        this.applyStyle();
+    },
+
+    getValue: function()
+    {
+        if( this.currentButton )
+            return this.currentButton.itemValue;
+    },
+
+    getName: function()
+    {
+        if( this.currentButton )
+            return this.currentButton.itemName;
+    },
+
+    // Private functions
+    applyStyle: function()
+    {
+        this.arrayButtons.each( function( divRadio )
+        {
+            if( this.currentButton == divRadio )
+                divRadio.className = "radio-button-checked";
+            else
+                divRadio.className = "radio-button";
+        }.bind( this ) );
+    }
+} );
Index: /ether_2012/web/cathy/js/Radio_sauv.js
===================================================================
--- /ether_2012/web/cathy/js/Radio_sauv.js	(revision 319)
+++ /ether_2012/web/cathy/js/Radio_sauv.js	(revision 319)
@@ -0,0 +1,111 @@
+var Radio = Class.create( {
+
+    // Public functions
+
+    initialize: function( container, onSelect )
+    {
+        this._container = container;
+        this._buttons = new Array();
+        this._currentValue = null;
+        this._listeners = $A();
+        this._locked = false;
+        this.onSelect = onSelect;
+    },
+
+    add: function( text, value, textClass )
+    {
+        var element = $( document.createElement( "div" ) );
+        element.addClassName( "radio-button-container" );
+
+        var button = $( document.createElement( "div" ) );
+        button.addClassName( "radio-button" );
+        button._value = value;
+        element.appendChild( button );
+        this._buttons.push( button );
+
+        var text_div = $( document.createElement( "div" ) );
+        if( textClass )
+            text_div.addClassName( textClass );
+        else
+        {
+            text_div.addClassName( "radio-text" );
+            text_div.appendChild( document.createTextNode( text ) );
+            text_div._value = value;
+        }
+        element.appendChild( text_div );
+
+        this._container.appendChild( element );
+
+        Event.observe( button, "click", this.select.bind( this ) );
+        Event.observe( text_div, "click", this.select.bind( this ) );
+
+        // select this radio if none is currently selected
+        if( this._currentValue == null )
+            this._currentValue = value;
+
+        this.applyStyle();
+    },
+
+    addListener: function( listener )
+    {
+        this._listeners.push( listener );
+    },
+
+    select: function( event )
+    {
+        if( !this._locked )
+            this.setValue( event.currentTarget._value );
+        if( this.onSelect )
+            this.onSelect( event.currentTarget._value );
+    },
+
+    lock: function()
+    {
+        this._locked = true;
+        this.applyStyle();
+    },
+
+    unlock: function()
+    {
+        this._locked = false;
+        this.applyStyle();
+    },
+
+    setValue: function( value )
+    {
+        this._currentValue = value;
+        this.applyStyle();
+
+        this._listeners.each( function( listener )
+        {
+            listener( this._currentValue );
+        }.bind( this ) );
+    },
+
+    getValue: function()
+    {
+        return this._currentValue;
+    },
+
+    // Private functions
+
+    applyStyle: function()
+    {
+        for( var i in this._buttons )
+        {
+            var newClassName;
+            var button = this._buttons[ i ];
+
+            if( this._locked )
+                newClassName = "radio-button-locked";
+            else
+            if( this._currentValue == button._value )
+                newClassName = "radio-button-checked";
+            else
+                newClassName = "radio-button";
+
+            if( button.className != newClassName )
+                button.className = newClassName;
+        }
+    }
+} );
Index: /ether_2012/web/cathy/js/Select.js
===================================================================
--- /ether_2012/web/cathy/js/Select.js	(revision 319)
+++ /ether_2012/web/cathy/js/Select.js	(revision 319)
@@ -0,0 +1,292 @@
+//********************************************************
+// Class Select
+// Display a Select
+//
+// obj objParam: {id, [parent], [specificClass], [maxOptionSize], [isDisable], [isDisplayed]}
+//    int objParam.id: id of the dom element
+//    [dom objParam.parent]: in which dom element to draw the button
+//    [str objParam.specificClass]
+//    [int objParam.maxOptionSize]: define a max number of line to display
+//    [int objParam.isDisable]: is the Select disable by default?
+//    [int objParam.isDisplayed]: is the Select opened by default?
+//
+// Public functions
+//    Select.getValue
+//    Select.getName
+//    Select.disable
+//    Select.enable
+//    Select.add
+//    Select.remove
+//    Select.clear
+//    Select.select
+//    Select.selectFirst
+//********************************************************
+
+var Select = Class.create( {
+
+    // Public functions ********************************************************
+
+    initialize: function( objectParameter )
+    {
+        // Param
+        this.id = objectParameter.id;
+        this.parent = objectParameter.parent ? objectParameter.parent : document.body;
+        this.isDisplayed = (true == objectParameter.isDisplayed) ? true : false;
+        this.isDisable = (true == objectParameter.isDisable) ? true : false;
+        this.maxOptionSize = objectParameter.maxOptionSize ? objectParameter.maxOptionSize : 0;
+        this.indexOption = 0;
+        this.isHover = false;
+        this.arrayOptions = $A();
+        this.className = objectParameter.className ? "select_container " + objectParameter.className : "select_container";
+        this.classNameOption = objectParameter.classNameOption ? "select_choicelist " + objectParameter.classNameOption : "select_choicelist";
+
+        // Select div
+        this.divSelect = document.createElement( "div" );
+        this.divSelect.id = this.id;
+        this.divSelect.className = this.className;
+
+        this.divSelectLeft = document.createElement( "div" );
+        this.divSelectLeft.className = "select_selectLeft";
+        this.divSelect.appendChild( this.divSelectLeft );
+
+        this.divSelectMiddle = document.createElement( "div" );
+        this.divSelectMiddle.className = "select_selectMiddle";
+        this.divSelect.appendChild( this.divSelectMiddle );
+
+        this.divSelectRight = document.createElement( "div" );
+        this.divSelectRight.className = "select_selectRight";
+        this.divSelect.appendChild( this.divSelectRight );
+
+        this.parent.appendChild( this.divSelect );
+
+        // Options div
+        this.divOption = document.createElement( "div" );
+        this.divSelect.id = this.id;
+        this.divOption.className = this.classNameOption;
+        this.parent.appendChild( this.divOption );
+
+        Event.observe( this.divSelect, "mouseup", this.toggleOption.bindAsEventListener( this ) );
+        Event.observe( document.body, "mousedown", this.hideOption.bindAsEventListener( this ) );
+        Event.observe( this.divSelect, 'mouseover', this.onMouseHover.bindAsEventListener( this ) );
+        Event.observe( this.divSelect, 'mouseout', this.onMouseOut.bindAsEventListener( this ) );
+        Event.observe( this.divOption, 'mouseover', this.onMouseHover.bindAsEventListener( this ) );
+        Event.observe( this.divOption, 'mouseout', this.onMouseOut.bindAsEventListener( this ) );
+
+        if( this.isDisplayed )
+            this.showOption();
+
+        if( this.isDisable )
+            this.hideOption();
+    },
+
+    getName: function()
+    {
+        return this.itemName;
+    },
+
+    getValue: function()
+    {
+        return this.itemValue;
+    },
+
+    getSize: function()
+    {
+      return this.arrayOptions.size();
+    },
+
+    // private
+    toggleOption:function()
+    {
+        if( this.isDisplayed )
+        {
+            this.isHover = false;
+            this.hideOption();
+        }
+        else
+            this.showOption();
+    },
+
+    // private
+    showOption:function()
+    {
+        if( this.isDisable )
+            return;
+
+        this.isDisplayed = true;
+        this.displayOptions();
+        this.divOption.style.display = "block";
+    },
+
+    // private
+    hideOption: function()
+    {
+        if( this.isHover )
+            return;
+
+        this.isDisplayed = false;
+        this.divOption.style.display = "none";
+    },
+
+    // public
+    disable: function()
+    {
+        this.isDisable = true;
+        this.divSelect.addClassName( "disable" );
+        this.hideOption();
+    },
+
+    // public
+    enable: function()
+    {
+        this.isDisable = false;
+        this.divSelect.removeClassName( "disable" );
+    },
+
+    // public
+    /**
+     * This method indicates if the itemValue is already in the array
+     */
+    content: function( itemValue )
+    {
+        var resu = false;
+        this.arrayOptions.each( function( divOption )
+        {
+            if( divOption.itemValue == itemValue )
+            {
+                resu = true;
+                throw $break;
+            }
+        }.bind( this ) );
+        return resu;
+    },
+
+    // public
+    add: function( itemValue, itemName, callback )
+    {
+        var divOption = document.createElement( "div" );
+        divOption.className = "select_item_middle";
+        divOption.innerHTML = itemName;
+        divOption.itemName = itemName;
+        divOption.itemValue = itemValue;
+        divOption.callback = callback;
+        this.divOption.appendChild( divOption );
+
+        Event.observe( divOption, 'click', this.onOptionClick.bind( this, divOption ) );
+
+        this.arrayOptions.push( divOption );
+    },
+
+    // public
+    remove: function( itemValue )
+    {
+        this.arrayOptions.each( function( divOption )
+        {
+            if( divOption.itemValue == itemValue )
+            {
+                this.divOption.removeChild( divOption );
+                this.arrayOptions = this.arrayOptions.without( divOption );
+                throw $break;
+            }
+        }.bind( this ) );
+    },
+
+    // public
+    clear: function()
+    {
+        this.arrayOptions.each( function( divOption )
+        {
+            this.divOption.removeChild( divOption );
+            this.arrayOptions = this.arrayOptions.without( divOption );
+        }.bind( this ) );
+    },
+
+    // public
+    /**
+     * This method changes only the content of the divSelect without add the item to the array
+     * @param itemValue
+     * @param itemName
+     * @param callback
+     */
+    changeSelectMiddle: function( itemValue, itemName, callback )
+    {
+        this.add( itemValue, itemName, callback );
+        this.select( itemValue, callback );
+        this.remove( itemValue );
+    },
+
+    // public
+    // @itemValue : code of the selected line
+    // @ execute : true / false. Execute the callback.
+    select: function( itemValue, execute )
+    {
+        this.arrayOptions.each( function( divOption )
+        {
+            if( divOption.itemValue == itemValue )
+            {
+                this.selectOption( divOption );
+                if( execute && undefined != divOption.callback )
+                    divOption.callback( divOption.itemValue );
+                throw $break;
+            }
+        }.bind( this ) );
+    },
+
+    // public
+    // @ execute : true / false. Execute the callback.
+    selectFirst: function( execute )
+    {
+        var divOption = this.arrayOptions.first();
+        if( undefined == divOption )
+            return;
+
+        this.selectOption( divOption );
+        if( execute && undefined != divOption.callback )
+            divOption.callback( divOption.itemValue );
+    },
+
+    // private
+    selectOption: function( divOption )
+    {
+        this.itemName = divOption.itemName;
+        this.itemValue = divOption.itemValue;
+        this.divSelectMiddle.innerHTML = divOption.itemName;
+    },
+
+    // private
+    onOptionClick: function( divOption )
+    {
+        this.isHover = false;
+        this.hideOption();
+        this.select( divOption.itemValue, true );
+//        if( undefined != divOption.callback )
+//            divOption.callback( divOption.itemValue );
+    },
+
+    // private
+    onMouseHover: function()
+    {
+        this.isHover = true;
+    },
+
+    // private
+    onMouseOut: function()
+    {
+        this.isHover = false;
+    },
+
+    // private
+    displayOptions: function()
+    {
+        var fromOption = this.indexOption;
+        var toOption = this.indexOption + this.maxOptionSize - 1;
+        for( var i = 0; i < this.arrayOptions.size(); i++ )
+        {
+            if( 0 == this.maxOptionSize )
+                this.arrayOptions[i].style.display = "";
+            else if( i >= fromOption && i <= toOption )
+                this.arrayOptions[i].style.display = "";
+            else
+                this.arrayOptions[i].style.display = "none";
+        }
+    }
+} );
Index: /ether_2012/web/cathy/js/anytime.js
===================================================================
--- /ether_2012/web/cathy/js/anytime.js	(revision 319)
+++ /ether_2012/web/cathy/js/anytime.js	(revision 319)
@@ -0,0 +1,3718 @@
+/*****************************************************************************
+ *  FILE:  anytime.js - The Any+Time(TM) JavaScript Library (source)
+ *
+ *  VERSION: 4.1112H
+ *
+ *  Copyright 2008-2010 Andrew M. Andrews III (www.AMA3.com). Some Rights
+ *  Reserved. This work licensed under the Creative Commons Attribution-
+ *  Noncommercial-Share Alike 3.0 Unported License except in jurisdicitons
+ *  for which the license has been ported by Creative Commons International,
+ *  where the work is licensed under the applicable ported license instead.
+ *  For a copy of the unported license, visit
+ *  http://creativecommons.org/licenses/by-nc-sa/3.0/
+ *  or send a letter to Creative Commons, 171 Second Street, Suite 300,
+ *  San Francisco, California, 94105, USA.  For ported versions of the
+ *  license, visit http://creativecommons.org/international/
+ *
+ *  Alternative licensing arrangements may be made by contacting the
+ *  author at http://www.AMA3.com/contact/
+ *
+ *  The Any+Time(TM) JavaScript Library provides the following ECMAScript
+ *  functionality:
+ *
+ *    AnyTime.Converter
+ *      Converts Dates to/from Strings, allowing a wide range of formats
+ *      closely matching those provided by the MySQL DATE_FORMAT() function,
+ *      with some noteworthy enhancements.
+ *
+ *    AnyTime.pad()
+ *      Pads a value with a specific number of leading zeroes.
+ *
+ *    AnyTime.noPicker()
+ *      Destroys a calendar widget previously added by AnyTime.picker().
+ *      Can also be invoked via jQuery using $(selector).AnyTime_noPicker()
+ *
+ *    AnyTime.picker()
+ *      Attaches a calendar widget to a text field for selecting date/time
+ *      values with fewer mouse movements than most similar pickers.  Any
+ *      format supported by AnyTime.Converter can be used for the text field.
+ *      If JavaScript is disabled, the text field remains editable without
+ *      any of the picker features.
+ *      Can also be invoked via jQuery using $(selector).AnyTime_picker()
+ *
+ *  IMPORTANT NOTICE:  This code depends upon the jQuery JavaScript Library
+ *  (www.jquery.com), currently version 1.4.
+ *
+ *  The Any+Time(TM) code and styles in anytime.css have been tested (but not
+ *  extensively) on Windows Vista in Internet Explorer 8.0, Firefox 3.0, Opera
+ *  10.10 and Safari 4.0.  Minor variations in IE6+7 are to be expected, due
+ *  to their broken box model. Please report any other problems to the author
+ *  (URL above).
+ *
+ *  Any+Time is a trademark of Andrew M. Andrews III.
+ *  Thanks to Chu for help with a setMonth() issue!
+ ****************************************************************************/
+
+// http://www.ama3.com/anytime
+
+var AnyTime =
+{
+    //=============================================================================
+    //  AnyTime.pad() pads a value with a specified number of zeroes and returns
+    //  a string containing the padded value.
+    //=============================================================================
+
+    pad: function( val, len )
+    {
+        var str = String( Math.abs( val ) );
+        while( str.length < len )
+            str = '0' + str;
+        if( val < 0 )
+            str = '-' + str;
+        return str;
+    }
+};
+
+(function( $ )
+{
+    // private members
+
+    var __oneDay = (24 * 60 * 60 * 1000);
+    var __daysIn = [ 31,28,31,30,31,30,31,31,30,31,30,31 ];
+    var __iframe = null;
+    var __initialized = false;
+    var __msie6 = ( navigator.userAgent.indexOf( 'MSIE 6' ) > 0 );
+    var __msie7 = ( navigator.userAgent.indexOf( 'MSIE 7' ) > 0 );
+    var __pickers = [];
+
+    //  Add methods to jQuery to create and destroy pickers using
+    //  the typical jQuery approach.
+
+    jQuery.prototype.AnyTime_picker = function( options )
+    {
+        return this.each( function( i )
+        {
+            AnyTime.picker( this.id, options );
+        } );
+    }
+
+    jQuery.prototype.AnyTime_noPicker = function()
+    {
+        return this.each( function( i )
+        {
+            AnyTime.noPicker( this.id );
+        } );
+    }
+
+    //	Add special methods to jQuery to compute the height and width
+    //	of picker components differently for Internet Explorer 6.x
+    //  This prevents the pickers from being too tall and wide.
+
+    jQuery.prototype.AnyTime_height = function( inclusive )
+    {
+        return ( __msie6 ?
+                Number( this.css( 'height' ).replace( /[^0-9]/g, '' ) ) :
+                this.outerHeight( inclusive ) );
+    };
+
+    jQuery.prototype.AnyTime_width = function( inclusive )
+    {
+        return ( __msie6 ?
+                (1 + Number( this.css( 'width' ).replace( /[^0-9]/g, '' ) )) :
+                this.outerWidth( inclusive ) );
+    };
+
+
+    // 	Add a method to jQuery to change the classes of an element to
+    //  indicate whether it's value is current (used by AnyTime.picker),
+    //  and another to trigger the click handler for the currently-
+    //  selected button under an element.
+
+    jQuery.prototype.AnyTime_current = function( isCurrent, isLegal )
+    {
+        if( isCurrent )
+        {
+            this.removeClass( 'AnyTime-out-btn ui-state-default ui-state-disabled ui-state-highlight' );
+            this.addClass( 'AnyTime-cur-btn ui-state-default ui-state-highlight' );
+        }
+        else
+        {
+            this.removeClass( 'AnyTime-cur-btn ui-state-highlight' );
+            if( ! isLegal )
+                this.addClass( 'AnyTime-out-btn ui-state-disabled' );
+            else
+                this.removeClass( 'AnyTime-out-btn ui-state-disabled' );
+        }
+    };
+
+    jQuery.prototype.AnyTime_clickCurrent = function()
+    {
+        this.find( '.AnyTime-cur-btn' ).triggerHandler( 'click' );
+    }
+
+    $( document ).ready(
+            function()
+            {
+                //  IE6 doesn't float popups over <select> elements unless an
+                //	<iframe> is inserted between them!  The <iframe> is added to
+                //	the page *before* the popups are moved, so they will appear
+                //  after the <iframe>.
+
+                if( __msie6 )
+                {
+                    __iframe = $( '<iframe frameborder="0" scrolling="no"></iframe>' );
+                    __iframe.src = "javascript:'<html></html>';";
+                    $( __iframe ).css( {
+                        display: 'block',
+                        height: '1px',
+                        left: '0',
+                        top: '0',
+                        width: '1px',
+                        zIndex: 0
+                    } );
+                    $( document.body ).append( __iframe );
+                }
+
+                //  Move popup windows to the end of the page.  This allows them to
+                //  overcome XHTML restrictions on <table> placement enforced by MSIE.
+
+                for( var id in __pickers )
+                    if( ! Array.prototype[id] ) // prototype.js compatibility issue
+                        __pickers[id].onReady();
+
+                __initialized = true;
+
+            } ); // document.ready
+
+//=============================================================================
+//  AnyTime.Converter
+//
+//  This object converts between Date objects and Strings.
+//
+//  To use AnyTime.Converter, simply create an instance for a format string,
+//  and then (repeatedly) invoke the format() and/or parse() methods to
+//  perform the conversions.  For example:
+//
+//    var converter = new AnyTime.Converter({format:'%Y-%m-%d'})
+//    var datetime = converter.parse('1967-07-30') // July 30, 1967 @ 00:00
+//    alert( converter.format(datetime) ); // outputs: 1967-07-30
+//
+//  Constructor parameter:
+//
+//  options - an object of optional parameters that override default behaviors.
+//    The supported options are:
+//
+//    baseYear - the number to add to two-digit years if the %y format
+//      specifier is used.  By default, AnyTime.Converter follows the
+//      MySQL assumption that two-digit years are in the range 1970 to 2069
+//      (see http://dev.mysql.com/doc/refman/5.1/en/y2k-issues.html).
+//      The most common alternatives for baseYear are 1900 and 2000.
+//
+//    dayAbbreviations - an array of seven strings, indexed 0-6, to be used
+//      as ABBREVIATED day names.  If not specified, the following are used:
+//      ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
+//      Note that if the firstDOW option is passed to AnyTime.picker() (see
+//      AnyTime.picker()), this array should nonetheless begin with the 
+//      desired abbreviation for Sunday.
+//
+//    dayNames - an array of seven strings, indexed 0-6, to be used as
+//      day names.  If not specified, the following are used: ['Sunday',
+//        'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
+//      Note that if the firstDOW option is passed to AnyTime.picker() (see
+//      AnyTime.picker()), this array should nonetheless begin with the
+//      desired name for Sunday.
+//
+//    eraAbbreviations - an array of two strings, indexed 0-1, to be used
+//      as ABBREVIATED era names.  Item #0 is the abbreviation for "Before
+//      Common Era" (years before 0001, sometimes represented as negative
+//      years or "B.C"), while item #1 is the abbreviation for "Common Era"
+//      (years from 0001 to present, usually represented as unsigned years
+//      or years "A.D.").  If not specified, the following are used:
+//      ['BCE','CE']
+//
+//    format - a string specifying the pattern of strings involved in the
+//      conversion.  The parse() method can take a string in this format and
+//      convert it to a Date, and the format() method can take a Date object
+//      and convert it to a string matching the format.
+//
+//      Fields in the format string must match those for the DATE_FORMAT()
+//      function in MySQL, as defined here:
+//      http://tinyurl.com/bwd45#function_date-format
+//
+//      IMPORTANT:  Some MySQL specifiers are not supported (especially
+//      those involving day-of-the-year, week-of-the-year) or approximated.
+//      See the code for exact behavior.
+//
+//      In addition to the MySQL format specifiers, the following custom
+//      specifiers are also supported:
+//
+//        %B - If the year is before 0001, then the "Before Common Era"
+//          abbreviation (usually BCE or the obsolete BC) will go here.
+//
+//        %C - If the year is 0001 or later, then the "Common Era"
+//          abbreviation (usually CE or the obsolete AD) will go here.
+//
+//        %E - If the year is before 0001, then the "Before Common Era"
+//          abbreviation (usually BCE or the obsolete BC) will go here.
+//          Otherwise, the "Common Era" abbreviation (usually CE or the
+//          obsolete AD) will go here.
+//
+//        %Z - The current four-digit year, without any sign.  This is
+//          commonly used with years that might be before (or after) 0001,
+//          when the %E (or %B and %C) specifier is used instead of a sign.
+//          For example, 45 BCE is represented "0045".  By comparison, in
+//          the "%Y" format, 45 BCE is represented "-0045".
+//
+//        %z - The current year, without any sign, using only the necessary
+//          number of digits.  This if the year is commonly used with years
+//          that might be before (or after) 0001, when the %E (or %B and %C)
+//          specifier is used instead of a sign.  For example, the year
+//          45 BCE is represented as "45", and the year 312 CE as "312".
+//
+//        %# - the timezone offset, with a sign, in minutes.
+//
+//        %+ - the timezone offset, with a sign, in hours and minutes, in
+//          four-digit, 24-hour format with no delimiter (for example, +0530).
+//          To remember the difference between %+ and %-, it might be helpful
+//          to remember that %+ might have more characters than %-.
+//
+//        %: - the timezone offset, with a sign, in hours and minutes, in
+//          four-digit, 24-hour format with a colon delimiter (for example,
+//          +05:30).  This is similar to the %z format used by Java.  
+//          To remember the difference between %: and %;, it might be helpful
+//          to remember that a colon (:) has a period (.) on the bottom and
+//          a semicolon (;) has a comma (,), and in English sentence structure,
+//          a period represents a more significant stop than a comma, and
+//          %: might be a longer string than %; (I know it's a stretch, but
+//          it's easier than looking it up every time)!
+//  	
+//        %- - the timezone offset, with a sign, in hours and minutes, in
+//          three-or-four-digit, 24-hour format with no delimiter (for
+//          example, +530).
+//
+//        %; - the timezone offset, with a sign, in hours and minutes, in
+//          three-or-four-digit, 24-hour format with a colon delimiter
+//          (for example, +5:30).
+//
+//        %@ - the timezone offset label.  By default, this will be the
+//          string "UTC" followed by the offset, with a sign, in hours and  
+//          minutes, in four-digit, 24-hour format with a colon delimiter
+//          (for example, UTC+05:30).  However, if Any+Time(TM) has been
+//          extended with a member named utcLabel (for example, by the
+//          anytimetz.js file), then it is assumed to be an array of arrays,
+//          where the primary array is indexed by time zone offsets, and
+//          each sub-array contains a potential label for that offset.
+//          When parsing with %@, the array is scanned for matches to the
+//          input string, and if a match is found, the corresponding UTC
+//          offset is used.  When formatting, the array is scanned for a
+//          matching offset, and if one is found, the first member of the
+//          sub-array is used for output (unless overridden with
+//          utcFormatOffsetSubIndex or setUtcFormatOffsetSubIndex()).
+//          If the array does not exist, or does not contain a sub-array
+//          for the offset, then the default format is used.
+//
+//    monthAbbreviations - an array of twelve strings, indexed 0-6, to be
+//      used as ABBREVIATED month names.  If not specified, the following
+//      are used: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep',
+//        'Oct','Nov','Dec']
+//
+//    monthNames - an array of twelve strings, indexed 0-6, to be used as
+//      month names.  If not specified, the following are used:
+//      ['January','February','March','April','May','June','July',
+//        'August','September','October','November','December']
+//
+//    utcFormatOffsetAlleged - the offset from UTC, in minutes, to claim that
+//      a Date object represents during formatting, even though it is formatted
+//      using local time. Unlike utcFormatOffsetImposed, which actually
+//      converts the Date object to the specified different time zone, this
+//      option merely reports the alleged offset when a timezone specifier
+//      (%#, %+, %-, %:, %; %@) is encountered in the format string.
+//      This primarily exists so AnyTime.picker can edit the time as specified
+//      (without conversion to local time) and then convert the edited time to
+//      a different time zone (as selected using the picker).  Any initial
+//      value specified here can be changed by setUtcFormatOffsetAlleged().
+//      If a format offset is alleged, one cannot also be imposed (the imposed
+//      offset is ignored).
+//
+//    utcFormatOffsetImposed - the offset from UTC, in minutes, to specify when
+//      formatting a Date object.  By default, a Date is always formatted
+//      using the local time zone.
+//
+//    utcFormatOffsetSubIndex - when extending AnyTime with a utcLabel array
+//      (for example, by the anytimetz.js file), the specified sub-index is
+//      used to choose the Time Zone label for the UTC offset when formatting
+//      a Date object.  This primarily exists so AnyTime.picker can specify
+//      the label selected using the picker.  Any initial value specified here
+//      can be changed by setUtcFormatOffsetSubIndex().
+//
+//    utcParseOffsetAssumed - the offset from UTC, in minutes, to assume when
+//      parsing a String object.  By default, a Date is always parsed using the
+//      local time zone, unless the format string includes a timezone
+//      specifier (%#, %+, %-, %:, %; or %@), in which case the timezone
+//      specified in the string is used. The Date object created by parsing
+//      always represents local time regardless of the input time zone.
+//
+//    utcParseOffsetCapture - if true, any parsed string is always treated as
+//      though it represents local time, and any offset specified by the string
+//      (or utcParseOffsetAssume) is captured for return by the 
+//      getUtcParseOffsetCaptured() method.  If the %@ format specifier is
+//      used, the sub-index of any matched label is also captured for return
+//      by the getUtcParseOffsetSubIndex() method.  This primarily exists so
+//      AnyTime.picker can edit the time as specified (without conversion to
+//      local time) and then convert the edited time to a different time zone
+//      (as selected using the picker). 
+//=============================================================================
+
+    AnyTime.Converter = function( options )
+    {
+        // private members
+
+        var _flen = 0;
+        var _longDay = 9;
+        var _longMon = 9;
+        var _shortDay = 6;
+        var _shortMon = 3;
+        var _offAl = Number.MIN_VALUE; // format time zone offset alleged
+        var _offCap = Number.MIN_VALUE; // parsed time zone offset captured
+        var _offF = Number.MIN_VALUE; // format time zone offset imposed
+        var _offFSI = (-1); // format time zone label subindex
+        var _offP = Number.MIN_VALUE; // parsed time zone offset assumed
+        var _offPSI = (-1);        // parsed time zone label subindex captured
+        var _captureOffset = false;
+
+        // public members
+
+        this.fmt = '%Y-%m-%d %T';
+        this.dAbbr = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
+        this.dNames = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
+        this.eAbbr = ['BCE','CE'];
+        this.mAbbr = [ 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' ];
+        this.mNames = [ 'January','February','March','April','May','June','July','August','September','October','November','December' ];
+        this.baseYear = null;
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.dAt() returns true if the character in str at pos
+        //  is a digit.
+        //-------------------------------------------------------------------------
+
+        this.dAt = function( str, pos )
+        {
+            return ( (str.charCodeAt( pos ) >= '0'.charCodeAt( 0 )) &&
+                    (str.charCodeAt( pos ) <= '9'.charCodeAt( 0 )) );
+        };
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.format() returns a String containing the value
+        //  of a specified Date object, using the format string passed to
+        //  AnyTime.Converter().
+        //
+        //  Method parameter:
+        //
+        //    date - the Date object to be converted
+        //-------------------------------------------------------------------------
+
+        this.format = function( date )
+        {
+            var d = new Date( date.getTime() );
+            if( ( _offAl == Number.MIN_VALUE ) && ( _offF != Number.MIN_VALUE ) )
+                d.setTime( ( d.getTime() + (d.getTimezoneOffset() * 60000) ) + (_offF * 60000) );
+
+            var t;
+            var str = '';
+            for( var f = 0; f < _flen; f++ )
+            {
+                if( this.fmt.charAt( f ) != '%' )
+                    str += this.fmt.charAt( f );
+                else
+                {
+                    var ch = this.fmt.charAt( f + 1 )
+                    switch( ch )
+                    {
+                        case 'a': // Abbreviated weekday name (Sun..Sat)
+                            str += this.dAbbr[ d.getDay() ];
+                            break;
+                        case 'B': // BCE string (eAbbr[0], usually BCE or BC, only if appropriate) (NON-MYSQL)
+                            if( d.getFullYear() < 0 )
+                                str += this.eAbbr[0];
+                            break;
+                        case 'b': // Abbreviated month name (Jan..Dec)
+                            str += this.mAbbr[ d.getMonth() ];
+                            break;
+                        case 'C': // CE string (eAbbr[1], usually CE or AD, only if appropriate) (NON-MYSQL)
+                            if( d.getFullYear() > 0 )
+                                str += this.eAbbr[1];
+                            break;
+                        case 'c': // Month, numeric (0..12)
+                            str += d.getMonth() + 1;
+                            break;
+                        case 'd': // Day of the month, numeric (00..31)
+                            t = d.getDate();
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            break;
+                        case 'D': // Day of the month with English suffix (0th, 1st,...)
+                            t = String( d.getDate() );
+                            str += t;
+                            if( ( t.length == 2 ) && ( t.charAt( 0 ) == '1' ) )
+                                str += 'th';
+                            else
+                            {
+                                switch( t.charAt( t.length - 1 ) )
+                                {
+                                    case '1':
+                                        str += 'st';
+                                        break;
+                                    case '2':
+                                        str += 'nd';
+                                        break;
+                                    case '3':
+                                        str += 'rd';
+                                        break;
+                                    default:
+                                        str += 'th';
+                                        break;
+                                }
+                            }
+                            break;
+                        case 'E': // era string (from eAbbr[], BCE, CE, BC or AD) (NON-MYSQL)
+                            str += this.eAbbr[ (d.getFullYear() < 0) ? 0 : 1 ];
+                            break;
+                        case 'e': // Day of the month, numeric (0..31)
+                            str += d.getDate();
+                            break;
+                        case 'H': // Hour (00..23)
+                            t = d.getHours();
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            break;
+                        case 'h': // Hour (01..12)
+                        case 'I': // Hour (01..12)
+                            t = d.getHours() % 12;
+                            if( t == 0 )
+                                str += '12';
+                            else
+                            {
+                                if( t < 10 ) str += '0';
+                                str += String( t );
+                            }
+                            break;
+                        case 'i': // Minutes, numeric (00..59)
+                            t = d.getMinutes();
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            break;
+                        case 'k': // Hour (0..23)
+                            str += d.getHours();
+                            break;
+                        case 'l': // Hour (1..12)
+                            t = d.getHours() % 12;
+                            if( t == 0 )
+                                str += '12';
+                            else
+                                str += String( t );
+                            break;
+                        case 'M': // Month name (January..December)
+                            str += this.mNames[ d.getMonth() ];
+                            break;
+                        case 'm': // Month, numeric (00..12)
+                            t = d.getMonth() + 1;
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            break;
+                        case 'p': // AM or PM
+                            str += ( ( d.getHours() < 12 ) ? 'AM' : 'PM' );
+                            break;
+                        case 'r': // Time, 12-hour (hh:mm:ss followed by AM or PM)
+                            t = d.getHours() % 12;
+                            if( t == 0 )
+                                str += '12:';
+                            else
+                            {
+                                if( t < 10 ) str += '0';
+                                str += String( t ) + ':';
+                            }
+                            t = d.getMinutes();
+                            if( t < 10 ) str += '0';
+                            str += String( t ) + ':';
+                            t = d.getSeconds();
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            str += ( ( d.getHours() < 12 ) ? 'AM' : 'PM' );
+                            break;
+                        case 'S': // Seconds (00..59)
+                        case 's': // Seconds (00..59)
+                            t = d.getSeconds();
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            break;
+                        case 'T': // Time, 24-hour (hh:mm:ss)
+                            t = d.getHours();
+                            if( t < 10 ) str += '0';
+                            str += String( t ) + ':';
+                            t = d.getMinutes();
+                            if( t < 10 ) str += '0';
+                            str += String( t ) + ':';
+                            t = d.getSeconds();
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            break;
+                        case 'W': // Weekday name (Sunday..Saturday)
+                            str += this.dNames[ d.getDay() ];
+                            break;
+                        case 'w': // Day of the week (0=Sunday..6=Saturday)
+                            str += d.getDay();
+                            break;
+                        case 'Y': // Year, numeric, four digits (negative if before 0001)
+                            str += AnyTime.pad( d.getFullYear(), 4 );
+                            break;
+                        case 'y': // Year, numeric (two digits, negative if before 0001)
+                            t = d.getFullYear() % 100;
+                            str += AnyTime.pad( t, 2 );
+                            break;
+                        case 'Z': // Year, numeric, four digits, unsigned (NON-MYSQL)
+                            str += AnyTime.pad( Math.abs( d.getFullYear() ), 4 );
+                            break;
+                        case 'z': // Year, numeric, variable length, unsigned (NON-MYSQL)
+                            str += Math.abs( d.getFullYear() );
+                            break;
+                        case '%': // A literal '%' character
+                            str += '%';
+                            break;
+                        case '#': // signed timezone offset in minutes
+                            t = ( _offAl != Number.MIN_VALUE ) ? _offAl :
+                                    ( _offF == Number.MIN_VALUE ) ? (0 - d.getTimezoneOffset()) : _offF;
+                            if( t >= 0 )
+                                str += '+';
+                            str += t;
+                            break;
+                        case '@': // timezone offset label
+                            t = ( _offAl != Number.MIN_VALUE ) ? _offAl :
+                                    ( _offF == Number.MIN_VALUE ) ? (0 - d.getTimezoneOffset()) : _offF;
+                            if( AnyTime.utcLabel && AnyTime.utcLabel[t] )
+                            {
+                                if( ( _offFSI > 0 ) && ( _offFSI < AnyTime.utcLabel[t].length ) )
+                                    str += AnyTime.utcLabel[t][_offFSI];
+                                else
+                                    str += AnyTime.utcLabel[t][0];
+                                break;
+                            }
+                            str += 'UTC';
+                            ch = ':'; // drop through for offset formatting
+                        case '+': // signed, 4-digit timezone offset in hours and minutes
+                        case '-': // signed, 3-or-4-digit timezone offset in hours and minutes
+                        case ':': // signed 4-digit timezone offset with colon delimiter
+                        case ';': // signed 3-or-4-digit timezone offset with colon delimiter
+                            t = ( _offAl != Number.MIN_VALUE ) ? _offAl :
+                                    ( _offF == Number.MIN_VALUE ) ? (0 - d.getTimezoneOffset()) : _offF;
+                            if( t < 0 )
+                                str += '-';
+                            else
+                                str += '+';
+                            t = Math.abs( t );
+                            str += ((ch == '+') || (ch == ':')) ? AnyTime.pad( Math.floor( t / 60 ), 2 ) : Math.floor( t / 60 );
+                            if( (ch == ':') || (ch == ';') )
+                                str += ':';
+                            str += AnyTime.pad( t % 60, 2 );
+                            break;
+                        case 'f': // Microseconds (000000..999999)
+                        case 'j': // Day of year (001..366)
+                        case 'U': // Week (00..53), where Sunday is the first day of the week
+                        case 'u': // Week (00..53), where Monday is the first day of the week
+                        case 'V': // Week (01..53), where Sunday is the first day of the week; used with %X
+                        case 'v': // Week (01..53), where Monday is the first day of the week; used with %x
+                        case 'X': // Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V
+                        case 'x': // Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v
+                            throw '%' + ch + ' not implemented by AnyTime.Converter';
+                        default: // for any character not listed above
+                            str += this.fmt.substr( f, 2 );
+                    } // switch ( this.fmt.charAt(f+1) )
+                    f++;
+                } // else
+            } // for ( var f = 0 ; f < _flen ; f++ )
+            return str;
+
+        }; // AnyTime.Converter.format()
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.getUtcParseOffsetCaptured() returns the UTC offset
+        //  last captured by a parsed string (or assumed by utcParseOffsetAssumed).
+        //  It returns Number.MIN_VALUE if this object was not constructed with
+        //  the utcParseOffsetCapture option set to true, or if an offset was not
+        //  specified by the last parsed string or utcParseOffsetAssumed.
+        //-------------------------------------------------------------------------
+
+        this.getUtcParseOffsetCaptured = function()
+        {
+            return _offCap;
+        };
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.getUtcParseOffsetCaptured() returns the UTC offset
+        //  last captured by a parsed string (or assumed by utcParseOffsetAssumed).
+        //  It returns Number.MIN_VALUE if this object was not constructed with
+        //  the utcParseOffsetCapture option set to true, or if an offset was not
+        //  specified by the last parsed string or utcParseOffsetAssumed.
+        //-------------------------------------------------------------------------
+
+        this.getUtcParseOffsetSubIndex = function()
+        {
+            return _offPSI;
+        };
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.parse() returns a Date initialized from a specified
+        //  string, using the format passed to AnyTime.Converter().
+        //
+        //  Method parameter:
+        //
+        //    str - the String object to be converted
+        //-------------------------------------------------------------------------
+
+        this.parse = function( str )
+        {
+            _offCap = _offP;
+            _offPSI = (-1);
+            var era = 1;
+            var time = new Date( 4, 0, 1, 0, 0, 0, 0 );//4=leap year bug
+            var slen = str.length;
+            var s = 0;
+            var tzSign = 1, tzOff = _offP;
+            var i, matched, sub, sublen, temp;
+            for( var f = 0; f < _flen; f++ )
+            {
+                if( this.fmt.charAt( f ) == '%' )
+                {
+                    var ch = this.fmt.charAt( f + 1 );
+                    switch( ch )
+                    {
+                        case 'a': // Abbreviated weekday name (Sun..Sat)
+                            matched = false;
+                            for( sublen = 0; s + sublen < slen; sublen++ )
+                            {
+                                sub = str.substr( s, sublen );
+                                for( i = 0; i < 12; i++ )
+                                    if( this.dAbbr[i] == sub )
+                                    {
+                                        matched = true;
+                                        s += sublen;
+                                        break;
+                                    }
+                                if( matched )
+                                    break;
+                            } // for ( sublen ... )
+                            if( ! matched )
+                                throw 'unknown weekday: ' + str.substr( s );
+                            break;
+                        case 'B': // BCE string (eAbbr[0]), only if needed. (NON-MYSQL)
+                            sublen = this.eAbbr[0].length;
+                            if( ( s + sublen <= slen ) && ( str.substr( s, sublen ) == this.eAbbr[0] ) )
+                            {
+                                era = (-1);
+                                s += sublen;
+                            }
+                            break;
+                        case 'b': // Abbreviated month name (Jan..Dec)
+                            matched = false;
+                            for( sublen = 0; s + sublen < slen; sublen++ )
+                            {
+                                sub = str.substr( s, sublen );
+                                for( i = 0; i < 12; i++ )
+                                    if( this.mAbbr[i] == sub )
+                                    {
+                                        time.setMonth( i );
+                                        matched = true;
+                                        s += sublen;
+                                        break;
+                                    }
+                                if( matched )
+                                    break;
+                            } // for ( sublen ... )
+                            if( ! matched )
+                                throw 'unknown month: ' + str.substr( s );
+                            break;
+                        case 'C': // CE string (eAbbr[1]), only if needed. (NON-MYSQL)
+                            sublen = this.eAbbr[1].length;
+                            if( ( s + sublen <= slen ) && ( str.substr( s, sublen ) == this.eAbbr[1] ) )
+                                s += sublen; // note: CE is the default era
+                            break;
+                        case 'c': // Month, numeric (0..12)
+                            if( ( s + 1 < slen ) && this.dAt( str, s + 1 ) )
+                            {
+                                time.setMonth( (Number( str.substr( s, 2 ) ) - 1) % 12 );
+                                s += 2;
+                            }
+                            else
+                            {
+                                time.setMonth( (Number( str.substr( s, 1 ) ) - 1) % 12 );
+                                s++;
+                            }
+                            break;
+                        case 'D': // Day of the month with English suffix (0th,1st,...)
+                            if( ( s + 1 < slen ) && this.dAt( str, s + 1 ) )
+                            {
+                                time.setDate( Number( str.substr( s, 2 ) ) );
+                                s += 4;
+                            }
+                            else
+                            {
+                                time.setDate( Number( str.substr( s, 1 ) ) );
+                                s += 3;
+                            }
+                            break;
+                        case 'd': // Day of the month, numeric (00..31)
+                            time.setDate( Number( str.substr( s, 2 ) ) );
+                            s += 2;
+                            break;
+                        case 'E': // era string (from eAbbr[]) (NON-MYSQL)
+                            sublen = this.eAbbr[0].length;
+                            if( ( s + sublen <= slen ) && ( str.substr( s, sublen ) == this.eAbbr[0] ) )
+                            {
+                                era = (-1);
+                                s += sublen;
+                            }
+                            else if( ( s + ( sublen = this.eAbbr[1].length ) <= slen ) && ( str.substr( s, sublen ) == this.eAbbr[1] ) )
+                                s += sublen; // note: CE is the default era
+                            else
+                                throw 'unknown era: ' + str.substr( s );
+                            break;
+                        case 'e': // Day of the month, numeric (0..31)
+                            if( ( s + 1 < slen ) && this.dAt( str, s + 1 ) )
+                            {
+                                time.setDate( Number( str.substr( s, 2 ) ) );
+                                s += 2;
+                            }
+                            else
+                            {
+                                time.setDate( Number( str.substr( s, 1 ) ) );
+                                s++;
+                            }
+                            break;
+                        case 'f': // Microseconds (000000..999999)
+                            s += 6; // SKIPPED!
+                            break;
+                        case 'H': // Hour (00..23)
+                            time.setHours( Number( str.substr( s, 2 ) ) );
+                            s += 2;
+                            break;
+                        case 'h': // Hour (01..12)
+                        case 'I': // Hour (01..12)
+                            time.setHours( Number( str.substr( s, 2 ) ) );
+                            s += 2;
+                            break;
+                        case 'i': // Minutes, numeric (00..59)
+                            time.setMinutes( Number( str.substr( s, 2 ) ) );
+                            s += 2;
+                            break;
+                        case 'k': // Hour (0..23)
+                            if( ( s + 1 < slen ) && this.dAt( str, s + 1 ) )
+                            {
+                                time.setHours( Number( str.substr( s, 2 ) ) );
+                                s += 2;
+                            }
+                            else
+                            {
+                                time.setHours( Number( str.substr( s, 1 ) ) );
+                                s++;
+                            }
+                            break;
+                        case 'l': // Hour (1..12)
+                            if( ( s + 1 < slen ) && this.dAt( str, s + 1 ) )
+                            {
+                                time.setHours( Number( str.substr( s, 2 ) ) );
+                                s += 2;
+                            }
+                            else
+                            {
+                                time.setHours( Number( str.substr( s, 1 ) ) );
+                                s++;
+                            }
+                            break;
+                        case 'M': // Month name (January..December)
+                            matched = false;
+                            for( sublen = _shortMon; s + sublen <= slen; sublen++ )
+                            {
+                                if( sublen > _longMon )
+                                    break;
+                                sub = str.substr( s, sublen );
+                                for( i = 0; i < 12; i++ )
+                                {
+                                    if( this.mNames[i] == sub )
+                                    {
+                                        time.setMonth( i );
+                                        matched = true;
+                                        s += sublen;
+                                        break;
+                                    }
+                                }
+                                if( matched )
+                                    break;
+                            }
+                            break;
+                        case 'm': // Month, numeric (00..12)
+                            time.setMonth( (Number( str.substr( s, 2 ) ) - 1) % 12 );
+                            s += 2;
+                            break;
+                        case 'p': // AM or PM
+                            if( time.getHours() == 12 )
+                            {
+                                if( str.charAt( s ) == 'A' )
+                                    time.setHours( 0 );
+                            }
+                            else if( str.charAt( s ) == 'P' )
+                                time.setHours( time.getHours() + 12 );
+                            s += 2;
+                            break;
+                        case 'r': // Time, 12-hour (hh:mm:ss followed by AM or PM)
+                            time.setHours( Number( str.substr( s, 2 ) ) );
+                            time.setMinutes( Number( str.substr( s + 3, 2 ) ) );
+                            time.setSeconds( Number( str.substr( s + 6, 2 ) ) );
+                            if( time.getHours() == 12 )
+                            {
+                                if( str.charAt( s ) == 'A' )
+                                    time.setHours( 0 );
+                            }
+                            else if( str.charAt( s ) == 'P' )
+                                time.setHours( time.getHours() + 12 );
+                            s += 10;
+                            break;
+                        case 'S': // Seconds (00..59)
+                        case 's': // Seconds (00..59)
+                            time.setSeconds( Number( str.substr( s, 2 ) ) );
+                            s += 2;
+                            break;
+                        case 'T': // Time, 24-hour (hh:mm:ss)
+                            time.setHours( Number( str.substr( s, 2 ) ) );
+                            time.setMinutes( Number( str.substr( s + 3, 2 ) ) );
+                            time.setSeconds( Number( str.substr( s + 6, 2 ) ) );
+                            s += 8;
+                            break;
+                        case 'W': // Weekday name (Sunday..Saturday)
+                            matched = false;
+                            for( sublen = _shortDay; s + sublen <= slen; sublen++ )
+                            {
+                                if( sublen > _longDay )
+                                    break;
+                                sub = str.substr( s, sublen );
+                                for( i = 0; i < 7; i++ )
+                                {
+                                    if( this.dNames[i] == sub )
+                                    {
+                                        matched = true;
+                                        s += sublen;
+                                        break;
+                                    }
+                                }
+                                if( matched )
+                                    break;
+                            }
+                            break;
+                        case 'w': // Day of the week (0=Sunday..6=Saturday) (ignored)
+                            s += 1;
+                            break;
+                        case 'Y': // Year, numeric, four digits, negative if before 0001
+                            i = 4;
+                            if( str.substr( s, 1 ) == '-' )
+                                i++;
+                            time.setFullYear( Number( str.substr( s, i ) ) );
+                            s += i;
+                            break;
+                        case 'y': // Year, numeric (two digits), negative before baseYear
+                            i = 2;
+                            if( str.substr( s, 1 ) == '-' )
+                                i++;
+                            temp = Number( str.substr( s, i ) );
+                            if( typeof(this.baseYear) == 'number' )
+                                temp += this.baseYear;
+                            else if( temp < 70 )
+                                temp += 2000;
+                            else
+                                temp += 1900;
+                            time.setFullYear( temp );
+                            s += i;
+                            break;
+                        case 'Z': // Year, numeric, four digits, unsigned (NON-MYSQL)
+                            time.setFullYear( Number( str.substr( s, 4 ) ) );
+                            s += 4;
+                            break;
+                        case 'z': // Year, numeric, variable length, unsigned (NON-MYSQL)
+                            i = 0;
+                            while( ( s < slen ) && this.dAt( str, s ) )
+                                i = ( i * 10 ) + Number( str.charAt( s++ ) );
+                            time.setFullYear( i );
+                            break;
+                        case '#': // signed timezone offset in minutes.
+                            if( str.charAt( s++ ) == '-' )
+                                tzSign = (-1);
+                            for( tzOff = 0; ( s < slen ) && (String( i = Number( str.charAt( s ) ) ) == str.charAt( s )); s++ )
+                                tzOff = ( tzOff * 10 ) + i;
+                            tzOff *= tzSign;
+                            break;
+                        case '@': // timezone label
+                            _offPSI = (-1);
+                            if( AnyTime.utcLabel )
+                            {
+                                matched = false;
+                                for( tzOff in AnyTime.utcLabel )
+                                    if( ! Array.prototype[tzOff] ) // prototype.js compatibility issue
+                                    {
+                                        for( i = 0; i < AnyTime.utcLabel[tzOff].length; i++ )
+                                        {
+                                            sub = AnyTime.utcLabel[tzOff][i];
+                                            sublen = sub.length;
+                                            if( ( s + sublen <= slen ) && ( str.substr( s, sublen ) == sub ) )
+                                            {
+                                                s += sublen;
+                                                matched = true;
+                                                break;
+                                            }
+                                        }
+                                        if( matched )
+                                            break;
+                                    }
+                                if( matched )
+                                {
+                                    _offPSI = i;
+                                    tzOff = Number( tzOff );
+                                    break; // case
+                                }
+                            }
+                            if( ( s + 9 < slen ) || ( str.substr( s, 3 ) != "UTC" ) )
+                                throw 'unknown time zone: ' + str.substr( s );
+                            s += 3;
+                            ch = ':'; // drop through for offset parsing
+                        case '-': // signed, 3-or-4-digit timezone offset in hours and minutes
+                        case '+': // signed, 4-digit timezone offset in hours and minutes
+                        case ':': // signed 4-digit timezone offset with colon delimiter
+                        case ';': // signed 3-or-4-digit timezone offset with colon delimiter
+                            if( str.charAt( s++ ) == '-' )
+                                tzSign = (-1);
+                            tzOff = Number( str.charAt( s ) );
+                            if( (ch == '+') || (ch == ':') || ((s + 3 < slen) && (String( Number( str.charAt( s + 3 ) ) ) !== str.charAt( s + 3 ))) )
+                                tzOff = (tzOff * 10) + Number( str.charAt( ++s ) );
+                            tzOff *= 60;
+                            if( (ch == ':') || (ch == ';') )
+                                s++; // skip ":" (assumed)
+                            tzOff = ( tzOff + Number( str.substr( ++s, 2 ) ) ) * tzSign;
+                            s += 2;
+                            break;
+                        case 'j': // Day of year (001..366)
+                        case 'U': // Week (00..53), where Sunday is the first day of the week
+                        case 'u': // Week (00..53), where Monday is the first day of the week
+                        case 'V': // Week (01..53), where Sunday is the first day of the week; used with %X
+                        case 'v': // Week (01..53), where Monday is the first day of the week; used with %x
+                        case 'X': // Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V
+                        case 'x': // Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v
+                            throw '%' + this.fmt.charAt( f + 1 ) + ' not implemented by AnyTime.Converter';
+                        case '%': // A literal '%' character
+                        default: // for any character not listed above
+                            throw '%' + this.fmt.charAt( f + 1 ) + ' reserved for future use';
+                            break;
+                    }
+                    f++;
+                } // if ( this.fmt.charAt(f) == '%' )
+                else if( this.fmt.charAt( f ) != str.charAt( s ) )
+                    throw str + ' is not in "' + this.fmt + '" format';
+                else
+                    s++;
+            } // for ( var f ... )
+            if( era < 0 )
+                time.setFullYear( 0 - time.getFullYear() );
+            if( tzOff != Number.MIN_VALUE )
+            {
+                if( _captureOffset )
+                    _offCap = tzOff;
+                else
+                    time.setTime( ( time.getTime() - (tzOff * 60000) ) - (time.getTimezoneOffset() * 60000) );
+            }
+
+            return time;
+
+        }; // AnyTime.Converter.parse()
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.setUtcFormatOffsetAlleged()  sets the offset from 
+        //  UTC, in minutes, to claim that a Date object represents during
+        //  formatting, even though it is formatted using local time.  This merely
+        //  reports the alleged offset when a timezone specifier (%#, %+, %-, %:,
+        //  %; or %@) is encountered in the format string--it does not otherwise
+        //  affect the date/time value.  This primarily exists so AnyTime.picker
+        //  can edit the time as specified (without conversion to local time) and
+        //  then convert the edited time to a different time zone (as selected
+        //  using the picker).  This method returns the previous value, if any,
+        //  set by the utcFormatOffsetAlleged option, or a previous call to
+        //  setUtcFormatOffsetAlleged(), or Number.MIN_VALUE if no offset was
+        //  previously-alleged.  Call this method with Number.MIN_VALUE to cancel
+        //  any prior value.  Note that if a format offset is alleged, any offset
+        //  specified by option utcFormatOffsetImposed is ignored.
+        //-------------------------------------------------------------------------
+
+        this.setUtcFormatOffsetAlleged = function( offset )
+        {
+            var prev = _offAl;
+            _offAl = offset;
+            return prev;
+        };
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.setUtcFormatOffsetSubIndex() sets the sub-index
+        //  to choose from the AnyTime.utcLabel array of arrays when formatting
+        //  a Date using the %@ specifier.  For more information, see option
+        //  AnyTime.Converter.utcFormatOffsetSubIndex.  This primarily exists so
+        //  AnyTime.picker can specify the Time Zone label selected using the
+        //  picker).  This method returns the previous value, if any, set by the
+        //  utcFormatOffsetSubIndex option, or a previous call to
+        //  setUtcFormatOffsetAlleged(), or (-1) if no sub-index was previously-
+        //  chosen.  Call this method with (-1) to cancel any prior value.
+        //-------------------------------------------------------------------------
+
+        this.setUtcFormatOffsetSubIndex = function( subIndex )
+        {
+            var prev = _offFSI;
+            _offFSI = subIndex;
+            return prev;
+        };
+
+        //-------------------------------------------------------------------------
+        //	AnyTime.Converter construction code:
+        //-------------------------------------------------------------------------
+
+        (function( _this )
+        {
+            var i, len;
+
+            options = jQuery.extend( true, {}, options || {} );
+
+            if( options.baseYear )
+                _this.baseYear = Number( options.baseYear );
+
+            if( options.format )
+                _this.fmt = options.format;
+
+            _flen = _this.fmt.length;
+
+            if( options.dayAbbreviations )
+                _this.dAbbr = $.makeArray( options.dayAbbreviations );
+
+            if( options.dayNames )
+            {
+                _this.dNames = $.makeArray( options.dayNames );
+                _longDay = 1;
+                _shortDay = 1000;
+                for( i = 0; i < 7; i++ )
+                {
+                    len = _this.dNames[i].length;
+                    if( len > _longDay )
+                        _longDay = len;
+                    if( len < _shortDay )
+                        _shortDay = len;
+                }
+            }
+
+            if( options.eraAbbreviations )
+                _this.eAbbr = $.makeArray( options.eraAbbreviations );
+
+            if( options.monthAbbreviations )
+                _this.mAbbr = $.makeArray( options.monthAbbreviations );
+
+            if( options.monthNames )
+            {
+                _this.mNames = $.makeArray( options.monthNames );
+                _longMon = 1;
+                _shortMon = 1000;
+                for( i = 0; i < 12; i++ )
+                {
+                    len = _this.mNames[i].length;
+                    if( len > _longMon )
+                        _longMon = len;
+                    if( len < _shortMon )
+                        _shortMon = len;
+                }
+            }
+
+            if( typeof options.utcFormatOffsetImposed != "undefined" )
+                _offF = options.utcFormatOffsetImposed;
+
+            if( typeof options.utcParseOffsetAssumed != "undefined" )
+                _offP = options.utcParseOffsetAssumed;
+
+            if( options.utcParseOffsetCapture )
+                _captureOffset = true;
+
+        })( this ); // AnyTime.Converter construction
+
+    }; // AnyTime.Converter = 
+
+//=============================================================================
+//  AnyTime.noPicker()
+//
+//  Removes the date/time entry picker attached to a specified text field.
+//=============================================================================
+
+    AnyTime.noPicker = function( id )
+    {
+        if( __pickers[id] )
+        {
+            __pickers[id].cleanup();
+            delete __pickers[id];
+        }
+    };
+
+//=============================================================================
+//  AnyTime.picker()
+//
+//  Creates a date/time entry picker attached to a specified text field.
+//  Instead of entering a date and/or time into the text field, the user
+//  selects legal combinations using the picker, and the field is auto-
+//  matically populated.  The picker can be incorporated into the page
+//	"inline", or used as a "popup" that appears when the text field is
+//  clicked and disappears when the picker is dismissed. Ajax can be used
+//  to send the selected value to a server to approve or veto it.
+//
+//  To create a picker, simply include the necessary files in an HTML page
+//  and call the function for each date/time input field.  The following
+//  example creates a popup picker for field "foo" using the default
+//  format, and a second date-only (no time) inline (always-visible)
+//  Ajax-enabled picker for field "bar":
+//
+//    <link rel="stylesheet" type="text/css" href="anytime.css" />
+//    <script type="text/javascript" src="jquery.js"></script>
+//    <script type="text/javascript" src="anytime.js"></script>
+//    <input type="text" id="foo" tabindex="1" value="1967-07-30 23:45" />
+//    <input type="text" id="bar" tabindex="2" value="01/06/90" />
+//    <script type="text/javascript">
+//      AnyTime.picker( "foo" );
+//      AnyTime.picker( "bar", { placement:"inline", format: "%m/%d/%y",
+//								ajaxOptions { url: "/some/server/page/" } } );
+//    </script>
+//
+//  The appearance of the picker can be extensively modified using CSS styles.
+//  A default appearance can be achieved by the "anytime.css" stylesheet that
+//  accompanies this script.  The default style looks better in browsers other
+//  than Internet Explorer (before IE8) because older versions of IE do not
+//  properly implement the CSS box model standard; however, it is passable in
+//  Internet Explorer as well.
+//
+//  Method parameters:
+//
+//  id - the "id" attribute of the textfield to associate with the
+//    AnyTime.picker object.  The AnyTime.picker will attach itself
+//    to the textfield and manage its value.
+//
+//  options - an object (associative array) of optional parameters that
+//    override default behaviors.  The supported options are:
+//
+//    ajaxOptions - options passed to jQuery's $.ajax() method whenever
+//      the user dismisses a popup picker or selects a value in an inline
+//      picker.  The input's name (or ID) and value are passed to the
+//      server (appended to ajaxOptions.data, if present), and the
+//      "success" handler sets the input's value to the responseText.
+//      Therefore, the text returned by the server must be valid for the
+//      input'sdate/time format, and the server can approve or veto the
+//      value chosen by the user. For more information, see:
+//      http://docs.jquery.com/Ajax.
+//      If ajaxOptions.success is specified, it is used instead of the
+//      default "success" behavior.
+//
+//    askEra - if true, buttons to select the era are shown on the year
+//        selector popup, even if format specifier does not include the
+//        era.  If false, buttons to select the era are NOT shown, even
+//        if the format specifier includes ther era.  Normally, era buttons
+//        are only shown if the format string specifies the era.
+//
+//    askSecond - if false, buttons for number-of-seconds are not shown
+//        even if the format includes seconds.  Normally, the buttons
+//        are shown if the format string includes seconds.
+//
+//    earliest - String or Date object representing the earliest date/time
+//        that a user can select.  For best results if the field is only
+//        used to specify a date, be sure to set the time to 00:00:00.
+//        If a String is used, it will be parsed according to the picker's
+//        format (see AnyTime.Converter.format()).
+//
+//    firstDOW - a value from 0 (Sunday) to 6 (Saturday) stating which
+//      day should appear at the beginning of the week.  The default is 0
+//      (Sunday).  The most common substitution is 1 (Monday).  Note that
+//      if custom arrays are specified for AnyTime.Converter's dayAbbreviations
+//      and/or dayNames options, they should nonetheless begin with the
+//      value for Sunday.
+//
+//    hideInput - if true, the <input> is "hidden" (the picker appears in 
+//      its place). This actually sets the border, height, margin, padding
+//      and width of the field as small as possivle, so it can still get focus.
+//      If you try to hide the field using traditional techniques (such as
+//      setting "display:none"), the picker will not behave correctly.
+//
+//    labelDayOfMonth - the label for the day-of-month "buttons".
+//      Can be any HTML!  If not specified, "Day of Month" is assumed.
+//
+//    labelDismiss - the label for the dismiss "button" (if placement is
+//      "popup"). Can be any HTML!  If not specified, "X" is assumed.
+//
+//    labelHour - the label for the hour "buttons".
+//      Can be any HTML!  If not specified, "Hour" is assumed.
+//
+//    labelMinute - the label for the minute "buttons".
+//      Can be any HTML!  If not specified, "Minute" is assumed.
+//
+//    labelMonth - the label for the month "buttons".
+//      Can be any HTML!  If not specified, "Month" is assumed.
+//
+//    labelTimeZone - the label for the UTC offset (timezone) "buttons".
+//      Can be any HTML!  If not specified, "Time Zone" is assumed.
+//
+//    labelSecond - the label for the second "buttons".
+//      Can be any HTML!  If not specified, "Second" is assumed.
+//      This option is ignored if askSecond is false!
+//
+//    labelTitle - the label for the "title bar".  Can be any HTML!
+//      If not specified, then whichever of the following is most
+//      appropriate is used:  "Select a Date and Time", "Select a Date"
+//      or "Select a Time", or no label if only one field is present.
+//
+//    labelYear - the label for the year "buttons".
+//      Can be any HTML!  If not specified, "Year" is assumed.
+//
+//    latest - String or Date object representing the latest date/time
+//        that a user can select.  For best results if the field is only
+//        used to specify a date, be sure to set the time to 23:59:59.
+//        If a String is used, it will be parsed according to the picker's
+//        format (see AnyTime.Converter.format()).
+//
+//    placement - One of the following strings:
+//
+//      "popup" = the picker appears above its <input> when the input
+//        receives focus, and disappears when it is dismissed.  This is
+//        the default behavior.
+//
+//      "inline" = the picker is placed immediately after the <input>
+//        and remains visible at all times.  When choosing this placement,
+//        it is best to make the <input> invisible and use only the
+//        picker to select dates.  The <input> value can still be used
+//        during form submission as it will always reflect the current
+//        picker state.
+//
+//        WARNING: when using "inline" and XHTML and including a day-of-
+//        the-month format field, the input may only appear where a <table>
+//        element is permitted (for example, NOT within a <p> element).
+//        This is because the picker uses a <table> element to arrange
+//        the day-of-the-month (calendar) buttons.  Failure to follow this
+//        advice may result in an "unknown error" in Internet Explorer.
+//
+//    The following additional options may be specified; see documentation
+//    for AnyTime.Converter (above) for information about these options:
+//
+//      baseYear
+//      dayAbbreviations
+//      dayNames
+//      eraAbbreviations
+//      format
+//      monthAbbreviations
+//      monthNames
+//
+//  Other behavior, such as how to format the values on the display
+//  and which "buttons" to include, is inferred from the format string.
+//=============================================================================
+
+    AnyTime.picker = function( id, options )
+    {
+        //  Create a new private object instance to manage the picker,
+        //  if one does not already exist.
+
+        if( __pickers[id] )
+            throw 'Cannot create another AnyTime picker for "' + id + '"';
+
+        var _this = null;
+
+        __pickers[id] =
+        {
+            //  private members
+
+            twelveHr: false,
+            ajaxOpts: null,        // options for AJAX requests
+            denyTab: true,      // set to true to stop Opera from tabbing away
+            askEra: false,        // prompt the user for the era in yDiv?
+            cloak: null,        // cloak div
+            conv: null,            // AnyTime.Converter
+            bMinW: 0,            // min width of body div
+            bMinH: 0,            // min height of body div
+            dMinW: 0,            // min width of date div
+            dMinH: 0,            // min height of date div
+            div: null,            // picker div
+            dB: null,            // body div
+            dD: null,            // date div
+            dY: null,            // years div
+            dMo: null,            // months div
+            dDoM: null,            // date-of-month table
+            hDoM: null,            // date-of-month heading
+            hMo: null,            // month heading
+            hTitle: null,        // title heading
+            hY: null,            // year heading
+            dT: null,            // time div
+            dH: null,            // hours div
+            dM: null,            // minutes div
+            dS: null,            // seconds div
+            dO: null,           // offset (time zone) div
+            earliest: null,        // earliest selectable date/time
+            fBtn: null,            // button with current focus
+            fDOW: 0,            // index to use as first day-of-week
+            hBlur: null,        // input handler
+            hClick: null,       // input handler
+            hFocus: null,       // input handler
+            hKeydown: null,     // input handler
+            hKeypress: null,    // input handler
+            id: null,            // picker ID
+            inp: null,            // input text field
+            latest: null,        // latest selectable date/time
+            lastAjax: null,        // last value submitted using AJAX
+            lostFocus: false,    // when focus is lost, must redraw
+            lX: 'X',            // label for dismiss button
+            lY: 'Year',            // label for year
+            lO: 'Time Zone',    // label for UTC offset (time zone)
+            oBody: null,        // UTC offset selector popup
+            oConv: null,        // AnyTime.Converter for offset display
+            oCur: null,         // current-UTC-offset button
+            oDiv: null,            // UTC offset selector popup
+            oLab: null,            // UTC offset label
+            oListMinW: 0,       // min width of offset list element
+            oMinW: 0,           // min width of UTC offset element
+            oSel: null,         // select (plus/minus) UTC-offset button
+            offMin: Number.MIN_VALUE, // current UTC offset in minutes
+            offSI: -1,          // current UTC label sub-index (if any)
+            offStr: "",         // current UTC offset (time zone) string
+            pop: true,            // picker is a popup?
+            time: null,            // current date/time
+            tMinW: 0,            // min width of time div
+            tMinH: 0,            // min height of time div
+            url: null,            // URL to submit value using AJAX
+            wMinW: 0,            // min width of picker
+            wMinH: 0,            // min height of picker
+            yAhead: null,        // years-ahead button
+            y0XXX: null,        // millenium-digit-zero button (for focus)
+            yCur: null,            // current-year button
+            yDiv: null,            // year selector popup
+            yLab: null,            // year label
+            yNext: null,        // next-year button
+            yPast: null,        // years-past button
+            yPrior: null,        // prior-year button
+
+            //---------------------------------------------------------------------
+            //  .initialize() initializes the picker instance.
+            //---------------------------------------------------------------------
+
+            initialize: function( id )
+            {
+                _this = this;
+
+                this.id = 'AnyTime--' + id.replace( /[^-_.A-Za-z0-9]/g, '--AnyTime--' );
+
+                options = jQuery.extend( true, {}, options || {} );
+                options.utcParseOffsetCapture = true;
+                this.conv = new AnyTime.Converter( options );
+
+                if( options.placement )
+                {
+                    if( options.placement == 'inline' )
+                        this.pop = false;
+                    else if( options.placement != 'popup' )
+                        throw 'unknown placement: ' + options.placement;
+                }
+
+                if( options.ajaxOptions )
+                {
+                    this.ajaxOpts = jQuery.extend( {}, options.ajaxOptions );
+                    if( ! this.ajaxOpts.success )
+                        this.ajaxOpts.success = function( data, status )
+                        {
+                            _this.inp.val( data );
+                        };
+                }
+
+                if( options.earliest )
+                {
+                    if( typeof options.earliest.getTime == 'function' )
+                        this.earliest = options.earliest.getTime();
+                    else
+                        this.earliest = this.conv.parse( options.earliest.toString() );
+                }
+
+                if( options.firstDOW )
+                {
+                    if( ( options.firstDOW < 0 ) || ( options.firstDOW > 6 ) )
+                        throw new Exception( 'illegal firstDOW: ' + options.firstDOW );
+                    this.fDOW = options.firstDOW;
+                }
+
+                if( options.latest )
+                {
+                    if( typeof options.latest.getTime == 'function' )
+                        this.latest = options.latest.getTime();
+                    else
+                        this.latest = this.conv.parse( options.latest.toString() );
+                }
+
+                this.lX = options.labelDismiss || 'X';
+                this.lY = options.labelYear || 'Year';
+                this.lO = options.labelTimeZone || 'Time Zone';
+
+                //  Infer what we can about what to display from the format.
+
+                var i;
+                var t;
+                var lab;
+                var shownFields = 0;
+                var format = this.conv.fmt;
+
+                if( typeof options.askEra != 'undefined' )
+                    this.askEra = options.askEra;
+                else
+                    this.askEra = (format.indexOf( '%B' ) >= 0) || (format.indexOf( '%C' ) >= 0) || (format.indexOf( '%E' ) >= 0);
+                var askYear = (format.indexOf( '%Y' ) >= 0) || (format.indexOf( '%y' ) >= 0) || (format.indexOf( '%Z' ) >= 0) || (format.indexOf( '%z' ) >= 0);
+                var askMonth = (format.indexOf( '%b' ) >= 0) || (format.indexOf( '%c' ) >= 0) || (format.indexOf( '%M' ) >= 0) || (format.indexOf( '%m' ) >= 0);
+                var askDoM = (format.indexOf( '%D' ) >= 0) || (format.indexOf( '%d' ) >= 0) || (format.indexOf( '%e' ) >= 0);
+                var askDate = askYear || askMonth || askDoM;
+                this.twelveHr = (format.indexOf( '%h' ) >= 0) || (format.indexOf( '%I' ) >= 0) || (format.indexOf( '%l' ) >= 0) || (format.indexOf( '%r' ) >= 0);
+                var askHour = this.twelveHr || (format.indexOf( '%H' ) >= 0) || (format.indexOf( '%k' ) >= 0) || (format.indexOf( '%T' ) >= 0);
+                var askMinute = (format.indexOf( '%i' ) >= 0) || (format.indexOf( '%r' ) >= 0) || (format.indexOf( '%T' ) >= 0);
+                var askSec = ( (format.indexOf( '%r' ) >= 0) || (format.indexOf( '%S' ) >= 0) || (format.indexOf( '%s' ) >= 0) || (format.indexOf( '%T' ) >= 0) );
+                if( askSec && ( typeof options.askSecond != 'undefined' ) )
+                    askSec = options.askSecond;
+                var askOff = ( (format.indexOf( '%#' ) >= 0) || (format.indexOf( '%+' ) >= 0) || (format.indexOf( '%-' ) >= 0) || (format.indexOf( '%:' ) >= 0) || (format.indexOf( '%;' ) >= 0) || (format.indexOf( '%<' ) >= 0) || (format.indexOf( '%>' ) >= 0) || (format.indexOf( '%@' ) >= 0) );
+                var askTime = askHour || askMinute || askSec || askOff;
+
+                if( askOff )
+                    this.oConv = new AnyTime.Converter( { format: options.formatUtcOffset ||
+                            format.match( /\S*%[-+:;<>#@]\S*/g ).join( ' ' ) } );
+
+                //  Create the picker HTML and add it to the page.
+                //  Popup pickers will be moved to the end of the body
+                //  once the entire page has loaded.
+
+                this.inp = $( document.getElementById( id ) ); // avoids ID-vs-pseudo-selector probs like id="foo:bar"
+                this.div = $( '<div class="AnyTime-win AnyTime-pkr ui-widget ui-widget-content ui-corner-all" style="width:0;height:0" id="' + this.id + '" aria-live="off"/>' );
+                this.inp.after( this.div );
+                this.wMinW = this.div.outerWidth( !$.browser.safari );
+                this.wMinH = this.div.AnyTime_height( true );
+                this.hTitle = $( '<h5 class="AnyTime-hdr ui-widget-header ui-corner-top"/>' );
+                this.div.append( this.hTitle );
+                this.dB = $( '<div class="AnyTime-body" style="width:0;height:0"/>' );
+                this.div.append( this.dB );
+                this.bMinW = this.dB.outerWidth( true );
+                this.bMinH = this.dB.AnyTime_height( true );
+
+                if( options.hideInput )
+                    this.inp.css( {border:0,height:'1px',margin:0,padding:0,width:'1px'} );
+
+                //  Add dismiss box to title (if popup)
+
+                t = null;
+                var xDiv = null;
+                if( this.pop )
+                {
+                    xDiv = $( '<div class="AnyTime-x-btn ui-state-default">' + this.lX + '</div>' );
+                    this.hTitle.append( xDiv );
+                    xDiv.click( function( e )
+                    {
+                        _this.dismiss( e );
+                    } );
+                }
+
+                //  date (calendar) portion
+
+                lab = '';
+                if( askDate )
+                {
+                    this.dD = $( '<div class="AnyTime-date" style="width:0;height:0"/>' );
+                    this.dB.append( this.dD );
+                    this.dMinW = this.dD.outerWidth( true );
+                    this.dMinH = this.dD.AnyTime_height( true );
+
+                    if( askYear )
+                    {
+                        this.yLab = $( '<h6 class="AnyTime-lbl AnyTime-lbl-yr">' + this.lY + '</h6>' );
+                        this.dD.append( this.yLab );
+
+                        this.dY = $( '<ul class="AnyTime-yrs ui-helper-reset" />' );
+                        this.dD.append( this.dY );
+
+                        this.yPast = this.btn( this.dY, '&lt;', this.newYear, ['yrs-past'], '- ' + this.lY );
+                        this.yPrior = this.btn( this.dY, '1', this.newYear, ['yr-prior'], '-1 ' + this.lY );
+                        this.yCur = this.btn( this.dY, '2', this.newYear, ['yr-cur'], this.lY );
+                        this.yCur.removeClass( 'ui-state-default' );
+                        this.yCur.addClass( 'AnyTime-cur-btn ui-state-default ui-state-highlight' );
+
+                        this.yNext = this.btn( this.dY, '3', this.newYear, ['yr-next'], '+1 ' + this.lY );
+                        this.yAhead = this.btn( this.dY, '&gt;', this.newYear, ['yrs-ahead'], '+ ' + this.lY );
+
+                        shownFields++;
+
+                    } // if ( askYear )
+
+                    if( askMonth )
+                    {
+                        lab = options.labelMonth || 'Month';
+                        this.hMo = $( '<h6 class="AnyTime-lbl AnyTime-lbl-month">' + lab + '</h6>' );
+                        this.dD.append( this.hMo );
+                        this.dMo = $( '<ul class="AnyTime-mons" />' );
+                        this.dD.append( this.dMo );
+                        for( i = 0; i < 12; i++ )
+                        {
+                            var mBtn = this.btn( this.dMo, this.conv.mAbbr[i],
+                                    function( event )
+                                    {
+                                        var elem = $( event.target );
+                                        if( elem.hasClass( "AnyTime-out-btn" ) )
+                                            return;
+                                        var mo = event.target.AnyTime_month;
+                                        var t = new Date( this.time.getTime() );
+                                        if( t.getDate() > __daysIn[mo] )
+                                            t.setDate( __daysIn[mo] )
+                                        t.setMonth( mo );
+                                        this.set( t );
+                                        this.upd( elem );
+                                    },
+                                    ['mon','mon' + String( i + 1 )], lab + ' ' + this.conv.mNames[i] );
+                            mBtn[0].AnyTime_month = i;
+                        }
+                        shownFields++;
+                    }
+
+                    if( askDoM )
+                    {
+                        lab = options.labelDayOfMonth || 'Day of Month';
+                        this.hDoM = $( '<h6 class="AnyTime-lbl AnyTime-lbl-dom">' + lab + '</h6>' );
+                        this.dD.append( this.hDoM );
+                        this.dDoM = $( '<table border="0" cellpadding="0" cellspacing="0" class="AnyTime-dom-table"/>' );
+                        this.dD.append( this.dDoM );
+                        t = $( '<thead class="AnyTime-dom-head"/>' );
+                        this.dDoM.append( t );
+                        var tr = $( '<tr class="AnyTime-dow"/>' );
+                        t.append( tr );
+                        for( i = 0; i < 7; i++ )
+                            tr.append( '<th class="AnyTime-dow AnyTime-dow' + String( i + 1 ) + '">' + this.conv.dAbbr[(this.fDOW + i) % 7] + '</th>' );
+
+                        var tbody = $( '<tbody class="AnyTime-dom-body" />' );
+                        this.dDoM.append( tbody );
+                        for( var r = 0; r < 6; r++ )
+                        {
+                            tr = $( '<tr class="AnyTime-wk AnyTime-wk' + String( r + 1 ) + '"/>' );
+                            tbody.append( tr );
+                            for( i = 0; i < 7; i++ )
+                                this.btn( tr, 'x',
+                                        function( event )
+                                        {
+                                            var elem = $( event.target );
+                                            if( elem.hasClass( "AnyTime-out-btn" ) )
+                                                return;
+                                            var dom = Number( elem.html() );
+                                            if( dom )
+                                            {
+                                                var t = new Date( this.time.getTime() );
+                                                t.setDate( dom );
+                                                this.set( t );
+                                                this.upd( elem );
+                                            }
+                                        },
+                                        ['dom'], lab );
+                        }
+                        shownFields++;
+
+                    } // if ( askDoM )
+
+                } // if ( askDate )
+
+                //  time portion
+
+                if( askTime )
+                {
+                    var tensDiv, onesDiv;
+
+                    this.dT = $( '<div class="AnyTime-time" style="width:0;height:0" />' );
+                    this.dB.append( this.dT );
+                    this.tMinW = this.dT.outerWidth( true );
+                    this.tMinH = this.dT.AnyTime_height( true );
+
+                    if( askHour )
+                    {
+                        this.dH = $( '<div class="AnyTime-hrs"/>' );
+                        this.dT.append( this.dH );
+
+                        lab = options.labelHour || 'Hour';
+                        this.dH.append( $( '<h6 class="AnyTime-lbl AnyTime-lbl-hr">' + lab + '</h6>' ) );
+                        var amDiv = $( '<ul class="AnyTime-hrs-am"/>' );
+                        this.dH.append( amDiv );
+                        var pmDiv = $( '<ul class="AnyTime-hrs-pm"/>' );
+                        this.dH.append( pmDiv );
+
+                        for( i = 0; i < 12; i++ )
+                        {
+                            if( this.twelveHr )
+                            {
+                                if( i == 0 )
+                                    t = '12am';
+                                else
+                                    t = String( i ) + 'am';
+                            }
+                            else
+                                t = AnyTime.pad( i, 2 );
+
+                            this.btn( amDiv, t, this.newHour, ['hr','hr' + String( i )], lab + ' ' + t );
+
+                            if( this.twelveHr )
+                            {
+                                if( i == 0 )
+                                    t = '12pm';
+                                else
+                                    t = String( i ) + 'pm';
+                            }
+                            else
+                                t = i + 12;
+
+                            this.btn( pmDiv, t, this.newHour, ['hr','hr' + String( i + 12 )], lab + ' ' + t );
+                        }
+
+                        shownFields++;
+
+                    } // if ( askHour )
+
+                    if( askMinute )
+                    {
+                        this.dM = $( '<div class="AnyTime-mins"/>' );
+                        this.dT.append( this.dM );
+
+                        lab = options.labelMinute || 'Minute';
+                        this.dM.append( $( '<h6 class="AnyTime-lbl AnyTime-lbl-min">' + lab + '</h6>' ) );
+                        tensDiv = $( '<ul class="AnyTime-mins-tens"/>' );
+                        this.dM.append( tensDiv );
+
+                        for( i = 0; i < 6; i++ )
+                            this.btn( tensDiv, i,
+                                    function( event )
+                                    {
+                                        var elem = $( event.target );
+                                        if( elem.hasClass( "AnyTime-out-btn" ) )
+                                            return;
+                                        var t = new Date( this.time.getTime() );
+                                        t.setMinutes( (Number( elem.text() ) * 10) + (this.time.getMinutes() % 10) );
+                                        this.set( t );
+                                        this.upd( elem );
+                                    },
+                                    ['min-ten','min' + i + '0'], lab + ' ' + i + '0' );
+                        for( ; i < 12; i++ )
+                            this.btn( tensDiv, '&#160;', $.noop, ['min-ten','min' + i + '0'], lab + ' ' + i + '0' ).addClass( 'AnyTime-min-ten-btn-empty ui-state-default ui-state-disabled' );
+
+                        onesDiv = $( '<ul class="AnyTime-mins-ones"/>' );
+                        this.dM.append( onesDiv );
+                        for( i = 0; i < 10; i++ )
+                            this.btn( onesDiv, i,
+                                    function( event )
+                                    {
+                                        var elem = $( event.target );
+                                        if( elem.hasClass( "AnyTime-out-btn" ) )
+                                            return;
+                                        var t = new Date( this.time.getTime() );
+                                        t.setMinutes( (Math.floor( this.time.getMinutes() / 10 ) * 10) + Number( elem.text() ) );
+                                        this.set( t );
+                                        this.upd( elem );
+                                    },
+                                    ['min-one','min' + i], lab + ' ' + i );
+                        for( ; i < 12; i++ )
+                            this.btn( onesDiv, '&#160;', $.noop, ['min-one','min' + i + '0'], lab + ' ' + i ).addClass( 'AnyTime-min-one-btn-empty ui-state-default ui-state-disabled' );
+
+                        shownFields++;
+
+                    } // if ( askMinute )
+
+                    if( askSec )
+                    {
+                        this.dS = $( '<div class="AnyTime-secs"/>' );
+                        this.dT.append( this.dS );
+                        lab = options.labelSecond || 'Second';
+                        this.dS.append( $( '<h6 class="AnyTime-lbl AnyTime-lbl-sec">' + lab + '</h6>' ) );
+                        tensDiv = $( '<ul class="AnyTime-secs-tens"/>' );
+                        this.dS.append( tensDiv );
+
+                        for( i = 0; i < 6; i++ )
+                            this.btn( tensDiv, i,
+                                    function( event )
+                                    {
+                                        var elem = $( event.target );
+                                        if( elem.hasClass( "AnyTime-out-btn" ) )
+                                            return;
+                                        var t = new Date( this.time.getTime() );
+                                        t.setSeconds( (Number( elem.text() ) * 10) + (this.time.getSeconds() % 10) );
+                                        this.set( t );
+                                        this.upd( elem );
+                                    },
+                                    ['sec-ten','sec' + i + '0'], lab + ' ' + i + '0' );
+                        for( ; i < 12; i++ )
+                            this.btn( tensDiv, '&#160;', $.noop, ['sec-ten','sec' + i + '0'], lab + ' ' + i + '0' ).addClass( 'AnyTime-sec-ten-btn-empty ui-state-default ui-state-disabled' );
+
+                        onesDiv = $( '<ul class="AnyTime-secs-ones"/>' );
+                        this.dS.append( onesDiv );
+                        for( i = 0; i < 10; i++ )
+                            this.btn( onesDiv, i,
+                                    function( event )
+                                    {
+                                        var elem = $( event.target );
+                                        if( elem.hasClass( "AnyTime-out-btn" ) )
+                                            return;
+                                        var t = new Date( this.time.getTime() );
+                                        t.setSeconds( (Math.floor( this.time.getSeconds() / 10 ) * 10) + Number( elem.text() ) );
+                                        this.set( t );
+                                        this.upd( elem );
+                                    },
+                                    ['sec-one','sec' + i], lab + ' ' + i );
+                        for( ; i < 12; i++ )
+                            this.btn( onesDiv, '&#160;', $.noop, ['sec-one','sec' + i + '0'], lab + ' ' + i ).addClass( 'AnyTime-sec-one-btn-empty ui-state-default ui-state-disabled' );
+
+                        shownFields++;
+
+                    } // if ( askSec )
+
+                    if( askOff )
+                    {
+                        this.dO = $( '<div class="AnyTime-offs" />' );
+                        this.dT.append( this.dO );
+                        this.oMinW = this.dO.outerWidth( true );
+
+                        this.oLab = $( '<h6 class="AnyTime-lbl AnyTime-lbl-off">' + this.lO + '</h6>' );
+                        this.dO.append( this.oLab );
+
+                        var offDiv = $( '<ul class="AnyTime-off-list ui-helper-reset" />' );
+                        this.dO.append( offDiv );
+
+                        this.oCur = this.btn( offDiv, '', this.newOffset, ['off','off-cur'], lab );
+                        this.oCur.removeClass( 'ui-state-default' );
+                        this.oCur.addClass( 'AnyTime-cur-btn ui-state-default ui-state-highlight' );
+                        this.oCur.css( {overflow:"hidden"} );
+
+                        this.oSel = this.btn( offDiv, '&#177;', this.newOffset, ['off','off-select'], '+/- ' + this.lO );
+                        this.oListMinW = this.oCur.outerWidth( true ) + this.oSel.outerWidth( true );
+
+                        shownFields++;
+                    }
+
+                } // if ( askTime )
+
+                //  Set the title.  If a title option has been specified, use it.
+                //  Otherwise, determine a worthy title based on which (and how many)
+                //  format fields have been specified.
+
+                if( options.labelTitle )
+                    this.hTitle.append( options.labelTitle );
+                else if( shownFields > 1 )
+                    this.hTitle.append( 'Select a ' + (askDate ? (askTime ? 'Date and Time' : 'Date') : 'Time') );
+                else
+                    this.hTitle.append( 'Select' );
+
+
+                /** VMIPSL **/
+                if( options.methodToCall )
+                    this.methodToCall = options.methodToCall;
+
+                /** VMIPSL **/
+                if( options.idToUpdateEarliest )
+                    this.idToUpdateEarliest = options.idToUpdateEarliest;
+
+                //  Initialize the picker's date/time value.
+
+                try
+                {
+                    this.time = this.conv.parse( this.inp.val() );
+                    this.offMin = this.conv.getUtcParseOffsetCaptured();
+                    this.offSI = this.conv.getUtcParseOffsetSubIndex();
+                }
+                catch ( e )
+                {
+                    this.time = new Date();
+                }
+                this.lastAjax = this.time;
+
+
+                //  If this is a popup picker, hide it until needed.
+
+                if( this.pop )
+                {
+                    this.div.hide();
+                    if( __iframe )
+                        __iframe.hide();
+                    this.div.css( 'position', 'absolute' );
+                }
+
+                //  Setup event listeners for the input and resize listeners for
+                //  the picker.  Add the picker to the instances list (which is used
+                //  to hide pickers if the user clicks off of them).
+
+                this.inp.blur( this.hBlur =
+                        function( e )
+                        {
+                            _this.inpBlur( e );
+                        } );
+
+                this.inp.click( this.hClick =
+                        function( e )
+                        {
+                            _this.showPkr( e );
+                        } );
+
+                this.inp.focus( this.hFocus =
+                        function( e )
+                        {
+                            if( _this.lostFocus )
+                                _this.showPkr( e );
+                            _this.lostFocus = false;
+                        } );
+
+                this.inp.keydown( this.hKeydown =
+                        function( e )
+                        {
+                            _this.key( e );
+                        } );
+
+                this.inp.keypress( this.hKeypress =
+                        function( e )
+                        {
+                            if( $.browser.opera && _this.denyTab )
+                                e.preventDefault();
+                        } );
+
+                this.div.click(
+                        function( e )
+                        {
+                            _this.lostFocus = false;
+                            _this.inp.focus();
+                        } );
+
+                $( window ).resize(
+                        function( e )
+                        {
+                            _this.pos( e );
+                        } );
+
+                if( __initialized )
+                    this.onReady();
+
+            }, // initialize()
+
+
+            //---------------------------------------------------------------------
+            //  .ajax() notifies the server of a value change using Ajax.
+            //---------------------------------------------------------------------
+
+            ajax: function()
+            {
+                if( this.ajaxOpts && ( this.time.getTime() != this.lastAjax.getTime() ) )
+                {
+                    try
+                    {
+                        var opts = jQuery.extend( {}, this.ajaxOpts );
+                        if( typeof opts.data == 'object' )
+                            opts.data[this.inp[0].name || this.inp[0].id] = this.inp.val();
+                        else
+                        {
+                            var opt = (this.inp[0].name || this.inp[0].id) + '=' + encodeURI( this.inp.val() );
+                            if( opts.data )
+                                opts.data += '&' + opt;
+                            else
+                                opts.data = opt;
+                        }
+                        $.ajax( opts );
+                        this.lastAjax = this.time;
+                    }
+                    catch( e )
+                    {
+                    }
+                }
+                return;
+
+            }, // .ajax()
+
+            //---------------------------------------------------------------------
+            //  .askOffset() is called by this.newOffset() when the UTC offset or
+            //  +- selection button is clicked.
+            //---------------------------------------------------------------------
+
+            askOffset: function( event )
+            {
+                if( ! this.oDiv )
+                {
+                    this.makeCloak();
+
+                    this.oDiv = $( '<div class="AnyTime-win AnyTime-off-selector ui-widget ui-widget-content ui-corner-all" style="position:absolute" />' );
+                    this.div.append( this.oDiv );
+
+                    // the order here (HDR,BODY,XDIV,TITLE) is important for width calcluation:
+                    var title = $( '<h5 class="AnyTime-hdr AnyTime-hdr-off-selector ui-widget-header ui-corner-top" />' );
+                    this.oDiv.append( title );
+                    this.oBody = $( '<div class="AnyTime-body AnyTime-body-off-selector" style="overflow:auto;white-space:nowrap" />' );
+                    this.oDiv.append( this.oBody );
+                    var oBHS = this.oBody.AnyTime_height( true ); // body spacing
+                    var oBWS = this.oBody.AnyTime_width( true );
+                    var oTWS = title.AnyTime_width( true );
+
+                    var xDiv = $( '<div class="AnyTime-x-btn ui-state-default">' + this.lX + '</div>' );
+                    title.append( xDiv );
+                    xDiv.click( function( e )
+                    {
+                        _this.dismissODiv( e );
+                    } );
+                    title.append( this.lO );
+                    if( __msie6 || __msie7 ) // IE bugs!
+                        title.width( String( this.lO.length * 0.8 ) + "em" );
+                    var oBW = title.AnyTime_width( true ) - oBWS; // initial body width
+
+                    var cont = $( '<ul class="AnyTime-off-off" />' );
+                    var last = null;
+                    this.oBody.append( cont );
+                    var useSubIndex = (this.oConv.fmt.indexOf( '%@' ) >= 0);
+                    var btnW = 0; // determine uniform button width
+                    if( AnyTime.utcLabel )
+                        for( var o = -720; o < 720; o++ )
+                            if( AnyTime.utcLabel[o] )
+                            {
+                                this.oConv.setUtcFormatOffsetAlleged( o );
+                                for( var i = 0; i < AnyTime.utcLabel[o].length; i++ )
+                                {
+                                    this.oConv.setUtcFormatOffsetSubIndex( i );
+                                    last = this.btn( cont, this.oConv.format( this.time ), this.newOPos, ['off-off'], o );
+                                    last[0].AnyTime_offMin = o;
+                                    last[0].AnyTime_offSI = i;
+                                    var w = last.width();
+                                    if( w > btnW )
+                                        btnW = w;
+                                    if( ! useSubIndex )
+                                        break; // for
+                                }
+                            }
+
+                    if( last )
+                        last.addClass( 'AnyTime-off-off-last-btn' );
+
+                    // compute optimal width
+
+                    this.oBody.find( '.AnyTime-off-off-btn' ).width( btnW ); // set uniform button width
+                    if( last )
+                    {
+                        var lW = last.AnyTime_width( true );
+                        if( lW > oBW )
+                            oBW = lW + 1; // expand body to hold buttons
+                    }
+                    this.oBody.width( oBW );
+                    oBW = this.oBody.AnyTime_width( true );
+                    this.oDiv.width( oBW );
+                    if( __msie6 || __msie7 ) // IE bugs!
+                        title.width( oBW - oTWS );
+
+                    // compute optimal height
+
+                    var oH = this.oDiv.AnyTime_height( true );
+                    var oHmax = this.div.height() * 0.75;
+                    if( oH > oHmax )
+                    {
+                        oH = oHmax;
+                        this.oBody.height( oH - (title.AnyTime_height( true ) + oBHS) );
+                        this.oBody.width( this.oBody.width() + 20 ); // add nominal px for scrollbar 
+                        this.oDiv.width( this.oDiv.width() + 20 );
+                        if( __msie6 || __msie7 ) // IE bugs!
+                            title.width( this.oBody.AnyTime_width( true ) - oTWS );
+                    }
+                    if( ! __msie7 ) // IE7 bug!
+                        this.oDiv.height( String( oH ) + 'px' );
+
+                } // if ( ! this.oDiv )
+                else
+                {
+                    this.cloak.show();
+                    this.oDiv.show();
+                }
+                this.pos( event );
+                this.updODiv( null );
+
+                var f = this.oDiv.find( '.AnyTime-off-off-btn.AnyTime-cur-btn:first' );
+                if( ! f.length )
+                    f = this.oDiv.find( '.AnyTime-off-off-btn:first' );
+                this.setFocus( f );
+
+            }, // .askOffset()
+
+            //---------------------------------------------------------------------
+            //  .askYear() is called by this.newYear() when the yPast or yAhead
+            //  button is clicked.
+            //---------------------------------------------------------------------
+
+            askYear: function( event )
+            {
+                if( ! this.yDiv )
+                {
+                    this.makeCloak();
+
+                    this.yDiv = $( '<div class="AnyTime-win AnyTime-yr-selector ui-widget ui-widget-content ui-corner-all" style="position:absolute" />' );
+                    this.div.append( this.yDiv );
+
+                    var title = $( '<h5 class="AnyTime-hdr AnyTime-hdr-yr-selector ui-widget-header ui-corner-top" />' );
+                    this.yDiv.append( title );
+
+                    var xDiv = $( '<div class="AnyTime-x-btn ui-state-default">' + this.lX + '</div>' );
+                    title.append( xDiv );
+                    xDiv.click( function( e )
+                    {
+                        _this.dismissYDiv( e );
+                    } );
+
+                    title.append( this.lY );
+
+                    var yBody = $( '<div class="AnyTime-body AnyTime-body-yr-selector" />' );
+                    var yW = yBody.AnyTime_width( true );
+                    var yH = 0;
+                    this.yDiv.append( yBody );
+
+                    cont = $( '<ul class="AnyTime-yr-mil" />' );
+                    yBody.append( cont );
+                    this.y0XXX = this.btn( cont, 0, this.newYPos, ['mil','mil0'], this.lY + ' ' + 0 + '000' );
+                    for( i = 1; i < 10; i++ )
+                        this.btn( cont, i, this.newYPos, ['mil','mil' + i], this.lY + ' ' + i + '000' );
+                    yW += cont.AnyTime_width( true );
+                    if( yH < cont.AnyTime_height( true ) )
+                        yH = cont.AnyTime_height( true );
+
+                    cont = $( '<ul class="AnyTime-yr-cent" />' );
+                    yBody.append( cont );
+                    for( i = 0; i < 10; i++ )
+                        this.btn( cont, i, this.newYPos, ['cent','cent' + i], this.lY + ' ' + i + '00' );
+                    yW += cont.AnyTime_width( true );
+                    if( yH < cont.AnyTime_height( true ) )
+                        yH = cont.AnyTime_height( true );
+
+                    cont = $( '<ul class="AnyTime-yr-dec" />' );
+                    yBody.append( cont );
+                    for( i = 0; i < 10; i++ )
+                        this.btn( cont, i, this.newYPos, ['dec','dec' + i], this.lY + ' ' + i + '0' );
+                    yW += cont.AnyTime_width( true );
+                    if( yH < cont.AnyTime_height( true ) )
+                        yH = cont.AnyTime_height( true );
+
+                    cont = $( '<ul class="AnyTime-yr-yr" />' );
+                    yBody.append( cont );
+                    for( i = 0; i < 10; i++ )
+                        this.btn( cont, i, this.newYPos, ['yr','yr' + i], this.lY + ' ' + i );
+                    yW += cont.AnyTime_width( true );
+                    if( yH < cont.AnyTime_height( true ) )
+                        yH = cont.AnyTime_height( true );
+
+                    if( this.askEra )
+                    {
+                        cont = $( '<ul class="AnyTime-yr-era" />' );
+                        yBody.append( cont );
+
+                        this.btn( cont, this.conv.eAbbr[0],
+                                function( event )
+                                {
+                                    var t = new Date( this.time.getTime() );
+                                    var year = t.getFullYear();
+                                    if( year > 0 )
+                                        t.setFullYear( 0 - year );
+                                    this.set( t );
+                                    this.updYDiv( $( event.target ) );
+                                },
+                                ['era','bce'], this.conv.eAbbr[0] );
+
+                        this.btn( cont, this.conv.eAbbr[1],
+                                function( event )
+                                {
+                                    var t = new Date( this.time.getTime() );
+                                    var year = t.getFullYear();
+                                    if( year < 0 )
+                                        t.setFullYear( 0 - year );
+                                    this.set( t );
+                                    this.updYDiv( $( event.target ) );
+                                },
+                                ['era','ce'], this.conv.eAbbr[1] );
+
+                        yW += cont.AnyTime_width( true );
+                        if( yH < cont.AnyTime_height( true ) )
+                            yH = cont.AnyTime_height( true );
+
+                    } // if ( this.askEra )
+
+                    if( $.browser.msie ) // IE8+ThemeUI bug!
+                        yW += 1;
+                    else if( $.browser.safari ) // Safari small-text bug!
+                        yW += 2;
+                    yH += yBody.AnyTime_height( true );
+                    yBody.css( 'width', String( yW ) + 'px' );
+                    if( ! __msie7 ) // IE7 bug!
+                        yBody.css( 'height', String( yH ) + 'px' );
+                    if( __msie6 || __msie7 ) // IE bugs!
+                        title.width( yBody.outerWidth( true ) );
+                    yH += title.AnyTime_height( true );
+                    if( title.AnyTime_width( true ) > yW )
+                        yW = title.AnyTime_width( true );
+                    this.yDiv.css( 'width', String( yW ) + 'px' );
+                    if( ! __msie7 ) // IE7 bug!
+                        this.yDiv.css( 'height', String( yH ) + 'px' );
+
+                } // if ( ! this.yDiv )
+                else
+                {
+                    this.cloak.show();
+                    this.yDiv.show();
+                }
+                this.pos( event );
+                this.updYDiv( null );
+                this.setFocus( this.yDiv.find( '.AnyTime-yr-btn.AnyTime-cur-btn:first' ) );
+
+            }, // .askYear()
+
+            //---------------------------------------------------------------------
+            //  .inpBlur() is called when a picker's input loses focus to dismiss
+            //  the popup.  A 1/3 second delay is necessary to restore focus if
+            //	the div is clicked (shorter delays don't always work!)  To prevent
+            //  problems cause by scrollbar focus (except in FF), focus is
+            //  force-restored if the offset div is visible. 
+            //---------------------------------------------------------------------
+
+            inpBlur: function( event )
+            {
+                if( this.oDiv && this.oDiv.is( ":visible" ) )
+                {
+                    _this.inp.focus();
+                    return;
+                }
+                this.lostFocus = true;
+                setTimeout(
+                        function()
+                        {
+                            if( _this.lostFocus )
+                            {
+                                _this.div.find( '.AnyTime-focus-btn' ).removeClass( 'AnyTime-focus-btn ui-state-focus' );
+                                if( _this.pop )
+                                    _this.dismiss( event );
+                                else
+                                    _this.ajax();
+                            }
+                        }, 334 );
+            },
+
+            //---------------------------------------------------------------------
+            //  .btn() is called by AnyTime.picker() to create a <div> element
+            //  containing an <a> element.  The elements are given appropriate
+            //  classes based on the specified "classes" (an array of strings).
+            //	The specified "text" and "title" are used for the <a> element.
+            //	The "handler" is bound to click events for the <div>, which will
+            //	catch bubbling clicks from the <a> as well.  The button is
+            //	appended to the specified parent (jQuery), and the <div> jQuery
+            //	is returned.
+            //---------------------------------------------------------------------
+
+            btn: function( parent, text, handler, classes, title )
+            {
+                var tagName = ( (parent[0].nodeName.toLowerCase() == 'ul') ? 'li' : 'td');
+                var div$ = '<' + tagName +
+                        ' class="AnyTime-btn';
+                for( var i = 0; i < classes.length; i++ )
+                    div$ += ' AnyTime-' + classes[i] + '-btn';
+                var div = $( div$ + ' ui-state-default">' + text + '</' + tagName + '>' );
+                parent.append( div );
+                div.AnyTime_title = title;
+
+                div.click(
+                        function( e )
+                        {
+                            // bind the handler to the picker so "this" is correct
+                            _this.tempFunc = handler;
+                            _this.tempFunc( e );
+                        } );
+                div.dblclick(
+                        function( e )
+                        {
+                            var elem = $( this );
+                            if( elem.is( '.AnyTime-off-off-btn' ) )
+                                _this.dismissODiv( e );
+                            else if( elem.is( '.AnyTime-mil-btn' ) || elem.is( '.AnyTime-cent-btn' ) || elem.is( '.AnyTime-dec-btn' ) || elem.is( '.AnyTime-yr-btn' ) || elem.is( '.AnyTime-era-btn' ) )
+                                _this.dismissYDiv( e );
+                            else if( _this.pop )
+                                _this.dismiss( e );
+                        } );
+                return div;
+
+            }, // .btn()
+
+            //---------------------------------------------------------------------
+            //  .cleanup() destroys the DOM events and elements associated with
+            //  the picker so it can be deleted.
+            //---------------------------------------------------------------------
+
+            cleanup: function( event )
+            {
+                this.inp.unbind( 'blur', this.hBlur );
+                this.inp.unbind( 'click', this.hClick );
+                this.inp.unbind( 'focus', this.hFocus );
+                this.inp.unbind( 'keydown', this.hKeydown );
+                this.inp.unbind( 'keypress', this.hKeypress );
+                this.div.remove();
+            },
+
+            //---------------------------------------------------------------------
+            //  .dismiss() dismisses a popup picker.
+            //---------------------------------------------------------------------
+
+            dismiss: function( event )
+            {
+                this.ajax();
+                this.div.hide();
+                if( __iframe )
+                    __iframe.hide();
+                if( this.yDiv )
+                    this.dismissYDiv();
+                if( this.oDiv )
+                    this.dismissODiv();
+                this.lostFocus = true;
+            },
+
+            //---------------------------------------------------------------------
+            //  .dismissODiv() dismisses the UTC offset selector popover.
+            //---------------------------------------------------------------------
+
+            dismissODiv: function( event )
+            {
+                this.oDiv.hide();
+                this.cloak.hide();
+                this.setFocus( this.oCur );
+            },
+
+            //---------------------------------------------------------------------
+            //  .dismissYDiv() dismisses the date selector popover.
+            //---------------------------------------------------------------------
+
+            dismissYDiv: function( event )
+            {
+                this.yDiv.hide();
+                this.cloak.hide();
+                this.setFocus( this.yCur );
+            },
+
+            //---------------------------------------------------------------------
+            //  .setFocus() makes a specified psuedo-button appear to get focus.
+            //---------------------------------------------------------------------
+
+            setFocus: function( btn )
+            {
+                if( ! btn.hasClass( 'AnyTime-focus-btn' ) )
+                {
+                    this.div.find( '.AnyTime-focus-btn' ).removeClass( 'AnyTime-focus-btn ui-state-focus' );
+                    this.fBtn = btn;
+                    btn.removeClass( 'ui-state-default ui-state-highlight' );
+                    btn.addClass( 'AnyTime-focus-btn ui-state-default ui-state-highlight ui-state-focus' );
+                }
+                if( btn.hasClass( 'AnyTime-off-off-btn' ) )
+                {
+                    var oBT = this.oBody.offset().top;
+                    var btnT = btn.offset().top;
+                    var btnH = btn.AnyTime_height( true );
+                    if( btnT - btnH < oBT ) // move a page up
+                        this.oBody.scrollTop( btnT + this.oBody.scrollTop() - ( this.oBody.innerHeight() + oBT ) + ( btnH * 2 ) );
+                    else if( btnT + btnH > oBT + this.oBody.innerHeight() ) // move a page down
+                        this.oBody.scrollTop( ( btnT + this.oBody.scrollTop() ) - ( oBT + btnH ) );
+                }
+            },
+
+            //---------------------------------------------------------------------
+            //  .key() is invoked when a user presses a key while the picker's
+            //	input has focus.  A psuedo-button is considered "in focus" and an
+            //	appropriate action is performed according to the WAI-ARIA Authoring
+            //	Practices 1.0 for datepicker from
+            //  www.w3.org/TR/2009/WD-wai-aria-practices-20091215/#datepicker:
+            //
+            //  * LeftArrow moves focus left, continued to previous week.
+            //  * RightArrow moves focus right, continued to next week.
+            //  * UpArrow moves focus to the same weekday in the previous week.
+            //  * DownArrow moves focus to same weekday in the next week.
+            //  * PageUp moves focus to same day in the previous month.
+            //  * PageDown moves focus to same day in the next month.
+            //  * Shift+Page Up moves focus to same day in the previous year.
+            //  * Shift+Page Down moves focus to same day in the next year.
+            //  * Home moves focus to the first day of the month.
+            //  * End moves focus to the last day of the month.
+            //  * Ctrl+Home moves focus to the first day of the year.
+            //  * Ctrl+End moves focus to the last day of the year.
+            //  * Esc closes a DatePicker that is opened as a Popup.  
+            //
+            //  The following actions (for multiple-date selection) are NOT
+            //	supported:
+            //  * Shift+Arrow performs continous selection.  
+            //  * Ctrl+Space multiple selection of certain days.
+            //
+            //  The authoring practices do not specify behavior for a time picker,
+            //  or for month-and-year pickers that do not have a day-of-the-month,
+            //  but AnyTime.picker uses the following behavior to be as consistent
+            //  as possible with the defined datepicker functionality:
+            //  * LeftArrow moves focus left or up to previous value or field.
+            //  * RightArrow moves focus right or down to next value or field.
+            //  * UpArrow moves focus up or left to previous value or field.
+            //  * DownArrow moves focus down or right to next value or field 
+            //  * PageUp moves focus to the current value in the previous units
+            //    (for example, from ten-minutes to hours or one-minutes to
+            //	  ten-minutes or months to years).
+            //  * PageDown moves focus to the current value in the next units
+            //    (for example, from hours to ten-minutes or ten-minutes to 
+            //    one-minutes or years to months).
+            //  * Home moves the focus to the first unit button.
+            //  * End moves the focus to the last unit button.
+            //
+            //  In addition, Tab and Shift+Tab move between units (including to/
+            //	from the Day-of-Month table) and also in/out of the picker.
+            //
+            //  Because AnyTime.picker sets a value as soon as the button receives
+            //  focus, SPACE and ENTER are not needed (the WAI-ARIA guidelines use
+            //  them to select a value.
+            //---------------------------------------------------------------------
+
+            key: function( event )
+            {
+                var mo;
+                var t = null;
+                var elem = this.div.find( '.AnyTime-focus-btn' );
+                var key = event.keyCode || event.which;
+                this.denyTab = true;
+
+                if( key == 16 ) // Shift
+                {
+                }
+                else if( ( key == 10 ) || ( key == 13 ) || ( key == 27 ) ) // Enter & Esc
+                {
+                    if( this.oDiv && this.oDiv.is( ':visible' ) )
+                        this.dismissODiv( event );
+                    else if( this.yDiv && this.yDiv.is( ':visible' ) )
+                        this.dismissYDiv( event );
+                    else if( this.pop )
+                        this.dismiss( event );
+                }
+                else if( ( key == 33 ) || ( ( key == 9 ) && event.shiftKey ) ) // PageUp & Shift+Tab
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-off-off-btn' ) )
+                    {
+                        if( key == 9 )
+                            this.dismissODiv( event );
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-mil-btn' ) )
+                    {
+                        if( key == 9 )
+                            this.dismissYDiv( event );
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-cent-btn' ) )
+                        this.yDiv.find( '.AnyTime-mil-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-dec-btn' ) )
+                        this.yDiv.find( '.AnyTime-cent-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-yr-btn' ) )
+                        this.yDiv.find( '.AnyTime-dec-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-era-btn' ) )
+                        this.yDiv.find( '.AnyTime-yr-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.parents( '.AnyTime-yrs' ).length )
+                    {
+                        if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-mon-btn' ) )
+                    {
+                        if( this.dY )
+                            this.yCur.triggerHandler( 'click' );
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                    {
+                        if( ( key == 9 ) && event.shiftKey ) // Shift+Tab
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                        else // PageUp
+                        {
+                            t = new Date( this.time.getTime() );
+                            if( event.shiftKey )
+                                t.setFullYear( t.getFullYear() - 1 );
+                            else
+                            {
+                                mo = t.getMonth() - 1;
+                                if( t.getDate() > __daysIn[mo] )
+                                    t.setDate( __daysIn[mo] )
+                                t.setMonth( mo );
+                            }
+                            this.keyDateChange( t );
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-hr-btn' ) )
+                    {
+                        t = this.dDoM || this.dMo;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( this.dY )
+                            this.yCur.triggerHandler( 'click' );
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-min-ten-btn' ) )
+                    {
+                        t = this.dH || this.dDoM || this.dMo;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( this.dY )
+                            this.yCur.triggerHandler( 'click' );
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-min-one-btn' ) )
+                        this.dM.AnyTime_clickCurrent();
+                    else if( this.fBtn.hasClass( 'AnyTime-sec-ten-btn' ) )
+                    {
+                        if( this.dM )
+                            t = this.dM.find( '.AnyTime-mins-ones' );
+                        else
+                            t = this.dH || this.dDoM || this.dMo;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( this.dY )
+                            this.yCur.triggerHandler( 'click' );
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-sec-one-btn' ) )
+                        this.dS.AnyTime_clickCurrent();
+                    else if( this.fBtn.hasClass( 'AnyTime-off-btn' ) )
+                    {
+                        if( this.dS )
+                            t = this.dS.find( '.AnyTime-secs-ones' );
+                        else if( this.dM )
+                            t = this.dM.find( '.AnyTime-mins-ones' );
+                        else
+                            t = this.dH || this.dDoM || this.dMo;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( this.dY )
+                            this.yCur.triggerHandler( 'click' );
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                }
+                else if( ( key == 34 ) || ( key == 9 ) ) // PageDown or Tab
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-mil-btn' ) )
+                        this.yDiv.find( '.AnyTime-cent-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-cent-btn' ) )
+                        this.yDiv.find( '.AnyTime-dec-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-dec-btn' ) )
+                        this.yDiv.find( '.AnyTime-yr-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-yr-btn' ) )
+                    {
+                        t = this.yDiv.find( '.AnyTime-era-btn.AnyTime-cur-btn' );
+                        if( t.length )
+                            t.triggerHandler( 'click' );
+                        else if( key == 9 )
+                            this.dismissYDiv( event );
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-era-btn' ) )
+                    {
+                        if( key == 9 )
+                            this.dismissYDiv( event );
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-off-off-btn' ) )
+                    {
+                        if( key == 9 )
+                            this.dismissODiv( event );
+                    }
+                    else if( this.fBtn.parents( '.AnyTime-yrs' ).length )
+                    {
+                        t = this.dDoM || this.dMo || this.dH || this.dM || this.dS || this.dO;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-mon-btn' ) )
+                    {
+                        t = this.dDoM || this.dH || this.dM || this.dS || this.dO;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                    {
+                        if( key == 9 ) // Tab
+                        {
+                            t = this.dH || this.dM || this.dS || this.dO;
+                            if( t )
+                                t.AnyTime_clickCurrent();
+                            else
+                            {
+                                this.denyTab = false;
+                                return;
+                            }
+                        }
+                        else // PageDown
+                        {
+                            t = new Date( this.time.getTime() );
+                            if( event.shiftKey )
+                                t.setFullYear( t.getFullYear() + 1 );
+                            else
+                            {
+                                mo = t.getMonth() + 1;
+                                if( t.getDate() > __daysIn[mo] )
+                                    t.setDate( __daysIn[mo] )
+                                t.setMonth( mo );
+                            }
+                            this.keyDateChange( t );
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-hr-btn' ) )
+                    {
+                        t = this.dM || this.dS || this.dO;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-min-ten-btn' ) )
+                        this.dM.find( '.AnyTime-mins-ones .AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-min-one-btn' ) )
+                    {
+                        t = this.dS || this.dO;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-sec-ten-btn' ) )
+                        this.dS.find( '.AnyTime-secs-ones .AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-sec-one-btn' ) )
+                    {
+                        if( this.dO )
+                            this.dO.AnyTime_clickCurrent();
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-off-btn' ) )
+                    {
+                        if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                }
+                else if( key == 35 ) // END
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-mil-btn' ) || this.fBtn.hasClass( 'AnyTime-cent-btn' ) ||
+                            this.fBtn.hasClass( 'AnyTime-dec-btn' ) || this.fBtn.hasClass( 'AnyTime-yr-btn' ) ||
+                            this.fBtn.hasClass( 'AnyTime-era-btn' ) )
+                    {
+                        t = this.yDiv.find( '.AnyTime-ce-btn' );
+                        if( ! t.length )
+                            t = this.yDiv.find( '.AnyTime-yr9-btn' );
+                        t.triggerHandler( 'click' );
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                    {
+                        t = new Date( this.time.getTime() );
+                        t.setDate( 1 );
+                        t.setMonth( t.getMonth() + 1 );
+                        t.setDate( t.getDate() - 1 );
+                        if( event.ctrlKey )
+                            t.setMonth( 11 );
+                        this.keyDateChange( t );
+                    }
+                    else if( this.dS )
+                        this.dS.find( '.AnyTime-sec9-btn' ).triggerHandler( 'click' );
+                    else if( this.dM )
+                        this.dM.find( '.AnyTime-min9-btn' ).triggerHandler( 'click' );
+                    else if( this.dH )
+                        this.dH.find( '.AnyTime-hr23-btn' ).triggerHandler( 'click' );
+                    else if( this.dDoM )
+                        this.dDoM.find( '.AnyTime-dom-btn-filled:last' ).triggerHandler( 'click' );
+                    else if( this.dMo )
+                        this.dMo.find( '.AnyTime-mon12-btn' ).triggerHandler( 'click' );
+                    else if( this.dY )
+                        this.yAhead.triggerHandler( 'click' );
+                }
+                else if( key == 36 ) // HOME
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-mil-btn' ) || this.fBtn.hasClass( 'AnyTime-cent-btn' ) ||
+                            this.fBtn.hasClass( 'AnyTime-dec-btn' ) || this.fBtn.hasClass( 'AnyTime-yr-btn' ) ||
+                            this.fBtn.hasClass( 'AnyTime-era-btn' ) )
+                    {
+                        this.yDiv.find( '.AnyTime-mil0-btn' ).triggerHandler( 'click' );
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                    {
+                        t = new Date( this.time.getTime() );
+                        t.setDate( 1 );
+                        if( event.ctrlKey )
+                            t.setMonth( 0 );
+                        this.keyDateChange( t );
+                    }
+                    else if( this.dY )
+                        this.yCur.triggerHandler( 'click' );
+                    else if( this.dMo )
+                        this.dMo.find( '.AnyTime-mon1-btn' ).triggerHandler( 'click' );
+                    else if( this.dDoM )
+                        this.dDoM.find( '.AnyTime-dom-btn-filled:first' ).triggerHandler( 'click' );
+                    else if( this.dH )
+                        this.dH.find( '.AnyTime-hr0-btn' ).triggerHandler( 'click' );
+                    else if( this.dM )
+                        this.dM.find( '.AnyTime-min00-btn' ).triggerHandler( 'click' );
+                    else if( this.dS )
+                        this.dS.find( '.AnyTime-sec00-btn' ).triggerHandler( 'click' );
+                }
+                else if( key == 37 ) // left arrow
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                        this.keyDateChange( new Date( this.time.getTime() - __oneDay ) );
+                    else
+                        this.keyBack();
+                }
+                else if( key == 38 ) // up arrow
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                        this.keyDateChange( new Date( this.time.getTime() - (7 * __oneDay) ) );
+                    else
+                        this.keyBack();
+                }
+                else if( key == 39 ) // right arrow
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                        this.keyDateChange( new Date( this.time.getTime() + __oneDay ) );
+                    else
+                        this.keyAhead();
+                }
+                else if( key == 40 ) // down arrow
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                        this.keyDateChange( new Date( this.time.getTime() + (7 * __oneDay) ) );
+                    else
+                        this.keyAhead();
+                }
+                else if( ( ( key == 86 ) || ( key == 118 ) ) && event.ctrlKey )
+                {
+                    this.inp.val( "" ).change();
+                    var _this = this;
+                    setTimeout( function()
+                    {
+                        _this.showPkr( null );
+                    }, 100 );
+                    return;
+                }
+                else
+                    this.showPkr( null );
+
+                event.preventDefault();
+
+            }, // .key()
+
+            //---------------------------------------------------------------------
+            //  .keyAhead() is called by #key when a user presses the right or
+            //	down arrow.  It moves to the next appropriate button.
+            //---------------------------------------------------------------------
+
+            keyAhead: function()
+            {
+                if( this.fBtn.hasClass( 'AnyTime-mil9-btn' ) )
+                    this.yDiv.find( '.AnyTime-cent0-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-cent9-btn' ) )
+                    this.yDiv.find( '.AnyTime-dec0-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-dec9-btn' ) )
+                    this.yDiv.find( '.AnyTime-yr0-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-yr9-btn' ) )
+                    this.yDiv.find( '.AnyTime-bce-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-sec9-btn' ) )
+                {
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-sec50-btn' ) )
+                    this.dS.find( '.AnyTime-sec0-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-min9-btn' ) )
+                {
+                    if( this.dS )
+                        this.dS.find( '.AnyTime-sec00-btn' ).triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-min50-btn' ) )
+                    this.dM.find( '.AnyTime-min0-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-hr23-btn' ) )
+                {
+                    if( this.dM )
+                        this.dM.find( '.AnyTime-min00-btn' ).triggerHandler( 'click' );
+                    else if( this.dS )
+                        this.dS.find( '.AnyTime-sec00-btn' ).triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-hr11-btn' ) )
+                    this.dH.find( '.AnyTime-hr12-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-mon12-btn' ) )
+                {
+                    if( this.dDoM )
+                        this.dDoM.AnyTime_clickCurrent();
+                    else if( this.dH )
+                        this.dH.find( '.AnyTime-hr0-btn' ).triggerHandler( 'click' );
+                    else if( this.dM )
+                        this.dM.find( '.AnyTime-min00-btn' ).triggerHandler( 'click' );
+                    else if( this.dS )
+                        this.dS.find( '.AnyTime-sec00-btn' ).triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-yrs-ahead-btn' ) )
+                {
+                    if( this.dMo )
+                        this.dMo.find( '.AnyTime-mon1-btn' ).triggerHandler( 'click' );
+                    else if( this.dH )
+                        this.dH.find( '.AnyTime-hr0-btn' ).triggerHandler( 'click' );
+                    else if( this.dM )
+                        this.dM.find( '.AnyTime-min00-btn' ).triggerHandler( 'click' );
+                    else if( this.dS )
+                        this.dS.find( '.AnyTime-sec00-btn' ).triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-yr-cur-btn' ) )
+                    this.yNext.triggerHandler( 'click' );
+                else
+                    this.fBtn.next().triggerHandler( 'click' );
+
+            }, // .keyAhead()
+
+
+            //---------------------------------------------------------------------
+            //  .keyBack() is called by #key when a user presses the left or
+            //	up arrow. It moves to the previous appropriate button.
+            //---------------------------------------------------------------------
+
+            keyBack: function()
+            {
+                if( this.fBtn.hasClass( 'AnyTime-cent0-btn' ) )
+                    this.yDiv.find( '.AnyTime-mil9-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-dec0-btn' ) )
+                    this.yDiv.find( '.AnyTime-cent9-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-yr0-btn' ) )
+                    this.yDiv.find( '.AnyTime-dec9-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-bce-btn' ) )
+                    this.yDiv.find( '.AnyTime-yr9-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-yr-cur-btn' ) )
+                    this.yPrior.triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-mon1-btn' ) )
+                {
+                    if( this.dY )
+                        this.yCur.triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-hr0-btn' ) )
+                {
+                    if( this.dDoM )
+                        this.dDoM.AnyTime_clickCurrent();
+                    else if( this.dMo )
+                        this.dMo.find( '.AnyTime-mon12-btn' ).triggerHandler( 'click' );
+                    else if( this.dY )
+                        this.yNext.triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-hr12-btn' ) )
+                    this.dH.find( '.AnyTime-hr11-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-min00-btn' ) )
+                {
+                    if( this.dH )
+                        this.dH.find( '.AnyTime-hr23-btn' ).triggerHandler( 'click' );
+                    else if( this.dDoM )
+                        this.dDoM.AnyTime_clickCurrent();
+                    else if( this.dMo )
+                        this.dMo.find( '.AnyTime-mon12-btn' ).triggerHandler( 'click' );
+                    else if( this.dY )
+                        this.yNext.triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-min0-btn' ) )
+                    this.dM.find( '.AnyTime-min50-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-sec00-btn' ) )
+                {
+                    if( this.dM )
+                        this.dM.find( '.AnyTime-min9-btn' ).triggerHandler( 'click' );
+                    else if( this.dH )
+                        this.dH.find( '.AnyTime-hr23-btn' ).triggerHandler( 'click' );
+                    else if( this.dDoM )
+                        this.dDoM.AnyTime_clickCurrent();
+                    else if( this.dMo )
+                        this.dMo.find( '.AnyTime-mon12-btn' ).triggerHandler( 'click' );
+                    else if( this.dY )
+                        this.yNext.triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-sec0-btn' ) )
+                    this.dS.find( '.AnyTime-sec50-btn' ).triggerHandler( 'click' );
+                else
+                    this.fBtn.prev().triggerHandler( 'click' );
+
+            }, // .keyBack()
+
+            //---------------------------------------------------------------------
+            //  .keyDateChange() is called by #key when an direction key
+            //	(arrows/page/etc) is pressed while the Day-of-Month calendar has
+            //	focus. The current day is adjusted accordingly.
+            //---------------------------------------------------------------------
+
+            keyDateChange: function( newDate )
+            {
+                if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                {
+                    this.set( newDate );
+                    this.upd( null );
+                    this.setFocus( this.dDoM.find( '.AnyTime-cur-btn' ) );
+                }
+            },
+
+            //---------------------------------------------------------------------
+            //  .makeCloak() is called by .askOffset() and .askYear() to create
+            //  a cloak div.
+            //---------------------------------------------------------------------
+
+            makeCloak: function()
+            {
+                if( ! this.cloak )
+                {
+                    this.cloak = $( '<div class="AnyTime-cloak" style="position:absolute" />' );
+                    this.div.append( this.cloak );
+                    this.cloak.click(
+                            function( e )
+                            {
+                                if( _this.oDiv && _this.oDiv.is( ":visible" ) )
+                                    _this.dismissODiv( e );
+                                else
+                                    _this.dismissYDiv( e );
+                            } );
+                }
+                else
+                    this.cloak.show();
+            },
+
+            //---------------------------------------------------------------------
+            //  .newHour() is called when a user clicks an hour value.
+            //  It changes the date and updates the text field.
+            //---------------------------------------------------------------------
+
+            newHour: function( event )
+            {
+                var h;
+                var t;
+                var elem = $( event.target );
+                if( elem.hasClass( "AnyTime-out-btn" ) )
+                    return;
+                if( ! this.twelveHr )
+                    h = Number( elem.text() );
+                else
+                {
+                    var str = elem.text();
+                    t = str.indexOf( 'a' );
+                    if( t < 0 )
+                    {
+                        t = Number( str.substr( 0, str.indexOf( 'p' ) ) );
+                        h = ( (t == 12) ? 12 : (t + 12) );
+                    }
+                    else
+                    {
+                        t = Number( str.substr( 0, t ) );
+                        h = ( (t == 12) ? 0 : t );
+                    }
+                }
+                t = new Date( this.time.getTime() );
+                t.setHours( h );
+                this.set( t );
+                this.upd( elem );
+
+            }, // .newHour()
+
+            //---------------------------------------------------------------------
+            //  .newOffset() is called when a user clicks the UTC offset (timezone)
+            //  (or +/- button) to shift the year.  It changes the date and updates
+            //  the text field.
+            //---------------------------------------------------------------------
+
+            newOffset: function( event )
+            {
+                if( event.target == this.oSel[0] )
+                    this.askOffset( event );
+                else
+                {
+                    this.upd( this.oCur );
+                }
+            },
+
+            //---------------------------------------------------------------------
+            //  .newOPos() is called internally whenever a user clicks an offset
+            //  selection value.  It changes the date and updates the text field.
+            //---------------------------------------------------------------------
+
+            newOPos: function( event )
+            {
+                var elem = $( event.target );
+                this.offMin = elem[0].AnyTime_offMin;
+                this.offSI = elem[0].AnyTime_offSI;
+                var t = new Date( this.time.getTime() );
+                this.set( t );
+                this.updODiv( elem );
+
+            }, // .newOPos()
+
+            //---------------------------------------------------------------------
+            //  .newYear() is called when a user clicks a year (or one of the
+            //	"arrows") to shift the year.  It changes the date and updates the
+            //	text field.
+            //---------------------------------------------------------------------
+
+            newYear: function( event )
+            {
+                var elem = $( event.target );
+                if( elem.hasClass( "AnyTime-out-btn" ) )
+                    return;
+                var txt = elem.text();
+                if( ( txt == '<' ) || ( txt == '&lt;' ) )
+                    this.askYear( event );
+                else if( ( txt == '>' ) || ( txt == '&gt;' ) )
+                    this.askYear( event );
+                else
+                {
+                    var t = new Date( this.time.getTime() );
+                    t.setFullYear( Number( txt ) );
+                    this.set( t );
+                    this.upd( this.yCur );
+                }
+            },
+
+            //---------------------------------------------------------------------
+            //  .newYPos() is called internally whenever a user clicks a year
+            //  selection value.  It changes the date and updates the text field.
+            //---------------------------------------------------------------------
+
+            newYPos: function( event )
+            {
+                var elem = $( event.target );
+                if( elem.hasClass( "AnyTime-out-btn" ) )
+                    return;
+
+                var era = 1;
+                var year = this.time.getFullYear();
+                if( year < 0 )
+                {
+                    era = (-1);
+                    year = 0 - year;
+                }
+                year = AnyTime.pad( year, 4 );
+                if( elem.hasClass( 'AnyTime-mil-btn' ) )
+                    year = elem.html() + year.substring( 1, 4 );
+                else if( elem.hasClass( 'AnyTime-cent-btn' ) )
+                    year = year.substring( 0, 1 ) + elem.html() + year.substring( 2, 4 );
+                else if( elem.hasClass( 'AnyTime-dec-btn' ) )
+                    year = year.substring( 0, 2 ) + elem.html() + year.substring( 3, 4 );
+                else
+                    year = year.substring( 0, 3 ) + elem.html();
+                if( year == '0000' )
+                    year = 1;
+                var t = new Date( this.time.getTime() );
+                t.setFullYear( era * year );
+                this.set( t );
+                this.updYDiv( elem );
+
+            }, // .newYPos()
+
+            //---------------------------------------------------------------------
+            //  .onReady() initializes the picker after the page has loaded and,
+            //  if IE6, after the iframe has been created.
+            //---------------------------------------------------------------------
+
+            onReady: function()
+            {
+                this.lostFocus = true;
+                if( ! this.pop )
+                    this.upd( null );
+                else
+                {
+                    if( this.div.parent() != document.body )
+                        this.div.appendTo( document.body );
+                }
+            },
+
+            //---------------------------------------------------------------------
+            //  .pos() positions the picker, such as when it is displayed or
+            //	when the window is resized.
+            //---------------------------------------------------------------------
+
+            pos: function( event ) // note: event is ignored but this is a handler
+            {
+                if( this.pop )
+                {
+                    var off = this.inp.offset();
+                    var bodyWidth = $( document.body ).outerWidth( true );
+                    var pickerWidth = this.div.outerWidth( true );
+                    var left = off.left;
+                    if( left + pickerWidth > bodyWidth - 20 )
+                        left = bodyWidth - ( pickerWidth + 20 );
+                    var top = off.top - this.div.outerHeight( true );
+                    if( top < 0 )
+                        top = off.top + this.inp.outerHeight( true );
+                    this.div.css( { top: String( top ) + 'px', left: String( left < 0 ? 0 : left ) + 'px' } );
+                }
+
+                var wOff = this.div.offset();
+
+                if( this.oDiv && this.oDiv.is( ":visible" ) )
+                {
+                    var oOff = this.oLab.offset();
+                    if( this.div.css( 'position' ) == 'absolute' )
+                    {
+                        oOff.top -= wOff.top;
+                        oOff.left = oOff.left - wOff.left;
+                        wOff = { top: 0, left: 0 };
+                    }
+                    var oW = this.oDiv.AnyTime_width( true );
+                    var wW = this.div.AnyTime_width( true );
+                    if( oOff.left + oW > wOff.left + wW )
+                    {
+                        oOff.left = (wOff.left + wW) - oW;
+                        if( oOff.left < 2 )
+                            oOff.left = 2;
+                    }
+
+                    var oH = this.oDiv.AnyTime_height( true );
+                    var wH = this.div.AnyTime_height( true );
+                    oOff.top += this.oLab.AnyTime_height( true );
+                    if( oOff.top + oH > wOff.top + wH )
+                        oOff.top = oOff.top - oH;
+                    if( oOff.top < wOff.top )
+                        oOff.top = wOff.top;
+
+                    this.oDiv.css( { top: oOff.top + 'px', left: oOff.left + 'px' } );
+                }
+
+                else if( this.yDiv && this.yDiv.is( ":visible" ) )
+                {
+                    var yOff = this.yLab.offset();
+                    if( this.div.css( 'position' ) == 'absolute' )
+                    {
+                        yOff.top -= wOff.top;
+                        yOff.left = yOff.left - wOff.left;
+                        wOff = { top: 0, left: 0 };
+                    }
+                    yOff.left += ( (this.yLab.outerWidth( true ) - this.yDiv.outerWidth( true )) / 2 );
+                    this.yDiv.css( { top: yOff.top + 'px', left: yOff.left + 'px' } );
+                }
+
+                if( this.cloak )
+                    this.cloak.css( {
+                        top: wOff.top + 'px',
+                        left: wOff.left + 'px',
+                        height: String( this.div.outerHeight( true ) - 2 ) + 'px',
+                        width: String( this.div.outerWidth( !$.browser.safari ) - 2 ) + 'px'
+                    } );
+
+            }, // .pos()
+
+            //---------------------------------------------------------------------
+            //  .set() changes the current time.  It returns true if the new
+            //	time is within the allowed range (if any).
+            //---------------------------------------------------------------------
+
+            set: function( newTime )
+            {
+                var t = newTime.getTime();
+                if( this.earliest && ( t < this.earliest ) )
+                    this.time = new Date( this.earliest );
+                else if( this.latest && ( t > this.latest ) )
+                    this.time = new Date( this.latest );
+                else
+                    this.time = newTime;
+            },
+
+            //---------------------------------------------------------------------
+            //  .showPkr() displays the picker and sets the focus psuedo-
+            //	element. The current value in the input field is used to initialize
+            //	the picker.
+            //---------------------------------------------------------------------
+
+            showPkr: function( event )
+            {
+                try
+                {
+                    this.time = this.conv.parse( this.inp.val() );
+                    this.offMin = this.conv.getUtcParseOffsetCaptured();
+                    this.offSI = this.conv.getUtcParseOffsetSubIndex();
+                }
+                catch ( e )
+                {
+                    this.time = new Date();
+                }
+                this.set( this.time );
+                this.upd( null );
+
+                fBtn = null;
+                var cb = '.AnyTime-cur-btn:first';
+                if( this.dDoM )
+                    fBtn = this.dDoM.find( cb );
+                else if( this.yCur )
+                    fBtn = this.yCur;
+                else if( this.dMo )
+                    fBtn = this.dMo.find( cb );
+                else if( this.dH )
+                    fBtn = this.dH.find( cb );
+                else if( this.dM )
+                    fBtn = this.dM.find( cb );
+                else if( this.dS )
+                    fBtn = this.dS.find( cb );
+
+                this.setFocus( fBtn );
+                this.pos( event );
+
+                //  IE6 doesn't float popups over <select> elements unless an
+                //	<iframe> is inserted between them!  So after the picker is
+                //	made visible, move the <iframe> behind it.
+
+                if( this.pop && __iframe )
+                    setTimeout(
+                            function()
+                            {
+                                var pos = _this.div.offset();
+                                __iframe.css( {
+                                    height: String( _this.div.outerHeight( true ) ) + 'px',
+                                    left: String( pos.left ) + 'px',
+                                    position: 'absolute',
+                                    top: String( pos.top ) + 'px',
+                                    width: String( _this.div.outerWidth( true ) ) + 'px'
+                                } );
+                                __iframe.show();
+                            }, 300 );
+
+            }, // .showPkr()
+
+            /** VMIPSL **/
+            updateEarliest: function()
+            {
+                if( !this.idToUpdateEarliest || !$( document.getElementById( this.idToUpdateEarliest ) )[0] || !$( document.getElementById( this.idToUpdateEarliest ) )[0].value )
+                    return;
+
+                this.earliest = this.conv.parse( $( document.getElementById( this.idToUpdateEarliest ) )[0].value ).getTime();
+            },
+
+            //---------------------------------------------------------------------
+            //  .upd() updates the picker's appearance.  It is called after
+            //	most events to make the picker reflect the currently-selected
+            //	values. fBtn is the psuedo-button to be given focus.
+            //---------------------------------------------------------------------
+
+            upd: function( fBtn )
+            {
+                /** VMIPSL **/
+                this.updateEarliest();
+
+                var cmpLo = new Date( this.time.getTime() );
+                cmpLo.setMonth( 0, 1 );
+                cmpLo.setHours( 0, 0, 0, 0 );
+                var cmpHi = new Date( this.time.getTime() );
+                cmpHi.setMonth( 11, 31 );
+                cmpHi.setHours( 23, 59, 59, 999 );
+
+                //  Update year.
+
+                var current = this.time.getFullYear();
+                if( this.earliest && this.yPast )
+                {
+                    cmpHi.setYear( current - 2 );
+                    if( cmpHi.getTime() < this.earliest )
+                        this.yPast.addClass( 'AnyTime-out-btn ui-state-disabled' );
+                    else
+                        this.yPast.removeClass( 'AnyTime-out-btn ui-state-disabled' );
+                }
+                if( this.yPrior )
+                {
+                    this.yPrior.text( AnyTime.pad( (current == 1) ? (-1) : (current - 1), 4 ) );
+                    if( this.earliest )
+                    {
+                        cmpHi.setYear( current - 1 );
+                        if( cmpHi.getTime() < this.earliest )
+                            this.yPrior.addClass( 'AnyTime-out-btn ui-state-disabled' );
+                        else
+                            this.yPrior.removeClass( 'AnyTime-out-btn ui-state-disabled' );
+                    }
+                }
+                if( this.yCur )
+                    this.yCur.text( AnyTime.pad( current, 4 ) );
+                if( this.yNext )
+                {
+                    this.yNext.text( AnyTime.pad( (current == -1) ? 1 : (current + 1), 4 ) );
+                    if( this.latest )
+                    {
+                        cmpLo.setYear( current + 1 );
+                        if( cmpLo.getTime() > this.latest )
+                            this.yNext.addClass( 'AnyTime-out-btn ui-state-disabled' );
+                        else
+                            this.yNext.removeClass( 'AnyTime-out-btn ui-state-disabled' );
+                    }
+                }
+                if( this.latest && this.yAhead )
+                {
+                    cmpLo.setYear( current + 2 );
+                    if( cmpLo.getTime() > this.latest )
+                        this.yAhead.addClass( 'AnyTime-out-btn ui-state-disabled' );
+                    else
+                        this.yAhead.removeClass( 'AnyTime-out-btn ui-state-disabled' );
+                }
+
+                //  Update month.
+
+                cmpLo.setFullYear( this.time.getFullYear() );
+                cmpHi.setFullYear( this.time.getFullYear() );
+                var i = 0;
+                current = this.time.getMonth();
+                $( '#' + this.id + ' .AnyTime-mon-btn' ).each(
+                        function()
+                        {
+                            cmpLo.setMonth( i );
+                            cmpHi.setDate( 1 );
+                            cmpHi.setMonth( i + 1 );
+                            cmpHi.setDate( 0 );
+                            $( this ).AnyTime_current( i == current,
+                                    ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                            ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                            i++;
+                        } );
+
+                //  Update days.
+
+                cmpLo.setFullYear( this.time.getFullYear() );
+                cmpHi.setFullYear( this.time.getFullYear() );
+                cmpLo.setMonth( this.time.getMonth() );
+                cmpHi.setMonth( this.time.getMonth(), 1 );
+                current = this.time.getDate();
+                var currentMonth = this.time.getMonth();
+                var dow1 = cmpLo.getDay();
+                if( this.fDOW > dow1 )
+                    dow1 += 7;
+                var wom = 0, dow = 0;
+                $( '#' + this.id + ' .AnyTime-wk' ).each(
+                        function()
+                        {
+                            dow = _this.fDOW;
+                            $( this ).children().each(
+                                    function()
+                                    {
+                                        if( dow - _this.fDOW < 7 )
+                                        {
+                                            var td = $( this );
+                                            if( ((wom == 0) && (dow < dow1)) || (cmpLo.getMonth() != currentMonth) )
+                                            {
+                                                td.html( '&#160;' );
+                                                td.removeClass( 'AnyTime-dom-btn-filled AnyTime-cur-btn ui-state-default ui-state-highlight' );
+                                                td.addClass( 'AnyTime-dom-btn-empty' );
+                                                if( wom ) // not first week
+                                                {
+                                                    if( ( cmpLo.getDate() == 1 ) && ( dow != 0 ) )
+                                                        td.addClass( 'AnyTime-dom-btn-empty-after-filled' );
+                                                    else
+                                                        td.removeClass( 'AnyTime-dom-btn-empty-after-filled' );
+                                                    if( cmpLo.getDate() <= 7 )
+                                                        td.addClass( 'AnyTime-dom-btn-empty-below-filled' );
+                                                    else
+                                                        td.removeClass( 'AnyTime-dom-btn-empty-below-filled' );
+                                                    cmpLo.setDate( cmpLo.getDate() + 1 );
+                                                    cmpHi.setDate( cmpHi.getDate() + 1 );
+                                                }
+                                                else // first week
+                                                {
+                                                    td.addClass( 'AnyTime-dom-btn-empty-above-filled' );
+                                                    if( dow == dow1 - 1 )
+                                                        td.addClass( 'AnyTime-dom-btn-empty-before-filled' );
+                                                    else
+                                                        td.removeClass( 'AnyTime-dom-btn-empty-before-filled' );
+                                                }
+                                                td.addClass( 'ui-state-default ui-state-disabled' );
+                                            }
+                                            else
+                                            {
+                                                i = cmpLo.getDate();
+                                                td.text( i );
+                                                td.removeClass( 'AnyTime-dom-btn-empty AnyTime-dom-btn-empty-above-filled AnyTime-dom-btn-empty-before-filled ' +
+                                                        'AnyTime-dom-btn-empty-after-filled AnyTime-dom-btn-empty-below-filled ' +
+                                                        'ui-state-default ui-state-disabled' );
+                                                td.addClass( 'AnyTime-dom-btn-filled ui-state-default' );
+                                                td.AnyTime_current( i == current,
+                                                        ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                                                ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                                                cmpLo.setDate( i + 1 );
+                                                cmpHi.setDate( i + 1 );
+                                            }
+                                        }
+                                        dow++;
+                                    } );
+                            wom++;
+                        } );
+
+                //  Update hour.
+
+                cmpLo.setFullYear( this.time.getFullYear() );
+                cmpHi.setFullYear( this.time.getFullYear() );
+                cmpLo.setMonth( this.time.getMonth(), this.time.getDate() );
+                cmpHi.setMonth( this.time.getMonth(), this.time.getDate() );
+                var not12 = ! this.twelveHr;
+                var hr = this.time.getHours();
+                $( '#' + this.id + ' .AnyTime-hr-btn' ).each(
+                        function()
+                        {
+                            var html = this.innerHTML;
+                            var i;
+                            if( not12 )
+                                i = Number( html );
+                            else
+                            {
+                                i = Number( html.substring( 0, html.length - 2 ) );
+                                if( html.charAt( html.length - 2 ) == 'a' )
+                                {
+                                    if( i == 12 )
+                                        i = 0;
+                                }
+                                else if( i < 12 )
+                                    i += 12;
+                            }
+                            cmpLo.setHours( i );
+                            cmpHi.setHours( i );
+                            $( this ).AnyTime_current( hr == i,
+                                    ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                            ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                            if( i < 23 )
+                                cmpLo.setHours( cmpLo.getHours() + 1 );
+                        } );
+
+                //  Update minute.
+
+                cmpLo.setHours( this.time.getHours() );
+                cmpHi.setHours( this.time.getHours() );
+                var units = this.time.getMinutes();
+                var tens = String( Math.floor( units / 10 ) );
+                var ones = String( units % 10 );
+                $( '#' + this.id + ' .AnyTime-min-ten-btn:not(.AnyTime-min-ten-btn-empty)' ).each(
+                        function()
+                        {
+                            $( this ).AnyTime_current( this.innerHTML == tens,
+                                    ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                            ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                            if( cmpLo.getMinutes() < 50 )
+                            {
+                                cmpLo.setMinutes( cmpLo.getMinutes() + 10 );
+                                cmpHi.setMinutes( cmpHi.getMinutes() + 10 );
+                            }
+                        } );
+                cmpLo.setMinutes( Math.floor( this.time.getMinutes() / 10 ) * 10 );
+                cmpHi.setMinutes( Math.floor( this.time.getMinutes() / 10 ) * 10 );
+                $( '#' + this.id + ' .AnyTime-min-one-btn:not(.AnyTime-min-one-btn-empty)' ).each(
+                        function()
+                        {
+                            $( this ).AnyTime_current( this.innerHTML == ones,
+                                    ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                            ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                            cmpLo.setMinutes( cmpLo.getMinutes() + 1 );
+                            cmpHi.setMinutes( cmpHi.getMinutes() + 1 );
+                        } );
+
+                //  Update second.
+
+                cmpLo.setMinutes( this.time.getMinutes() );
+                cmpHi.setMinutes( this.time.getMinutes() );
+                units = this.time.getSeconds();
+                tens = String( Math.floor( units / 10 ) );
+                ones = String( units % 10 );
+                $( '#' + this.id + ' .AnyTime-sec-ten-btn:not(.AnyTime-sec-ten-btn-empty)' ).each(
+                        function()
+                        {
+                            $( this ).AnyTime_current( this.innerHTML == tens,
+                                    ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                            ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                            if( cmpLo.getSeconds() < 50 )
+                            {
+                                cmpLo.setSeconds( cmpLo.getSeconds() + 10 );
+                                cmpHi.setSeconds( cmpHi.getSeconds() + 10 );
+                            }
+                        } );
+                cmpLo.setSeconds( Math.floor( this.time.getSeconds() / 10 ) * 10 );
+                cmpHi.setSeconds( Math.floor( this.time.getSeconds() / 10 ) * 10 );
+                $( '#' + this.id + ' .AnyTime-sec-one-btn:not(.AnyTime-sec-one-btn-empty)' ).each(
+                        function()
+                        {
+                            $( this ).AnyTime_current( this.innerHTML == ones,
+                                    ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                            ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                            cmpLo.setSeconds( cmpLo.getSeconds() + 1 );
+                            cmpHi.setSeconds( cmpHi.getSeconds() + 1 );
+                        } );
+
+                //  Update offset (time zone).
+
+                if( this.oConv )
+                {
+                    this.oConv.setUtcFormatOffsetAlleged( this.offMin );
+                    this.oConv.setUtcFormatOffsetSubIndex( this.offSI );
+                    var tzs = this.oConv.format( this.time );
+                    this.oCur.html( tzs );
+                }
+
+                //	Set the focus element, then size the picker according to its
+                //	components, show the changes, and invoke Ajax if desired.
+
+                if( fBtn )
+                    this.setFocus( fBtn );
+
+                this.conv.setUtcFormatOffsetAlleged( this.offMin );
+                this.conv.setUtcFormatOffsetSubIndex( this.offSI );
+                this.inp.val( this.conv.format( this.time ) ).change();
+                this.div.show();
+
+                var d, totH = 0, totW = 0, dYW = 0, dMoW = 0, dDoMW = 0;
+                if( this.dY )
+                {
+                    totW = dYW = this.dY.outerWidth( true );
+                    totH = this.yLab.AnyTime_height( true ) + this.dY.AnyTime_height( true );
+                }
+                if( this.dMo )
+                {
+                    dMoW = this.dMo.outerWidth( true );
+                    if( dMoW > totW )
+                        totW = dMoW;
+                    totH += this.hMo.AnyTime_height( true ) + this.dMo.AnyTime_height( true );
+                }
+                if( this.dDoM )
+                {
+                    dDoMW = this.dDoM.outerWidth( true );
+                    if( dDoMW > totW )
+                        totW = dDoMW;
+                    if( __msie6 || __msie7 )
+                    {
+                        if( dMoW > dDoMW )
+                            this.dDoM.css( 'width', String( dMoW ) + 'px' );
+                        else if( dYW > dDoMW )
+                            this.dDoM.css( 'width', String( dYW ) + 'px' );
+                    }
+                    totH += this.hDoM.AnyTime_height( true ) + this.dDoM.AnyTime_height( true );
+                }
+                if( this.dD )
+                {
+                    this.dD.css( { width:String( totW ) + 'px', height:String( totH ) + 'px' } );
+                    totW += this.dMinW;
+                    totH += this.dMinH;
+                }
+
+                var w = 0, h = 0, timeH = 0, timeW = 0;
+                if( this.dH )
+                {
+                    w = this.dH.outerWidth( true );
+                    timeW += w + 1;
+                    h = this.dH.AnyTime_height( true );
+                    if( h > timeH )
+                        timeH = h;
+                }
+                if( this.dM )
+                {
+                    w = this.dM.outerWidth( true );
+                    timeW += w + 1;
+                    h = this.dM.AnyTime_height( true );
+                    if( h > timeH )
+                        timeH = h;
+                }
+                if( this.dS )
+                {
+                    w = this.dS.outerWidth( true );
+                    timeW += w + 1;
+                    h = this.dS.AnyTime_height( true );
+                    if( h > timeH )
+                        timeH = h;
+                }
+                if( this.dO )
+                {
+                    w = this.oMinW;
+                    if( timeW < w + 1 )
+                        timeW = w + 1;
+                    timeH += this.dO.AnyTime_height( true );
+                }
+                if( this.dT )
+                {
+                    this.dT.css( { width:String( timeW ) + 'px', height:String( timeH ) + 'px' } );
+                    timeW += this.tMinW + 1;
+                    timeH += this.tMinH;
+                    totW += timeW;
+                    if( timeH > totH )
+                        totH = timeH;
+                    if( this.dO ) // stretch offset button if possible
+                    {
+                        var dOW = this.dT.width() - (this.oMinW + 1);
+                        this.dO.css( {width:String( dOW ) + "px"} );
+                        this.oCur.css( {width:String( dOW - (this.oListMinW + 4) ) + "px"} );
+                    }
+                }
+
+                this.dB.css( {height:String( totH ) + 'px',width:String( totW ) + 'px'} );
+
+                totH += this.bMinH;
+                totW += this.bMinW;
+                totH += this.hTitle.AnyTime_height( true ) + this.wMinH;
+                totW += this.wMinW;
+                if( this.hTitle.outerWidth( true ) > totW )
+                    totW = this.hTitle.outerWidth( true ); // IE quirk
+                this.div.css( {height:String( totH ) + 'px',width:String( totW ) + 'px'} );
+
+                if( ! this.pop )
+                    this.ajax();
+
+                /** VMIPSL **/
+                if( this.methodToCall )
+                    this.methodToCall();
+            }, // .upd()
+
+            //---------------------------------------------------------------------
+            //  .updODiv() updates the UTC offset selector's appearance.  It is
+            //	called after most events to make the picker reflect the currently-
+            //	selected values. fBtn is the psuedo-button to be given focus.
+            //---------------------------------------------------------------------
+
+            updODiv: function( fBtn )
+            {
+                var cur, matched = false, def = null;
+                this.oDiv.find( '.AnyTime-off-off-btn' ).each(
+                        function()
+                        {
+                            if( this.AnyTime_offMin == _this.offMin )
+                            {
+                                if( this.AnyTime_offSI == _this.offSI )
+                                    $( this ).AnyTime_current( matched = true, true );
+                                else
+                                {
+                                    $( this ).AnyTime_current( false, true );
+                                    if( def == null )
+                                        def = $( this );
+                                }
+                            }
+                            else
+                                $( this ).AnyTime_current( false, true );
+                        } );
+                if( ( ! matched ) && ( def != null ) )
+                    def.AnyTime_current( true, true );
+
+                //  Show change
+
+                this.conv.setUtcFormatOffsetAlleged( this.offMin );
+                this.conv.setUtcFormatOffsetSubIndex( this.offSI );
+                this.inp.val( this.conv.format( this.time ) ).change();
+                this.upd( fBtn );
+
+            }, // .updODiv()
+
+            //---------------------------------------------------------------------
+            //  .updYDiv() updates the year selector's appearance.  It is
+            //	called after most events to make the picker reflect the currently-
+            //	selected values. fBtn is the psuedo-button to be given focus.
+            //---------------------------------------------------------------------
+
+            updYDiv: function( fBtn )
+            {
+                var i, legal;
+                var era = 1;
+                var yearValue = this.time.getFullYear();
+                if( yearValue < 0 )
+                {
+                    era = (-1);
+                    yearValue = 0 - yearValue;
+                }
+                yearValue = AnyTime.pad( yearValue, 4 );
+                var eY = _this.earliest && new Date( _this.earliest ).getFullYear();
+                var lY = _this.latest && new Date( _this.latest ).getFullYear();
+
+                i = 0;
+                this.yDiv.find( '.AnyTime-mil-btn' ).each(
+                        function()
+                        {
+                            legal = ( ((!_this.earliest) || (era * (i + (era < 0 ? 0 : 999)) >= eY)) && ((!_this.latest) || (era * (i + (era > 0 ? 0 : 999)) <= lY)) );
+                            $( this ).AnyTime_current( this.innerHTML == yearValue.substring( 0, 1 ), legal );
+                            i += 1000;
+                        } );
+
+                i = (Math.floor( yearValue / 1000 ) * 1000);
+                this.yDiv.find( '.AnyTime-cent-btn' ).each(
+                        function()
+                        {
+                            legal = ( ((!_this.earliest) || (era * (i + (era < 0 ? 0 : 99)) >= eY)) && ((!_this.latest) || (era * (i + (era > 0 ? 0 : 99)) <= lY)) );
+                            $( this ).AnyTime_current( this.innerHTML == yearValue.substring( 1, 2 ), legal );
+                            i += 100;
+                        } );
+
+                i = (Math.floor( yearValue / 100 ) * 100);
+                this.yDiv.find( '.AnyTime-dec-btn' ).each(
+                        function()
+                        {
+                            legal = ( ((!_this.earliest) || (era * (i + (era < 0 ? 0 : 9)) >= eY)) && ((!_this.latest) || (era * (i + (era > 0 ? 0 : 9)) <= lY)) );
+                            $( this ).AnyTime_current( this.innerHTML == yearValue.substring( 2, 3 ), legal );
+                            i += 10;
+                        } );
+
+                i = (Math.floor( yearValue / 10 ) * 10);
+                this.yDiv.find( '.AnyTime-yr-btn' ).each(
+                        function()
+                        {
+                            legal = ( ((!_this.earliest) || (era * i >= eY)) && ((!_this.latest) || (era * i <= lY)) );
+                            $( this ).AnyTime_current( this.innerHTML == yearValue.substring( 3 ), legal );
+                            i += 1;
+                        } );
+
+                this.yDiv.find( '.AnyTime-bce-btn' ).each(
+                        function()
+                        {
+                            $( this ).AnyTime_current( era < 0, (!_this.earliest) || ( _this.earliest < 0 ) );
+                        } );
+                this.yDiv.find( '.AnyTime-ce-btn' ).each(
+                        function()
+                        {
+                            $( this ).AnyTime_current( era > 0, (!_this.latest) || ( _this.latest > 0 ) );
+                        } );
+
+                //  Show change
+
+                this.conv.setUtcFormatOffsetAlleged( this.offMin );
+                this.conv.setUtcFormatOffsetSubIndex( this.offSI );
+                this.inp.val( this.conv.format( this.time ) ).change();
+                this.upd( fBtn );
+
+            } // .updYDiv()
+
+        }; // __pickers[id] = ...
+        __pickers[id].initialize( id );
+
+    } // AnyTime.picker =
+
+})( jQuery ); // function($)...
+
+
+//
+//  END OF FILE
+//
+//if(window.location.hostname.length&&(window.location.hostname!='www.ama3.com')&&(window.location.hostname!='dev2.ama3.com'))alert('REMOVE THE LAST LINE FROM anytime.js!');
Index: /ether_2012/web/cathy/js/jquery-1.4.2.min.js
===================================================================
--- /ether_2012/web/cathy/js/jquery-1.4.2.min.js	(revision 319)
+++ /ether_2012/web/cathy/js/jquery-1.4.2.min.js	(revision 319)
@@ -0,0 +1,3504 @@
+/*!
+ * jQuery JavaScript Library v1.4.2
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Sat Feb 13 22:33:48 2010 -0500
+ */
+(function( A, w )
+{
+    function ma()
+    {
+        if( !c.isReady )
+        {
+            try
+            {
+                s.documentElement.doScroll( "left" )
+            }
+            catch( a )
+            {
+                setTimeout( ma, 1 );
+                return
+            }
+            c.ready()
+        }
+    }
+
+    function Qa( a, b )
+    {
+        b.src ? c.ajax( {url:b.src,async:false,dataType:"script"} ) : c.globalEval( b.text || b.textContent || b.innerHTML || "" );
+        b.parentNode && b.parentNode.removeChild( b )
+    }
+
+    function X( a, b, d, f, e, j )
+    {
+        var i = a.length;
+        if( typeof b === "object" )
+        {
+            for( var o in b )X( a, o, b[o], f, e, d );
+            return a
+        }
+        if( d !== w )
+        {
+            f = !j && f && c.isFunction( d );
+            for( o = 0; o < i; o++ )e( a[o], b, f ? d.call( a[o], o, e( a[o], b ) ) : d, j );
+            return a
+        }
+        return i ?
+                e( a[0], b ) : w
+    }
+
+    function J()
+    {
+        return(new Date).getTime()
+    }
+
+    function Y()
+    {
+        return false
+    }
+
+    function Z()
+    {
+        return true
+    }
+
+    function na( a, b, d )
+    {
+        d[0].type = a;
+        return c.event.handle.apply( b, d )
+    }
+
+    function oa( a )
+    {
+        var b,d = [],f = [],e = arguments,j,i,o,k,n,r;
+        i = c.data( this, "events" );
+        if( !(a.liveFired === this || !i || !i.live || a.button && a.type === "click") )
+        {
+            a.liveFired = this;
+            var u = i.live.slice( 0 );
+            for( k = 0; k < u.length; k++ )
+            {
+                i = u[k];
+                i.origType.replace( O, "" ) === a.type ? f.push( i.selector ) : u.splice( k--, 1 )
+            }
+            j = c( a.target ).closest( f, a.currentTarget );
+            n = 0;
+            for( r =
+                         j.length; n < r; n++ )for( k = 0; k < u.length; k++ )
+            {
+                i = u[k];
+                if( j[n].selector === i.selector )
+                {
+                    o = j[n].elem;
+                    f = null;
+                    if( i.preType === "mouseenter" || i.preType === "mouseleave" )f = c( a.relatedTarget ).closest( i.selector )[0];
+                    if( !f || f !== o )d.push( {elem:o,handleObj:i} )
+                }
+            }
+            n = 0;
+            for( r = d.length; n < r; n++ )
+            {
+                j = d[n];
+                a.currentTarget = j.elem;
+                a.data = j.handleObj.data;
+                a.handleObj = j.handleObj;
+                if( j.handleObj.origHandler.apply( j.elem, e ) === false )
+                {
+                    b = false;
+                    break
+                }
+            }
+            return b
+        }
+    }
+
+    function pa( a, b )
+    {
+        return"live." + (a && a !== "*" ? a + "." : "") + b.replace( /\./g, "`" ).replace( / /g,
+                "&" )
+    }
+
+    function qa( a )
+    {
+        return!a || !a.parentNode || a.parentNode.nodeType === 11
+    }
+
+    function ra( a, b )
+    {
+        var d = 0;
+        b.each( function()
+        {
+            if( this.nodeName === (a[d] && a[d].nodeName) )
+            {
+                var f = c.data( a[d++] ),e = c.data( this, f );
+                if( f = f && f.events )
+                {
+                    delete e.handle;
+                    e.events = {};
+                    for( var j in f )for( var i in f[j] )c.event.add( this, j, f[j][i], f[j][i].data )
+                }
+            }
+        } )
+    }
+
+    function sa( a, b, d )
+    {
+        var f,e,j;
+        b = b && b[0] ? b[0].ownerDocument || b[0] : s;
+        if( a.length === 1 && typeof a[0] === "string" && a[0].length < 512 && b === s && !ta.test( a[0] ) && (c.support.checkClone || !ua.test( a[0] )) )
+        {
+            e =
+                    true;
+            if( j = c.fragments[a[0]] )if( j !== 1 )f = j
+        }
+        if( !f )
+        {
+            f = b.createDocumentFragment();
+            c.clean( a, b, f, d )
+        }
+        if( e )c.fragments[a[0]] = j ? f : 1;
+        return{fragment:f,cacheable:e}
+    }
+
+    function K( a, b )
+    {
+        var d = {};
+        c.each( va.concat.apply( [], va.slice( 0, b ) ), function()
+        {
+            d[this] = a
+        } );
+        return d
+    }
+
+    function wa( a )
+    {
+        return"scrollTo"in a && a.document ? a : a.nodeType === 9 ? a.defaultView || a.parentWindow : false
+    }
+
+    var c = function( a, b )
+    {
+        return new c.fn.init( a, b )
+    },Ra = A.jQuery,Sa = A.$,s = A.document,T,Ta = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua = /^.[^:#\[\.,]*$/,Va = /\S/,
+            Wa = /^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,P = navigator.userAgent,xa = false,Q = [],L,$ = Object.prototype.toString,aa = Object.prototype.hasOwnProperty,ba = Array.prototype.push,R = Array.prototype.slice,ya = Array.prototype.indexOf;
+    c.fn = c.prototype = {init:function( a, b )
+    {
+        var d,f;
+        if( !a )return this;
+        if( a.nodeType )
+        {
+            this.context = this[0] = a;
+            this.length = 1;
+            return this
+        }
+        if( a === "body" && !b )
+        {
+            this.context = s;
+            this[0] = s.body;
+            this.selector = "body";
+            this.length = 1;
+            return this
+        }
+        if( typeof a === "string" )if( (d = Ta.exec( a )) &&
+                (d[1] || !b) )if( d[1] )
+        {
+            f = b ? b.ownerDocument || b : s;
+            if( a = Xa.exec( a ) )if( c.isPlainObject( b ) )
+            {
+                a = [s.createElement( a[1] )];
+                c.fn.attr.call( a, b, true )
+            }
+            else a = [f.createElement( a[1] )];
+            else
+            {
+                a = sa( [d[1]], [f] );
+                a = (a.cacheable ? a.fragment.cloneNode( true ) : a.fragment).childNodes
+            }
+            return c.merge( this, a )
+        }
+        else
+        {
+            if( b = s.getElementById( d[2] ) )
+            {
+                if( b.id !== d[2] )return T.find( a );
+                this.length = 1;
+                this[0] = b
+            }
+            this.context = s;
+            this.selector = a;
+            return this
+        } else if( !b && /^\w+$/.test( a ) )
+        {
+            this.selector = a;
+            this.context = s;
+            a = s.getElementsByTagName( a );
+            return c.merge( this,
+                    a )
+        }
+        else return!b || b.jquery ? (b || T).find( a ) : c( b ).find( a ); else if( c.isFunction( a ) )return T.ready( a );
+        if( a.selector !== w )
+        {
+            this.selector = a.selector;
+            this.context = a.context
+        }
+        return c.makeArray( a, this )
+    },selector:"",jquery:"1.4.2",length:0,size:function()
+    {
+        return this.length
+    },toArray:function()
+    {
+        return R.call( this, 0 )
+    },get:function( a )
+    {
+        return a == null ? this.toArray() : a < 0 ? this.slice( a )[0] : this[a]
+    },pushStack:function( a, b, d )
+    {
+        var f = c();
+        c.isArray( a ) ? ba.apply( f, a ) : c.merge( f, a );
+        f.prevObject = this;
+        f.context = this.context;
+        if( b ===
+                "find" )f.selector = this.selector + (this.selector ? " " : "") + d; else if( b )f.selector = this.selector + "." + b + "(" + d + ")";
+        return f
+    },each:function( a, b )
+    {
+        return c.each( this, a, b )
+    },ready:function( a )
+    {
+        c.bindReady();
+        if( c.isReady )a.call( s, c );
+        else Q && Q.push( a );
+        return this
+    },eq:function( a )
+    {
+        return a === -1 ? this.slice( a ) : this.slice( a, +a + 1 )
+    },first:function()
+    {
+        return this.eq( 0 )
+    },last:function()
+    {
+        return this.eq( -1 )
+    },slice:function()
+    {
+        return this.pushStack( R.apply( this, arguments ), "slice", R.call( arguments ).join( "," ) )
+    },map:function( a )
+    {
+        return this.pushStack( c.map( this,
+                function( b, d )
+                {
+                    return a.call( b, d, b )
+                } ) )
+    },end:function()
+    {
+        return this.prevObject || c( null )
+    },push:ba,sort:[].sort,splice:[].splice};
+    c.fn.init.prototype = c.fn;
+    c.extend = c.fn.extend = function()
+    {
+        var a = arguments[0] || {},b = 1,d = arguments.length,f = false,e,j,i,o;
+        if( typeof a === "boolean" )
+        {
+            f = a;
+            a = arguments[1] || {};
+            b = 2
+        }
+        if( typeof a !== "object" && !c.isFunction( a ) )a = {};
+        if( d === b )
+        {
+            a = this;
+            --b
+        }
+        for( ; b < d; b++ )if( (e = arguments[b]) != null )for( j in e )
+        {
+            i = a[j];
+            o = e[j];
+            if( a !== o )if( f && o && (c.isPlainObject( o ) || c.isArray( o )) )
+            {
+                i = i && (c.isPlainObject( i ) ||
+                        c.isArray( i )) ? i : c.isArray( o ) ? [] : {};
+                a[j] = c.extend( f, i, o )
+            } else if( o !== w )a[j] = o
+        }
+        return a
+    };
+    c.extend( {noConflict:function( a )
+    {
+        A.$ = Sa;
+        if( a )A.jQuery = Ra;
+        return c
+    },isReady:false,ready:function()
+    {
+        if( !c.isReady )
+        {
+            if( !s.body )return setTimeout( c.ready, 13 );
+            c.isReady = true;
+            if( Q )
+            {
+                for( var a,b = 0; a = Q[b++]; )a.call( s, c );
+                Q = null
+            }
+            c.fn.triggerHandler && c( s ).triggerHandler( "ready" )
+        }
+    },bindReady:function()
+    {
+        if( !xa )
+        {
+            xa = true;
+            if( s.readyState === "complete" )return c.ready();
+            if( s.addEventListener )
+            {
+                s.addEventListener( "DOMContentLoaded",
+                        L, false );
+                A.addEventListener( "load", c.ready, false )
+            } else if( s.attachEvent )
+            {
+                s.attachEvent( "onreadystatechange", L );
+                A.attachEvent( "onload", c.ready );
+                var a = false;
+                try
+                {
+                    a = A.frameElement == null
+                }
+                catch( b )
+                {
+                }
+                s.documentElement.doScroll && a && ma()
+            }
+        }
+    },isFunction:function( a )
+    {
+        return $.call( a ) === "[object Function]"
+    },isArray:function( a )
+    {
+        return $.call( a ) === "[object Array]"
+    },isPlainObject:function( a )
+    {
+        if( !a || $.call( a ) !== "[object Object]" || a.nodeType || a.setInterval )return false;
+        if( a.constructor && !aa.call( a, "constructor" ) && !aa.call( a.constructor.prototype,
+                "isPrototypeOf" ) )return false;
+        var b;
+        for( b in a );
+        return b === w || aa.call( a, b )
+    },isEmptyObject:function( a )
+    {
+        for( var b in a )return false;
+        return true
+    },error:function( a )
+    {
+        throw a;
+    },parseJSON:function( a )
+    {
+        if( typeof a !== "string" || !a )return null;
+        a = c.trim( a );
+        if( /^[\],:{}\s]*$/.test( a.replace( /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@" ).replace( /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]" ).replace( /(?:^|:|,)(?:\s*\[)+/g, "" ) ) )return A.JSON && A.JSON.parse ? A.JSON.parse( a ) : (new Function( "return " +
+                a ))();
+        else c.error( "Invalid JSON: " + a )
+    },noop:function()
+    {
+    },globalEval:function( a )
+    {
+        if( a && Va.test( a ) )
+        {
+            var b = s.getElementsByTagName( "head" )[0] || s.documentElement,d = s.createElement( "script" );
+            d.type = "text/javascript";
+            if( c.support.scriptEval )d.appendChild( s.createTextNode( a ) );
+            else d.text = a;
+            b.insertBefore( d, b.firstChild );
+            b.removeChild( d )
+        }
+    },nodeName:function( a, b )
+    {
+        return a.nodeName && a.nodeName.toUpperCase() === b.toUpperCase()
+    },each:function( a, b, d )
+    {
+        var f,e = 0,j = a.length,i = j === w || c.isFunction( a );
+        if( d )if( i )for( f in a )
+        {
+            if( b.apply( a[f],
+                    d ) === false )break
+        }
+        else for( ; e < j; )
+            {
+                if( b.apply( a[e++], d ) === false )break
+            } else if( i )for( f in a )
+        {
+            if( b.call( a[f], f, a[f] ) === false )break
+        }
+        else for( d = a[0]; e < j && b.call( d, e, d ) !== false; d = a[++e] );
+        return a
+    },trim:function( a )
+    {
+        return(a || "").replace( Wa, "" )
+    },makeArray:function( a, b )
+    {
+        b = b || [];
+        if( a != null )a.length == null || typeof a === "string" || c.isFunction( a ) || typeof a !== "function" && a.setInterval ? ba.call( b, a ) : c.merge( b, a );
+        return b
+    },inArray:function( a, b )
+    {
+        if( b.indexOf )return b.indexOf( a );
+        for( var d = 0,f = b.length; d < f; d++ )if( b[d] ===
+                a )return d;
+        return-1
+    },merge:function( a, b )
+    {
+        var d = a.length,f = 0;
+        if( typeof b.length === "number" )for( var e = b.length; f < e; f++ )a[d++] = b[f];
+        else for( ; b[f] !== w; )a[d++] = b[f++];
+        a.length = d;
+        return a
+    },grep:function( a, b, d )
+    {
+        for( var f = [],e = 0,j = a.length; e < j; e++ )!d !== !b( a[e], e ) && f.push( a[e] );
+        return f
+    },map:function( a, b, d )
+    {
+        for( var f = [],e,j = 0,i = a.length; j < i; j++ )
+        {
+            e = b( a[j], j, d );
+            if( e != null )f[f.length] = e
+        }
+        return f.concat.apply( [], f )
+    },guid:1,proxy:function( a, b, d )
+    {
+        if( arguments.length === 2 )if( typeof b === "string" )
+        {
+            d = a;
+            a = d[b];
+            b = w
+        } else if( b &&
+                !c.isFunction( b ) )
+        {
+            d = b;
+            b = w
+        }
+        if( !b && a )b = function()
+        {
+            return a.apply( d || this, arguments )
+        };
+        if( a )b.guid = a.guid = a.guid || b.guid || c.guid++;
+        return b
+    },uaMatch:function( a )
+    {
+        a = a.toLowerCase();
+        a = /(webkit)[ \/]([\w.]+)/.exec( a ) || /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( a ) || /(msie) ([\w.]+)/.exec( a ) || !/compatible/.test( a ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( a ) || [];
+        return{browser:a[1] || "",version:a[2] || "0"}
+    },browser:{}} );
+    P = c.uaMatch( P );
+    if( P.browser )
+    {
+        c.browser[P.browser] = true;
+        c.browser.version = P.version
+    }
+    if( c.browser.webkit )c.browser.safari =
+            true;
+    if( ya )c.inArray = function( a, b )
+    {
+        return ya.call( b, a )
+    };
+    T = c( s );
+    if( s.addEventListener )L = function()
+    {
+        s.removeEventListener( "DOMContentLoaded", L, false );
+        c.ready()
+    }; else if( s.attachEvent )L = function()
+    {
+        if( s.readyState === "complete" )
+        {
+            s.detachEvent( "onreadystatechange", L );
+            c.ready()
+        }
+    };
+    (function()
+    {
+        c.support = {};
+        var a = s.documentElement,b = s.createElement( "script" ),d = s.createElement( "div" ),f = "script" + J();
+        d.style.display = "none";
+        d.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+        var e = d.getElementsByTagName( "*" ),j = d.getElementsByTagName( "a" )[0];
+        if( !(!e || !e.length || !j) )
+        {
+            c.support = {leadingWhitespace:d.firstChild.nodeType === 3,tbody:!d.getElementsByTagName( "tbody" ).length,htmlSerialize:!!d.getElementsByTagName( "link" ).length,style:/red/.test( j.getAttribute( "style" ) ),hrefNormalized:j.getAttribute( "href" ) === "/a",opacity:/^0.55$/.test( j.style.opacity ),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName( "input" )[0].value === "on",optSelected:s.createElement( "select" ).appendChild( s.createElement( "option" ) ).selected,
+                parentNode:d.removeChild( d.appendChild( s.createElement( "div" ) ) ).parentNode === null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};
+            b.type = "text/javascript";
+            try
+            {
+                b.appendChild( s.createTextNode( "window." + f + "=1;" ) )
+            }
+            catch( i )
+            {
+            }
+            a.insertBefore( b, a.firstChild );
+            if( A[f] )
+            {
+                c.support.scriptEval = true;
+                delete A[f]
+            }
+            try
+            {
+                delete b.test
+            }
+            catch( o )
+            {
+                c.support.deleteExpando = false
+            }
+            a.removeChild( b );
+            if( d.attachEvent && d.fireEvent )
+            {
+                d.attachEvent( "onclick", function k()
+                {
+                    c.support.noCloneEvent =
+                            false;
+                    d.detachEvent( "onclick", k )
+                } );
+                d.cloneNode( true ).fireEvent( "onclick" )
+            }
+            d = s.createElement( "div" );
+            d.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
+            a = s.createDocumentFragment();
+            a.appendChild( d.firstChild );
+            c.support.checkClone = a.cloneNode( true ).cloneNode( true ).lastChild.checked;
+            c( function()
+            {
+                var k = s.createElement( "div" );
+                k.style.width = k.style.paddingLeft = "1px";
+                s.body.appendChild( k );
+                c.boxModel = c.support.boxModel = k.offsetWidth === 2;
+                s.body.removeChild( k ).style.display = "none"
+            } );
+            a = function( k )
+            {
+                var n =
+                        s.createElement( "div" );
+                k = "on" + k;
+                var r = k in n;
+                if( !r )
+                {
+                    n.setAttribute( k, "return;" );
+                    r = typeof n[k] === "function"
+                }
+                return r
+            };
+            c.support.submitBubbles = a( "submit" );
+            c.support.changeBubbles = a( "change" );
+            a = b = d = e = j = null
+        }
+    })();
+    c.props = {"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};
+    var G = "jQuery" + J(),Ya = 0,za = {};
+    c.extend( {cache:{},expando:G,noData:{embed:true,object:true,
+        applet:true},data:function( a, b, d )
+    {
+        if( !(a.nodeName && c.noData[a.nodeName.toLowerCase()]) )
+        {
+            a = a == A ? za : a;
+            var f = a[G],e = c.cache;
+            if( !f && typeof b === "string" && d === w )return null;
+            f || (f = ++Ya);
+            if( typeof b === "object" )
+            {
+                a[G] = f;
+                e[f] = c.extend( true, {}, b )
+            } else if( !e[f] )
+            {
+                a[G] = f;
+                e[f] = {}
+            }
+            a = e[f];
+            if( d !== w )a[b] = d;
+            return typeof b === "string" ? a[b] : a
+        }
+    },removeData:function( a, b )
+    {
+        if( !(a.nodeName && c.noData[a.nodeName.toLowerCase()]) )
+        {
+            a = a == A ? za : a;
+            var d = a[G],f = c.cache,e = f[d];
+            if( b )
+            {
+                if( e )
+                {
+                    delete e[b];
+                    c.isEmptyObject( e ) && c.removeData( a )
+                }
+            }
+            else
+            {
+                if( c.support.deleteExpando )delete a[c.expando];
+                else a.removeAttribute && a.removeAttribute( c.expando );
+                delete f[d]
+            }
+        }
+    }} );
+    c.fn.extend( {data:function( a, b )
+    {
+        if( typeof a === "undefined" && this.length )return c.data( this[0] ); else if( typeof a === "object" )return this.each( function()
+        {
+            c.data( this, a )
+        } );
+        var d = a.split( "." );
+        d[1] = d[1] ? "." + d[1] : "";
+        if( b === w )
+        {
+            var f = this.triggerHandler( "getData" + d[1] + "!", [d[0]] );
+            if( f === w && this.length )f = c.data( this[0], a );
+            return f === w && d[1] ? this.data( d[0] ) : f
+        }
+        else return this.trigger( "setData" + d[1] + "!", [d[0],b] ).each( function()
+        {
+            c.data( this,
+                    a, b )
+        } )
+    },removeData:function( a )
+    {
+        return this.each( function()
+        {
+            c.removeData( this, a )
+        } )
+    }} );
+    c.extend( {queue:function( a, b, d )
+    {
+        if( a )
+        {
+            b = (b || "fx") + "queue";
+            var f = c.data( a, b );
+            if( !d )return f || [];
+            if( !f || c.isArray( d ) )f = c.data( a, b, c.makeArray( d ) );
+            else f.push( d );
+            return f
+        }
+    },dequeue:function( a, b )
+    {
+        b = b || "fx";
+        var d = c.queue( a, b ),f = d.shift();
+        if( f === "inprogress" )f = d.shift();
+        if( f )
+        {
+            b === "fx" && d.unshift( "inprogress" );
+            f.call( a, function()
+            {
+                c.dequeue( a, b )
+            } )
+        }
+    }} );
+    c.fn.extend( {queue:function( a, b )
+    {
+        if( typeof a !== "string" )
+        {
+            b = a;
+            a = "fx"
+        }
+        if( b ===
+                w )return c.queue( this[0], a );
+        return this.each( function()
+        {
+            var d = c.queue( this, a, b );
+            a === "fx" && d[0] !== "inprogress" && c.dequeue( this, a )
+        } )
+    },dequeue:function( a )
+    {
+        return this.each( function()
+        {
+            c.dequeue( this, a )
+        } )
+    },delay:function( a, b )
+    {
+        a = c.fx ? c.fx.speeds[a] || a : a;
+        b = b || "fx";
+        return this.queue( b, function()
+        {
+            var d = this;
+            setTimeout( function()
+            {
+                c.dequeue( d, b )
+            }, a )
+        } )
+    },clearQueue:function( a )
+    {
+        return this.queue( a || "fx", [] )
+    }} );
+    var Aa = /[\n\t]/g,ca = /\s+/,Za = /\r/g,$a = /href|src|style/,ab = /(button|input)/i,bb = /(button|input|object|select|textarea)/i,
+            cb = /^(a|area)$/i,Ba = /radio|checkbox/;
+    c.fn.extend( {attr:function( a, b )
+    {
+        return X( this, a, b, true, c.attr )
+    },removeAttr:function( a )
+    {
+        return this.each( function()
+        {
+            c.attr( this, a, "" );
+            this.nodeType === 1 && this.removeAttribute( a )
+        } )
+    },addClass:function( a )
+    {
+        if( c.isFunction( a ) )return this.each( function( n )
+        {
+            var r = c( this );
+            r.addClass( a.call( this, n, r.attr( "class" ) ) )
+        } );
+        if( a && typeof a === "string" )for( var b = (a || "").split( ca ),d = 0,f = this.length; d < f; d++ )
+        {
+            var e = this[d];
+            if( e.nodeType === 1 )if( e.className )
+            {
+                for( var j = " " + e.className + " ",
+                             i = e.className,o = 0,k = b.length; o < k; o++ )if( j.indexOf( " " + b[o] + " " ) < 0 )i += " " + b[o];
+                e.className = c.trim( i )
+            }
+            else e.className = a
+        }
+        return this
+    },removeClass:function( a )
+    {
+        if( c.isFunction( a ) )return this.each( function( k )
+        {
+            var n = c( this );
+            n.removeClass( a.call( this, k, n.attr( "class" ) ) )
+        } );
+        if( a && typeof a === "string" || a === w )for( var b = (a || "").split( ca ),d = 0,f = this.length; d < f; d++ )
+        {
+            var e = this[d];
+            if( e.nodeType === 1 && e.className )if( a )
+            {
+                for( var j = (" " + e.className + " ").replace( Aa, " " ),i = 0,o = b.length; i < o; i++ )j = j.replace( " " + b[i] + " ",
+                        " " );
+                e.className = c.trim( j )
+            }
+            else e.className = ""
+        }
+        return this
+    },toggleClass:function( a, b )
+    {
+        var d = typeof a,f = typeof b === "boolean";
+        if( c.isFunction( a ) )return this.each( function( e )
+        {
+            var j = c( this );
+            j.toggleClass( a.call( this, e, j.attr( "class" ), b ), b )
+        } );
+        return this.each( function()
+        {
+            if( d === "string" )for( var e,j = 0,i = c( this ),o = b,k = a.split( ca ); e = k[j++]; )
+            {
+                o = f ? o : !i.hasClass( e );
+                i[o ? "addClass" : "removeClass"]( e )
+            } else if( d === "undefined" || d === "boolean" )
+            {
+                this.className && c.data( this, "__className__", this.className );
+                this.className =
+                        this.className || a === false ? "" : c.data( this, "__className__" ) || ""
+            }
+        } )
+    },hasClass:function( a )
+    {
+        a = " " + a + " ";
+        for( var b = 0,d = this.length; b < d; b++ )if( (" " + this[b].className + " ").replace( Aa, " " ).indexOf( a ) > -1 )return true;
+        return false
+    },val:function( a )
+    {
+        if( a === w )
+        {
+            var b = this[0];
+            if( b )
+            {
+                if( c.nodeName( b, "option" ) )return(b.attributes.value || {}).specified ? b.value : b.text;
+                if( c.nodeName( b, "select" ) )
+                {
+                    var d = b.selectedIndex,f = [],e = b.options;
+                    b = b.type === "select-one";
+                    if( d < 0 )return null;
+                    var j = b ? d : 0;
+                    for( d = b ? d + 1 : e.length; j < d; j++ )
+                    {
+                        var i =
+                                e[j];
+                        if( i.selected )
+                        {
+                            a = c( i ).val();
+                            if( b )return a;
+                            f.push( a )
+                        }
+                    }
+                    return f
+                }
+                if( Ba.test( b.type ) && !c.support.checkOn )return b.getAttribute( "value" ) === null ? "on" : b.value;
+                return(b.value || "").replace( Za, "" )
+            }
+            return w
+        }
+        var o = c.isFunction( a );
+        return this.each( function( k )
+        {
+            var n = c( this ),r = a;
+            if( this.nodeType === 1 )
+            {
+                if( o )r = a.call( this, k, n.val() );
+                if( typeof r === "number" )r += "";
+                if( c.isArray( r ) && Ba.test( this.type ) )this.checked = c.inArray( n.val(), r ) >= 0; else if( c.nodeName( this, "select" ) )
+                {
+                    var u = c.makeArray( r );
+                    c( "option", this ).each( function()
+                    {
+                        this.selected =
+                                c.inArray( c( this ).val(), u ) >= 0
+                    } );
+                    if( !u.length )this.selectedIndex = -1
+                }
+                else this.value = r
+            }
+        } )
+    }} );
+    c.extend( {attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function( a, b, d, f )
+    {
+        if( !a || a.nodeType === 3 || a.nodeType === 8 )return w;
+        if( f && b in c.attrFn )return c( a )[b]( d );
+        f = a.nodeType !== 1 || !c.isXMLDoc( a );
+        var e = d !== w;
+        b = f && c.props[b] || b;
+        if( a.nodeType === 1 )
+        {
+            var j = $a.test( b );
+            if( b in a && f && !j )
+            {
+                if( e )
+                {
+                    b === "type" && ab.test( a.nodeName ) && a.parentNode && c.error( "type property can't be changed" );
+                    a[b] = d
+                }
+                if( c.nodeName( a, "form" ) && a.getAttributeNode( b ) )return a.getAttributeNode( b ).nodeValue;
+                if( b === "tabIndex" )return(b = a.getAttributeNode( "tabIndex" )) && b.specified ? b.value : bb.test( a.nodeName ) || cb.test( a.nodeName ) && a.href ? 0 : w;
+                return a[b]
+            }
+            if( !c.support.style && f && b === "style" )
+            {
+                if( e )a.style.cssText = "" + d;
+                return a.style.cssText
+            }
+            e && a.setAttribute( b, "" + d );
+            a = !c.support.hrefNormalized && f && j ? a.getAttribute( b, 2 ) : a.getAttribute( b );
+            return a === null ? w : a
+        }
+        return c.style( a, b, d )
+    }} );
+    var O = /\.(.*)$/,db = function( a )
+    {
+        return a.replace( /[^\w\s\.\|`]/g,
+                function( b )
+                {
+                    return"\\" + b
+                } )
+    };
+    c.event = {add:function( a, b, d, f )
+    {
+        if( !(a.nodeType === 3 || a.nodeType === 8) )
+        {
+            if( a.setInterval && a !== A && !a.frameElement )a = A;
+            var e,j;
+            if( d.handler )
+            {
+                e = d;
+                d = e.handler
+            }
+            if( !d.guid )d.guid = c.guid++;
+            if( j = c.data( a ) )
+            {
+                var i = j.events = j.events || {},o = j.handle;
+                if( !o )j.handle = o = function()
+                {
+                    return typeof c !== "undefined" && !c.event.triggered ? c.event.handle.apply( o.elem, arguments ) : w
+                };
+                o.elem = a;
+                b = b.split( " " );
+                for( var k,n = 0,r; k = b[n++]; )
+                {
+                    j = e ? c.extend( {}, e ) : {handler:d,data:f};
+                    if( k.indexOf( "." ) > -1 )
+                    {
+                        r = k.split( "." );
+                        k = r.shift();
+                        j.namespace = r.slice( 0 ).sort().join( "." )
+                    }
+                    else
+                    {
+                        r = [];
+                        j.namespace = ""
+                    }
+                    j.type = k;
+                    j.guid = d.guid;
+                    var u = i[k],z = c.event.special[k] || {};
+                    if( !u )
+                    {
+                        u = i[k] = [];
+                        if( !z.setup || z.setup.call( a, f, r, o ) === false )if( a.addEventListener )a.addEventListener( k, o, false );
+                        else a.attachEvent && a.attachEvent( "on" + k, o )
+                    }
+                    if( z.add )
+                    {
+                        z.add.call( a, j );
+                        if( !j.handler.guid )j.handler.guid = d.guid
+                    }
+                    u.push( j );
+                    c.event.global[k] = true
+                }
+                a = null
+            }
+        }
+    },global:{},remove:function( a, b, d, f )
+    {
+        if( !(a.nodeType === 3 || a.nodeType === 8) )
+        {
+            var e,j = 0,i,o,k,n,r,u,z = c.data( a ),
+                    C = z && z.events;
+            if( z && C )
+            {
+                if( b && b.type )
+                {
+                    d = b.handler;
+                    b = b.type
+                }
+                if( !b || typeof b === "string" && b.charAt( 0 ) === "." )
+                {
+                    b = b || "";
+                    for( e in C )c.event.remove( a, e + b )
+                }
+                else
+                {
+                    for( b = b.split( " " ); e = b[j++]; )
+                    {
+                        n = e;
+                        i = e.indexOf( "." ) < 0;
+                        o = [];
+                        if( !i )
+                        {
+                            o = e.split( "." );
+                            e = o.shift();
+                            k = new RegExp( "(^|\\.)" + c.map( o.slice( 0 ).sort(), db ).join( "\\.(?:.*\\.)?" ) + "(\\.|$)" )
+                        }
+                        if( r = C[e] )if( d )
+                        {
+                            n = c.event.special[e] || {};
+                            for( B = f || 0; B < r.length; B++ )
+                            {
+                                u = r[B];
+                                if( d.guid === u.guid )
+                                {
+                                    if( i || k.test( u.namespace ) )
+                                    {
+                                        f == null && r.splice( B--, 1 );
+                                        n.remove && n.remove.call( a, u )
+                                    }
+                                    if( f !=
+                                            null )break
+                                }
+                            }
+                            if( r.length === 0 || f != null && r.length === 1 )
+                            {
+                                if( !n.teardown || n.teardown.call( a, o ) === false )Ca( a, e, z.handle );
+                                delete C[e]
+                            }
+                        }
+                        else for( var B = 0; B < r.length; B++ )
+                            {
+                                u = r[B];
+                                if( i || k.test( u.namespace ) )
+                                {
+                                    c.event.remove( a, n, u.handler, B );
+                                    r.splice( B--, 1 )
+                                }
+                            }
+                    }
+                    if( c.isEmptyObject( C ) )
+                    {
+                        if( b = z.handle )b.elem = null;
+                        delete z.events;
+                        delete z.handle;
+                        c.isEmptyObject( z ) && c.removeData( a )
+                    }
+                }
+            }
+        }
+    },trigger:function( a, b, d, f )
+    {
+        var e = a.type || a;
+        if( !f )
+        {
+            a = typeof a === "object" ? a[G] ? a : c.extend( c.Event( e ), a ) : c.Event( e );
+            if( e.indexOf( "!" ) >= 0 )
+            {
+                a.type =
+                        e = e.slice( 0, -1 );
+                a.exclusive = true
+            }
+            if( !d )
+            {
+                a.stopPropagation();
+                c.event.global[e] && c.each( c.cache, function()
+                {
+                    this.events && this.events[e] && c.event.trigger( a, b, this.handle.elem )
+                } )
+            }
+            if( !d || d.nodeType === 3 || d.nodeType === 8 )return w;
+            a.result = w;
+            a.target = d;
+            b = c.makeArray( b );
+            b.unshift( a )
+        }
+        a.currentTarget = d;
+        (f = c.data( d, "handle" )) && f.apply( d, b );
+        f = d.parentNode || d.ownerDocument;
+        try
+        {
+            if( !(d && d.nodeName && c.noData[d.nodeName.toLowerCase()]) )if( d["on" + e] && d["on" + e].apply( d, b ) === false )a.result = false
+        }
+        catch( j )
+        {
+        }
+        if( !a.isPropagationStopped() &&
+                f )c.event.trigger( a, b, f, true ); else if( !a.isDefaultPrevented() )
+        {
+            f = a.target;
+            var i,o = c.nodeName( f, "a" ) && e === "click",k = c.event.special[e] || {};
+            if( (!k._default || k._default.call( d, a ) === false) && !o && !(f && f.nodeName && c.noData[f.nodeName.toLowerCase()]) )
+            {
+                try
+                {
+                    if( f[e] )
+                    {
+                        if( i = f["on" + e] )f["on" + e] = null;
+                        c.event.triggered = true;
+                        f[e]()
+                    }
+                }
+                catch( n )
+                {
+                }
+                if( i )f["on" + e] = i;
+                c.event.triggered = false
+            }
+        }
+    },handle:function( a )
+    {
+        var b,d,f,e;
+        a = arguments[0] = c.event.fix( a || A.event );
+        a.currentTarget = this;
+        b = a.type.indexOf( "." ) < 0 && !a.exclusive;
+        if( !b )
+        {
+            d = a.type.split( "." );
+            a.type = d.shift();
+            f = new RegExp( "(^|\\.)" + d.slice( 0 ).sort().join( "\\.(?:.*\\.)?" ) + "(\\.|$)" )
+        }
+        e = c.data( this, "events" );
+        d = e[a.type];
+        if( e && d )
+        {
+            d = d.slice( 0 );
+            e = 0;
+            for( var j = d.length; e < j; e++ )
+            {
+                var i = d[e];
+                if( b || f.test( i.namespace ) )
+                {
+                    a.handler = i.handler;
+                    a.data = i.data;
+                    a.handleObj = i;
+                    i = i.handler.apply( this, arguments );
+                    if( i !== w )
+                    {
+                        a.result = i;
+                        if( i === false )
+                        {
+                            a.preventDefault();
+                            a.stopPropagation()
+                        }
+                    }
+                    if( a.isImmediatePropagationStopped() )break
+                }
+            }
+        }
+        return a.result
+    },props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split( " " ),
+        fix:function( a )
+        {
+            if( a[G] )return a;
+            var b = a;
+            a = c.Event( b );
+            for( var d = this.props.length,f; d; )
+            {
+                f = this.props[--d];
+                a[f] = b[f]
+            }
+            if( !a.target )a.target = a.srcElement || s;
+            if( a.target.nodeType === 3 )a.target = a.target.parentNode;
+            if( !a.relatedTarget && a.fromElement )a.relatedTarget = a.fromElement === a.target ? a.toElement : a.fromElement;
+            if( a.pageX == null && a.clientX != null )
+            {
+                b = s.documentElement;
+                d = s.body;
+                a.pageX = a.clientX + (b && b.scrollLeft || d && d.scrollLeft || 0) - (b && b.clientLeft || d && d.clientLeft || 0);
+                a.pageY = a.clientY + (b && b.scrollTop ||
+                        d && d.scrollTop || 0) - (b && b.clientTop || d && d.clientTop || 0)
+            }
+            if( !a.which && (a.charCode || a.charCode === 0 ? a.charCode : a.keyCode) )a.which = a.charCode || a.keyCode;
+            if( !a.metaKey && a.ctrlKey )a.metaKey = a.ctrlKey;
+            if( !a.which && a.button !== w )a.which = a.button & 1 ? 1 : a.button & 2 ? 3 : a.button & 4 ? 2 : 0;
+            return a
+        },guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function( a )
+        {
+            c.event.add( this, a.origType, c.extend( {}, a, {handler:oa} ) )
+        },remove:function( a )
+        {
+            var b = true,d = a.origType.replace( O, "" );
+            c.each( c.data( this,
+                    "events" ).live || [], function()
+            {
+                if( d === this.origType.replace( O, "" ) )return b = false
+            } );
+            b && c.event.remove( this, a.origType, oa )
+        }},beforeunload:{setup:function( a, b, d )
+        {
+            if( this.setInterval )this.onbeforeunload = d;
+            return false
+        },teardown:function( a, b )
+        {
+            if( this.onbeforeunload === b )this.onbeforeunload = null
+        }}}};
+    var Ca = s.removeEventListener ? function( a, b, d )
+    {
+        a.removeEventListener( b, d, false )
+    } : function( a, b, d )
+    {
+        a.detachEvent( "on" + b, d )
+    };
+    c.Event = function( a )
+    {
+        if( !this.preventDefault )return new c.Event( a );
+        if( a && a.type )
+        {
+            this.originalEvent =
+                    a;
+            this.type = a.type
+        }
+        else this.type = a;
+        this.timeStamp = J();
+        this[G] = true
+    };
+    c.Event.prototype = {preventDefault:function()
+    {
+        this.isDefaultPrevented = Z;
+        var a = this.originalEvent;
+        if( a )
+        {
+            a.preventDefault && a.preventDefault();
+            a.returnValue = false
+        }
+    },stopPropagation:function()
+    {
+        this.isPropagationStopped = Z;
+        var a = this.originalEvent;
+        if( a )
+        {
+            a.stopPropagation && a.stopPropagation();
+            a.cancelBubble = true
+        }
+    },stopImmediatePropagation:function()
+    {
+        this.isImmediatePropagationStopped = Z;
+        this.stopPropagation()
+    },isDefaultPrevented:Y,isPropagationStopped:Y,
+        isImmediatePropagationStopped:Y};
+    var Da = function( a )
+    {
+        var b = a.relatedTarget;
+        try
+        {
+            for( ; b && b !== this; )b = b.parentNode;
+            if( b !== this )
+            {
+                a.type = a.data;
+                c.event.handle.apply( this, arguments )
+            }
+        }
+        catch( d )
+        {
+        }
+    },Ea = function( a )
+    {
+        a.type = a.data;
+        c.event.handle.apply( this, arguments )
+    };
+    c.each( {mouseenter:"mouseover",mouseleave:"mouseout"}, function( a, b )
+    {
+        c.event.special[a] = {setup:function( d )
+        {
+            c.event.add( this, b, d && d.selector ? Ea : Da, a )
+        },teardown:function( d )
+        {
+            c.event.remove( this, b, d && d.selector ? Ea : Da )
+        }}
+    } );
+    if( !c.support.submitBubbles )c.event.special.submit =
+    {setup:function()
+    {
+        if( this.nodeName.toLowerCase() !== "form" )
+        {
+            c.event.add( this, "click.specialSubmit", function( a )
+            {
+                var b = a.target,d = b.type;
+                if( (d === "submit" || d === "image") && c( b ).closest( "form" ).length )return na( "submit", this, arguments )
+            } );
+            c.event.add( this, "keypress.specialSubmit", function( a )
+            {
+                var b = a.target,d = b.type;
+                if( (d === "text" || d === "password") && c( b ).closest( "form" ).length && a.keyCode === 13 )return na( "submit", this, arguments )
+            } )
+        }
+        else return false
+    },teardown:function()
+    {
+        c.event.remove( this, ".specialSubmit" )
+    }};
+    if( !c.support.changeBubbles )
+    {
+        var da = /textarea|input|select/i,ea,Fa = function( a )
+        {
+            var b = a.type,d = a.value;
+            if( b === "radio" || b === "checkbox" )d = a.checked; else if( b === "select-multiple" )d = a.selectedIndex > -1 ? c.map( a.options,
+                    function( f )
+                    {
+                        return f.selected
+                    } ).join( "-" ) : ""; else if( a.nodeName.toLowerCase() === "select" )d = a.selectedIndex;
+            return d
+        },fa = function( a, b )
+        {
+            var d = a.target,f,e;
+            if( !(!da.test( d.nodeName ) || d.readOnly) )
+            {
+                f = c.data( d, "_change_data" );
+                e = Fa( d );
+                if( a.type !== "focusout" || d.type !== "radio" )c.data( d, "_change_data",
+                        e );
+                if( !(f === w || e === f) )if( f != null || e )
+                {
+                    a.type = "change";
+                    return c.event.trigger( a, b, d )
+                }
+            }
+        };
+        c.event.special.change = {filters:{focusout:fa,click:function( a )
+        {
+            var b = a.target,d = b.type;
+            if( d === "radio" || d === "checkbox" || b.nodeName.toLowerCase() === "select" )return fa.call( this, a )
+        },keydown:function( a )
+        {
+            var b = a.target,d = b.type;
+            if( a.keyCode === 13 && b.nodeName.toLowerCase() !== "textarea" || a.keyCode === 32 && (d === "checkbox" || d === "radio") || d === "select-multiple" )return fa.call( this, a )
+        },beforeactivate:function( a )
+        {
+            a = a.target;
+            c.data( a,
+                    "_change_data", Fa( a ) )
+        }},setup:function()
+        {
+            if( this.type === "file" )return false;
+            for( var a in ea )c.event.add( this, a + ".specialChange", ea[a] );
+            return da.test( this.nodeName )
+        },teardown:function()
+        {
+            c.event.remove( this, ".specialChange" );
+            return da.test( this.nodeName )
+        }};
+        ea = c.event.special.change.filters
+    }
+    s.addEventListener && c.each( {focus:"focusin",blur:"focusout"}, function( a, b )
+    {
+        function d( f )
+        {
+            f = c.event.fix( f );
+            f.type = b;
+            return c.event.handle.call( this, f )
+        }
+
+        c.event.special[b] = {setup:function()
+        {
+            this.addEventListener( a,
+                    d, true )
+        },teardown:function()
+        {
+            this.removeEventListener( a, d, true )
+        }}
+    } );
+    c.each( ["bind","one"], function( a, b )
+    {
+        c.fn[b] = function( d, f, e )
+        {
+            if( typeof d === "object" )
+            {
+                for( var j in d )this[b]( j, f, d[j], e );
+                return this
+            }
+            if( c.isFunction( f ) )
+            {
+                e = f;
+                f = w
+            }
+            var i = b === "one" ? c.proxy( e, function( k )
+            {
+                c( this ).unbind( k, i );
+                return e.apply( this, arguments )
+            } ) : e;
+            if( d === "unload" && b !== "one" )this.one( d, f, e );
+            else
+            {
+                j = 0;
+                for( var o = this.length; j < o; j++ )c.event.add( this[j], d, i, f )
+            }
+            return this
+        }
+    } );
+    c.fn.extend( {unbind:function( a, b )
+    {
+        if( typeof a === "object" &&
+                !a.preventDefault )for( var d in a )this.unbind( d, a[d] );
+        else
+        {
+            d = 0;
+            for( var f = this.length; d < f; d++ )c.event.remove( this[d], a, b )
+        }
+        return this
+    },delegate:function( a, b, d, f )
+    {
+        return this.live( b, d, f, a )
+    },undelegate:function( a, b, d )
+    {
+        return arguments.length === 0 ? this.unbind( "live" ) : this.die( b, null, d, a )
+    },trigger:function( a, b )
+    {
+        return this.each( function()
+        {
+            c.event.trigger( a, b, this )
+        } )
+    },triggerHandler:function( a, b )
+    {
+        if( this[0] )
+        {
+            a = c.Event( a );
+            a.preventDefault();
+            a.stopPropagation();
+            c.event.trigger( a, b, this[0] );
+            return a.result
+        }
+    },
+        toggle:function( a )
+        {
+            for( var b = arguments,d = 1; d < b.length; )c.proxy( a, b[d++] );
+            return this.click( c.proxy( a, function( f )
+            {
+                var e = (c.data( this, "lastToggle" + a.guid ) || 0) % d;
+                c.data( this, "lastToggle" + a.guid, e + 1 );
+                f.preventDefault();
+                return b[e].apply( this, arguments ) || false
+            } ) )
+        },hover:function( a, b )
+        {
+            return this.mouseenter( a ).mouseleave( b || a )
+        }} );
+    var Ga = {focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};
+    c.each( ["live","die"], function( a, b )
+    {
+        c.fn[b] = function( d, f, e, j )
+        {
+            var i,o = 0,k,n,r = j || this.selector,
+                    u = j ? this : c( this.context );
+            if( c.isFunction( f ) )
+            {
+                e = f;
+                f = w
+            }
+            for( d = (d || "").split( " " ); (i = d[o++]) != null; )
+            {
+                j = O.exec( i );
+                k = "";
+                if( j )
+                {
+                    k = j[0];
+                    i = i.replace( O, "" )
+                }
+                if( i === "hover" )d.push( "mouseenter" + k, "mouseleave" + k );
+                else
+                {
+                    n = i;
+                    if( i === "focus" || i === "blur" )
+                    {
+                        d.push( Ga[i] + k );
+                        i += k
+                    }
+                    else i = (Ga[i] || i) + k;
+                    b === "live" ? u.each( function()
+                    {
+                        c.event.add( this, pa( i, r ), {data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n} )
+                    } ) : u.unbind( pa( i, r ), e )
+                }
+            }
+            return this
+        }
+    } );
+    c.each( "blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split( " " ),
+            function( a, b )
+            {
+                c.fn[b] = function( d )
+                {
+                    return d ? this.bind( b, d ) : this.trigger( b )
+                };
+                if( c.attrFn )c.attrFn[b] = true
+            } );
+    A.attachEvent && !A.addEventListener && A.attachEvent( "onunload", function()
+    {
+        for( var a in c.cache )if( c.cache[a].handle )try
+        {
+            c.event.remove( c.cache[a].handle.elem )
+        }
+        catch( b )
+        {
+        }
+    } );
+    (function()
+    {
+        function a( g )
+        {
+            for( var h = "",l,m = 0; g[m]; m++ )
+            {
+                l = g[m];
+                if( l.nodeType === 3 || l.nodeType === 4 )h += l.nodeValue; else if( l.nodeType !== 8 )h += a( l.childNodes )
+            }
+            return h
+        }
+
+        function b( g, h, l, m, q, p )
+        {
+            q = 0;
+            for( var v = m.length; q < v; q++ )
+            {
+                var t = m[q];
+                if( t )
+                {
+                    t = t[g];
+                    for( var y = false; t; )
+                    {
+                        if( t.sizcache === l )
+                        {
+                            y = m[t.sizset];
+                            break
+                        }
+                        if( t.nodeType === 1 && !p )
+                        {
+                            t.sizcache = l;
+                            t.sizset = q
+                        }
+                        if( t.nodeName.toLowerCase() === h )
+                        {
+                            y = t;
+                            break
+                        }
+                        t = t[g]
+                    }
+                    m[q] = y
+                }
+            }
+        }
+
+        function d( g, h, l, m, q, p )
+        {
+            q = 0;
+            for( var v = m.length; q < v; q++ )
+            {
+                var t = m[q];
+                if( t )
+                {
+                    t = t[g];
+                    for( var y = false; t; )
+                    {
+                        if( t.sizcache === l )
+                        {
+                            y = m[t.sizset];
+                            break
+                        }
+                        if( t.nodeType === 1 )
+                        {
+                            if( !p )
+                            {
+                                t.sizcache = l;
+                                t.sizset = q
+                            }
+                            if( typeof h !== "string" )
+                            {
+                                if( t === h )
+                                {
+                                    y = true;
+                                    break
+                                }
+                            } else if( k.filter( h, [t] ).length > 0 )
+                            {
+                                y = t;
+                                break
+                            }
+                        }
+                        t = t[g]
+                    }
+                    m[q] = y
+                }
+            }
+        }
+
+        var f = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+                e = 0,j = Object.prototype.toString,i = false,o = true;
+        [0,0].sort( function()
+        {
+            o = false;
+            return 0
+        } );
+        var k = function( g, h, l, m )
+        {
+            l = l || [];
+            var q = h = h || s;
+            if( h.nodeType !== 1 && h.nodeType !== 9 )return[];
+            if( !g || typeof g !== "string" )return l;
+            for( var p = [],v,t,y,S,H = true,M = x( h ),I = g; (f.exec( "" ),v = f.exec( I )) !== null; )
+            {
+                I = v[3];
+                p.push( v[1] );
+                if( v[2] )
+                {
+                    S = v[3];
+                    break
+                }
+            }
+            if( p.length > 1 && r.exec( g ) )if( p.length === 2 && n.relative[p[0]] )t = ga( p[0] + p[1], h );
+            else for( t = n.relative[p[0]] ? [h] : k( p.shift(), h ); p.length; )
+                {
+                    g = p.shift();
+                    if( n.relative[g] )g += p.shift();
+                    t = ga( g, t )
+                }
+            else
+            {
+                if( !m && p.length > 1 && h.nodeType === 9 && !M && n.match.ID.test( p[0] ) && !n.match.ID.test( p[p.length - 1] ) )
+                {
+                    v = k.find( p.shift(), h, M );
+                    h = v.expr ? k.filter( v.expr, v.set )[0] : v.set[0]
+                }
+                if( h )
+                {
+                    v = m ? {expr:p.pop(),set:z( m )} : k.find( p.pop(), p.length === 1 && (p[0] === "~" || p[0] === "+") && h.parentNode ? h.parentNode : h, M );
+                    t = v.expr ? k.filter( v.expr, v.set ) : v.set;
+                    if( p.length > 0 )y = z( t );
+                    else H = false;
+                    for( ; p.length; )
+                    {
+                        var D = p.pop();
+                        v = D;
+                        if( n.relative[D] )v = p.pop();
+                        else D = "";
+                        if( v == null )v = h;
+                        n.relative[D]( y, v, M )
+                    }
+                }
+                else y = []
+            }
+            y || (y = t);
+            y || k.error( D ||
+                    g );
+            if( j.call( y ) === "[object Array]" )if( H )if( h && h.nodeType === 1 )for( g = 0; y[g] != null; g++ )
+            {
+                if( y[g] && (y[g] === true || y[g].nodeType === 1 && E( h, y[g] )) )l.push( t[g] )
+            }
+            else for( g = 0; y[g] != null; g++ )y[g] && y[g].nodeType === 1 && l.push( t[g] );
+            else l.push.apply( l, y );
+            else z( y, l );
+            if( S )
+            {
+                k( S, q, l, m );
+                k.uniqueSort( l )
+            }
+            return l
+        };
+        k.uniqueSort = function( g )
+        {
+            if( B )
+            {
+                i = o;
+                g.sort( B );
+                if( i )for( var h = 1; h < g.length; h++ )g[h] === g[h - 1] && g.splice( h--, 1 )
+            }
+            return g
+        };
+        k.matches = function( g, h )
+        {
+            return k( g, null, null, h )
+        };
+        k.find = function( g, h, l )
+        {
+            var m,q;
+            if( !g )return[];
+            for( var p = 0,v = n.order.length; p < v; p++ )
+            {
+                var t = n.order[p];
+                if( q = n.leftMatch[t].exec( g ) )
+                {
+                    var y = q[1];
+                    q.splice( 1, 1 );
+                    if( y.substr( y.length - 1 ) !== "\\" )
+                    {
+                        q[1] = (q[1] || "").replace( /\\/g, "" );
+                        m = n.find[t]( q, h, l );
+                        if( m != null )
+                        {
+                            g = g.replace( n.match[t], "" );
+                            break
+                        }
+                    }
+                }
+            }
+            m || (m = h.getElementsByTagName( "*" ));
+            return{set:m,expr:g}
+        };
+        k.filter = function( g, h, l, m )
+        {
+            for( var q = g,p = [],v = h,t,y,S = h && h[0] && x( h[0] ); g && h.length; )
+            {
+                for( var H in n.filter )if( (t = n.leftMatch[H].exec( g )) != null && t[2] )
+                {
+                    var M = n.filter[H],I,D;
+                    D = t[1];
+                    y = false;
+                    t.splice( 1, 1 );
+                    if( D.substr( D.length -
+                            1 ) !== "\\" )
+                    {
+                        if( v === p )p = [];
+                        if( n.preFilter[H] )if( t = n.preFilter[H]( t, v, l, p, m, S ) )
+                        {
+                            if( t === true )continue
+                        }
+                        else y = I = true;
+                        if( t )for( var U = 0; (D = v[U]) != null; U++ )if( D )
+                        {
+                            I = M( D, t, U, v );
+                            var Ha = m ^ !!I;
+                            if( l && I != null )if( Ha )y = true;
+                            else v[U] = false; else if( Ha )
+                            {
+                                p.push( D );
+                                y = true
+                            }
+                        }
+                        if( I !== w )
+                        {
+                            l || (v = p);
+                            g = g.replace( n.match[H], "" );
+                            if( !y )return[];
+                            break
+                        }
+                    }
+                }
+                if( g === q )if( y == null )k.error( g );
+                else break;
+                q = g
+            }
+            return v
+        };
+        k.error = function( g )
+        {
+            throw"Syntax error, unrecognized expression: " + g;
+        };
+        var n = k.selectors = {order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+            CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function( g )
+        {
+            return g.getAttribute( "href" )
+        }},
+            relative:{"+":function( g, h )
+            {
+                var l = typeof h === "string",m = l && !/\W/.test( h );
+                l = l && !m;
+                if( m )h = h.toLowerCase();
+                m = 0;
+                for( var q = g.length,p; m < q; m++ )if( p = g[m] )
+                {
+                    for( ; (p = p.previousSibling) && p.nodeType !== 1; );
+                    g[m] = l || p && p.nodeName.toLowerCase() === h ? p || false : p === h
+                }
+                l && k.filter( h, g, true )
+            },">":function( g, h )
+            {
+                var l = typeof h === "string";
+                if( l && !/\W/.test( h ) )
+                {
+                    h = h.toLowerCase();
+                    for( var m = 0,q = g.length; m < q; m++ )
+                    {
+                        var p = g[m];
+                        if( p )
+                        {
+                            l = p.parentNode;
+                            g[m] = l.nodeName.toLowerCase() === h ? l : false
+                        }
+                    }
+                }
+                else
+                {
+                    m = 0;
+                    for( q = g.length; m < q; m++ )if( p = g[m] )g[m] =
+                            l ? p.parentNode : p.parentNode === h;
+                    l && k.filter( h, g, true )
+                }
+            },"":function( g, h, l )
+            {
+                var m = e++,q = d;
+                if( typeof h === "string" && !/\W/.test( h ) )
+                {
+                    var p = h = h.toLowerCase();
+                    q = b
+                }
+                q( "parentNode", h, m, g, p, l )
+            },"~":function( g, h, l )
+            {
+                var m = e++,q = d;
+                if( typeof h === "string" && !/\W/.test( h ) )
+                {
+                    var p = h = h.toLowerCase();
+                    q = b
+                }
+                q( "previousSibling", h, m, g, p, l )
+            }},find:{ID:function( g, h, l )
+            {
+                if( typeof h.getElementById !== "undefined" && !l )return(g = h.getElementById( g[1] )) ? [g] : []
+            },NAME:function( g, h )
+            {
+                if( typeof h.getElementsByName !== "undefined" )
+                {
+                    var l = [];
+                    h = h.getElementsByName( g[1] );
+                    for( var m = 0,q = h.length; m < q; m++ )h[m].getAttribute( "name" ) === g[1] && l.push( h[m] );
+                    return l.length === 0 ? null : l
+                }
+            },TAG:function( g, h )
+            {
+                return h.getElementsByTagName( g[1] )
+            }},preFilter:{CLASS:function( g, h, l, m, q, p )
+            {
+                g = " " + g[1].replace( /\\/g, "" ) + " ";
+                if( p )return g;
+                p = 0;
+                for( var v; (v = h[p]) != null; p++ )if( v )if( q ^ (v.className && (" " + v.className + " ").replace( /[\t\n]/g, " " ).indexOf( g ) >= 0) )l || m.push( v ); else if( l )h[p] = false;
+                return false
+            },ID:function( g )
+            {
+                return g[1].replace( /\\/g, "" )
+            },TAG:function( g )
+            {
+                return g[1].toLowerCase()
+            },
+                CHILD:function( g )
+                {
+                    if( g[1] === "nth" )
+                    {
+                        var h = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( g[2] === "even" && "2n" || g[2] === "odd" && "2n+1" || !/\D/.test( g[2] ) && "0n+" + g[2] || g[2] );
+                        g[2] = h[1] + (h[2] || 1) - 0;
+                        g[3] = h[3] - 0
+                    }
+                    g[0] = e++;
+                    return g
+                },ATTR:function( g, h, l, m, q, p )
+                {
+                    h = g[1].replace( /\\/g, "" );
+                    if( !p && n.attrMap[h] )g[1] = n.attrMap[h];
+                    if( g[2] === "~=" )g[4] = " " + g[4] + " ";
+                    return g
+                },PSEUDO:function( g, h, l, m, q )
+                {
+                    if( g[1] === "not" )if( (f.exec( g[3] ) || "").length > 1 || /^\w/.test( g[3] ) )g[3] = k( g[3], null, null, h );
+                    else
+                    {
+                        g = k.filter( g[3], h, l, true ^ q );
+                        l || m.push.apply( m,
+                                g );
+                        return false
+                    } else if( n.match.POS.test( g[0] ) || n.match.CHILD.test( g[0] ) )return true;
+                    return g
+                },POS:function( g )
+                {
+                    g.unshift( true );
+                    return g
+                }},filters:{enabled:function( g )
+            {
+                return g.disabled === false && g.type !== "hidden"
+            },disabled:function( g )
+            {
+                return g.disabled === true
+            },checked:function( g )
+            {
+                return g.checked === true
+            },selected:function( g )
+            {
+                return g.selected === true
+            },parent:function( g )
+            {
+                return!!g.firstChild
+            },empty:function( g )
+            {
+                return!g.firstChild
+            },has:function( g, h, l )
+            {
+                return!!k( l[3], g ).length
+            },header:function( g )
+            {
+                return/h\d/i.test( g.nodeName )
+            },
+                text:function( g )
+                {
+                    return"text" === g.type
+                },radio:function( g )
+                {
+                    return"radio" === g.type
+                },checkbox:function( g )
+                {
+                    return"checkbox" === g.type
+                },file:function( g )
+                {
+                    return"file" === g.type
+                },password:function( g )
+                {
+                    return"password" === g.type
+                },submit:function( g )
+                {
+                    return"submit" === g.type
+                },image:function( g )
+                {
+                    return"image" === g.type
+                },reset:function( g )
+                {
+                    return"reset" === g.type
+                },button:function( g )
+                {
+                    return"button" === g.type || g.nodeName.toLowerCase() === "button"
+                },input:function( g )
+                {
+                    return/input|select|textarea|button/i.test( g.nodeName )
+                }},
+            setFilters:{first:function( g, h )
+            {
+                return h === 0
+            },last:function( g, h, l, m )
+            {
+                return h === m.length - 1
+            },even:function( g, h )
+            {
+                return h % 2 === 0
+            },odd:function( g, h )
+            {
+                return h % 2 === 1
+            },lt:function( g, h, l )
+            {
+                return h < l[3] - 0
+            },gt:function( g, h, l )
+            {
+                return h > l[3] - 0
+            },nth:function( g, h, l )
+            {
+                return l[3] - 0 === h
+            },eq:function( g, h, l )
+            {
+                return l[3] - 0 === h
+            }},filter:{PSEUDO:function( g, h, l, m )
+            {
+                var q = h[1],p = n.filters[q];
+                if( p )return p( g, l, h, m ); else if( q === "contains" )return(g.textContent || g.innerText || a( [g] ) || "").indexOf( h[3] ) >= 0; else if( q === "not" )
+                {
+                    h =
+                            h[3];
+                    l = 0;
+                    for( m = h.length; l < m; l++ )if( h[l] === g )return false;
+                    return true
+                }
+                else k.error( "Syntax error, unrecognized expression: " + q )
+            },CHILD:function( g, h )
+            {
+                var l = h[1],m = g;
+                switch( l )
+                {case "only":case "first":for( ; m = m.previousSibling; )if( m.nodeType === 1 )return false;if( l === "first" )return true;m = g;case "last":for( ; m = m.nextSibling; )if( m.nodeType === 1 )return false;return true;case "nth":l = h[2];var q = h[3];if( l === 1 && q === 0 )return true;h = h[0];var p = g.parentNode;if( p && (p.sizcache !== h || !g.nodeIndex) )
+                {
+                    var v = 0;
+                    for( m = p.firstChild; m; m =
+                            m.nextSibling )if( m.nodeType === 1 )m.nodeIndex = ++v;
+                    p.sizcache = h
+                }g = g.nodeIndex - q;return l === 0 ? g === 0 : g % l === 0 && g / l >= 0
+                }
+            },ID:function( g, h )
+            {
+                return g.nodeType === 1 && g.getAttribute( "id" ) === h
+            },TAG:function( g, h )
+            {
+                return h === "*" && g.nodeType === 1 || g.nodeName.toLowerCase() === h
+            },CLASS:function( g, h )
+            {
+                return(" " + (g.className || g.getAttribute( "class" )) + " ").indexOf( h ) > -1
+            },ATTR:function( g, h )
+            {
+                var l = h[1];
+                g = n.attrHandle[l] ? n.attrHandle[l]( g ) : g[l] != null ? g[l] : g.getAttribute( l );
+                l = g + "";
+                var m = h[2];
+                h = h[4];
+                return g == null ? m === "!=" : m ===
+                        "=" ? l === h : m === "*=" ? l.indexOf( h ) >= 0 : m === "~=" ? (" " + l + " ").indexOf( h ) >= 0 : !h ? l && g !== false : m === "!=" ? l !== h : m === "^=" ? l.indexOf( h ) === 0 : m === "$=" ? l.substr( l.length - h.length ) === h : m === "|=" ? l === h || l.substr( 0, h.length + 1 ) === h + "-" : false
+            },POS:function( g, h, l, m )
+            {
+                var q = n.setFilters[h[2]];
+                if( q )return q( g, l, h, m )
+            }}},r = n.match.POS;
+        for( var u in n.match )
+        {
+            n.match[u] = new RegExp( n.match[u].source + /(?![^\[]*\])(?![^\(]*\))/.source );
+            n.leftMatch[u] = new RegExp( /(^(?:.|\r|\n)*?)/.source + n.match[u].source.replace( /\\(\d+)/g, function( g, h )
+            {
+                return"\\" + (h - 0 + 1)
+            } ) )
+        }
+        var z = function( g, h )
+        {
+            g = Array.prototype.slice.call( g, 0 );
+            if( h )
+            {
+                h.push.apply( h, g );
+                return h
+            }
+            return g
+        };
+        try
+        {
+            Array.prototype.slice.call( s.documentElement.childNodes, 0 )
+        }
+        catch( C )
+        {
+            z = function( g, h )
+            {
+                h = h || [];
+                if( j.call( g ) === "[object Array]" )Array.prototype.push.apply( h, g ); else if( typeof g.length === "number" )for( var l = 0,m = g.length; l < m; l++ )h.push( g[l] );
+                else for( l = 0; g[l]; l++ )h.push( g[l] );
+                return h
+            }
+        }
+        var B;
+        if( s.documentElement.compareDocumentPosition )B = function( g, h )
+        {
+            if( !g.compareDocumentPosition ||
+                    !h.compareDocumentPosition )
+            {
+                if( g == h )i = true;
+                return g.compareDocumentPosition ? -1 : 1
+            }
+            g = g.compareDocumentPosition( h ) & 4 ? -1 : g === h ? 0 : 1;
+            if( g === 0 )i = true;
+            return g
+        }; else if( "sourceIndex"in s.documentElement )B = function( g, h )
+        {
+            if( !g.sourceIndex || !h.sourceIndex )
+            {
+                if( g == h )i = true;
+                return g.sourceIndex ? -1 : 1
+            }
+            g = g.sourceIndex - h.sourceIndex;
+            if( g === 0 )i = true;
+            return g
+        }; else if( s.createRange )B = function( g, h )
+        {
+            if( !g.ownerDocument || !h.ownerDocument )
+            {
+                if( g == h )i = true;
+                return g.ownerDocument ? -1 : 1
+            }
+            var l = g.ownerDocument.createRange(),m =
+                    h.ownerDocument.createRange();
+            l.setStart( g, 0 );
+            l.setEnd( g, 0 );
+            m.setStart( h, 0 );
+            m.setEnd( h, 0 );
+            g = l.compareBoundaryPoints( Range.START_TO_END, m );
+            if( g === 0 )i = true;
+            return g
+        };
+        (function()
+        {
+            var g = s.createElement( "div" ),h = "script" + (new Date).getTime();
+            g.innerHTML = "<a name='" + h + "'/>";
+            var l = s.documentElement;
+            l.insertBefore( g, l.firstChild );
+            if( s.getElementById( h ) )
+            {
+                n.find.ID = function( m, q, p )
+                {
+                    if( typeof q.getElementById !== "undefined" && !p )return(q = q.getElementById( m[1] )) ? q.id === m[1] || typeof q.getAttributeNode !== "undefined" &&
+                            q.getAttributeNode( "id" ).nodeValue === m[1] ? [q] : w : []
+                };
+                n.filter.ID = function( m, q )
+                {
+                    var p = typeof m.getAttributeNode !== "undefined" && m.getAttributeNode( "id" );
+                    return m.nodeType === 1 && p && p.nodeValue === q
+                }
+            }
+            l.removeChild( g );
+            l = g = null
+        })();
+        (function()
+        {
+            var g = s.createElement( "div" );
+            g.appendChild( s.createComment( "" ) );
+            if( g.getElementsByTagName( "*" ).length > 0 )n.find.TAG = function( h, l )
+            {
+                l = l.getElementsByTagName( h[1] );
+                if( h[1] === "*" )
+                {
+                    h = [];
+                    for( var m = 0; l[m]; m++ )l[m].nodeType === 1 && h.push( l[m] );
+                    l = h
+                }
+                return l
+            };
+            g.innerHTML = "<a href='#'></a>";
+            if( g.firstChild && typeof g.firstChild.getAttribute !== "undefined" && g.firstChild.getAttribute( "href" ) !== "#" )n.attrHandle.href = function( h )
+            {
+                return h.getAttribute( "href", 2 )
+            };
+            g = null
+        })();
+        s.querySelectorAll && function()
+        {
+            var g = k,h = s.createElement( "div" );
+            h.innerHTML = "<p class='TEST'></p>";
+            if( !(h.querySelectorAll && h.querySelectorAll( ".TEST" ).length === 0) )
+            {
+                k = function( m, q, p, v )
+                {
+                    q = q || s;
+                    if( !v && q.nodeType === 9 && !x( q ) )try
+                    {
+                        return z( q.querySelectorAll( m ), p )
+                    }
+                    catch( t )
+                    {
+                    }
+                    return g( m, q, p, v )
+                };
+                for( var l in g )k[l] = g[l];
+                h = null
+            }
+        }();
+        (function()
+        {
+            var g = s.createElement( "div" );
+            g.innerHTML = "<div class='test e'></div><div class='test'></div>";
+            if( !(!g.getElementsByClassName || g.getElementsByClassName( "e" ).length === 0) )
+            {
+                g.lastChild.className = "e";
+                if( g.getElementsByClassName( "e" ).length !== 1 )
+                {
+                    n.order.splice( 1, 0, "CLASS" );
+                    n.find.CLASS = function( h, l, m )
+                    {
+                        if( typeof l.getElementsByClassName !== "undefined" && !m )return l.getElementsByClassName( h[1] )
+                    };
+                    g = null
+                }
+            }
+        })();
+        var E = s.compareDocumentPosition ? function( g, h )
+        {
+            return!!(g.compareDocumentPosition( h ) & 16)
+        } :
+                function( g, h )
+                {
+                    return g !== h && (g.contains ? g.contains( h ) : true)
+                },x = function( g )
+        {
+            return(g = (g ? g.ownerDocument || g : 0).documentElement) ? g.nodeName !== "HTML" : false
+        },ga = function( g, h )
+        {
+            var l = [],m = "",q;
+            for( h = h.nodeType ? [h] : h; q = n.match.PSEUDO.exec( g ); )
+            {
+                m += q[0];
+                g = g.replace( n.match.PSEUDO, "" )
+            }
+            g = n.relative[g] ? g + "*" : g;
+            q = 0;
+            for( var p = h.length; q < p; q++ )k( g, h[q], l );
+            return k.filter( m, l )
+        };
+        c.find = k;
+        c.expr = k.selectors;
+        c.expr[":"] = c.expr.filters;
+        c.unique = k.uniqueSort;
+        c.text = a;
+        c.isXMLDoc = x;
+        c.contains = E
+    })();
+    var eb = /Until$/,fb = /^(?:parents|prevUntil|prevAll)/,
+            gb = /,/;
+    R = Array.prototype.slice;
+    var Ia = function( a, b, d )
+    {
+        if( c.isFunction( b ) )return c.grep( a, function( e, j )
+        {
+            return!!b.call( e, j, e ) === d
+        } ); else if( b.nodeType )return c.grep( a, function( e )
+        {
+            return e === b === d
+        } ); else if( typeof b === "string" )
+        {
+            var f = c.grep( a, function( e )
+            {
+                return e.nodeType === 1
+            } );
+            if( Ua.test( b ) )return c.filter( b, f, !d );
+            else b = c.filter( b, f )
+        }
+        return c.grep( a, function( e )
+        {
+            return c.inArray( e, b ) >= 0 === d
+        } )
+    };
+    c.fn.extend( {find:function( a )
+    {
+        for( var b = this.pushStack( "", "find", a ),d = 0,f = 0,e = this.length; f < e; f++ )
+        {
+            d = b.length;
+            c.find( a, this[f], b );
+            if( f > 0 )for( var j = d; j < b.length; j++ )for( var i = 0; i < d; i++ )if( b[i] === b[j] )
+            {
+                b.splice( j--, 1 );
+                break
+            }
+        }
+        return b
+    },has:function( a )
+    {
+        var b = c( a );
+        return this.filter( function()
+        {
+            for( var d = 0,f = b.length; d < f; d++ )if( c.contains( this, b[d] ) )return true
+        } )
+    },not:function( a )
+    {
+        return this.pushStack( Ia( this, a, false ), "not", a )
+    },filter:function( a )
+    {
+        return this.pushStack( Ia( this, a, true ), "filter", a )
+    },is:function( a )
+    {
+        return!!a && c.filter( a, this ).length > 0
+    },closest:function( a, b )
+    {
+        if( c.isArray( a ) )
+        {
+            var d = [],f = this[0],e,j =
+            {},i;
+            if( f && a.length )
+            {
+                e = 0;
+                for( var o = a.length; e < o; e++ )
+                {
+                    i = a[e];
+                    j[i] || (j[i] = c.expr.match.POS.test( i ) ? c( i, b || this.context ) : i)
+                }
+                for( ; f && f.ownerDocument && f !== b; )
+                {
+                    for( i in j )
+                    {
+                        e = j[i];
+                        if( e.jquery ? e.index( f ) > -1 : c( f ).is( e ) )
+                        {
+                            d.push( {selector:i,elem:f} );
+                            delete j[i]
+                        }
+                    }
+                    f = f.parentNode
+                }
+            }
+            return d
+        }
+        var k = c.expr.match.POS.test( a ) ? c( a, b || this.context ) : null;
+        return this.map( function( n, r )
+        {
+            for( ; r && r.ownerDocument && r !== b; )
+            {
+                if( k ? k.index( r ) > -1 : c( r ).is( a ) )return r;
+                r = r.parentNode
+            }
+            return null
+        } )
+    },index:function( a )
+    {
+        if( !a || typeof a ===
+                "string" )return c.inArray( this[0], a ? c( a ) : this.parent().children() );
+        return c.inArray( a.jquery ? a[0] : a, this )
+    },add:function( a, b )
+    {
+        a = typeof a === "string" ? c( a, b || this.context ) : c.makeArray( a );
+        b = c.merge( this.get(), a );
+        return this.pushStack( qa( a[0] ) || qa( b[0] ) ? b : c.unique( b ) )
+    },andSelf:function()
+    {
+        return this.add( this.prevObject )
+    }} );
+    c.each( {parent:function( a )
+    {
+        return(a = a.parentNode) && a.nodeType !== 11 ? a : null
+    },parents:function( a )
+    {
+        return c.dir( a, "parentNode" )
+    },parentsUntil:function( a, b, d )
+    {
+        return c.dir( a, "parentNode",
+                d )
+    },next:function( a )
+    {
+        return c.nth( a, 2, "nextSibling" )
+    },prev:function( a )
+    {
+        return c.nth( a, 2, "previousSibling" )
+    },nextAll:function( a )
+    {
+        return c.dir( a, "nextSibling" )
+    },prevAll:function( a )
+    {
+        return c.dir( a, "previousSibling" )
+    },nextUntil:function( a, b, d )
+    {
+        return c.dir( a, "nextSibling", d )
+    },prevUntil:function( a, b, d )
+    {
+        return c.dir( a, "previousSibling", d )
+    },siblings:function( a )
+    {
+        return c.sibling( a.parentNode.firstChild, a )
+    },children:function( a )
+    {
+        return c.sibling( a.firstChild )
+    },contents:function( a )
+    {
+        return c.nodeName( a, "iframe" ) ?
+                a.contentDocument || a.contentWindow.document : c.makeArray( a.childNodes )
+    }}, function( a, b )
+    {
+        c.fn[a] = function( d, f )
+        {
+            var e = c.map( this, b, d );
+            eb.test( a ) || (f = d);
+            if( f && typeof f === "string" )e = c.filter( f, e );
+            e = this.length > 1 ? c.unique( e ) : e;
+            if( (this.length > 1 || gb.test( f )) && fb.test( a ) )e = e.reverse();
+            return this.pushStack( e, a, R.call( arguments ).join( "," ) )
+        }
+    } );
+    c.extend( {filter:function( a, b, d )
+    {
+        if( d )a = ":not(" + a + ")";
+        return c.find.matches( a, b )
+    },dir:function( a, b, d )
+    {
+        var f = [];
+        for( a = a[b]; a && a.nodeType !== 9 && (d === w || a.nodeType !== 1 || !c( a ).is( d )); )
+        {
+            a.nodeType ===
+                    1 && f.push( a );
+            a = a[b]
+        }
+        return f
+    },nth:function( a, b, d )
+    {
+        b = b || 1;
+        for( var f = 0; a; a = a[d] )if( a.nodeType === 1 && ++f === b )break;
+        return a
+    },sibling:function( a, b )
+    {
+        for( var d = []; a; a = a.nextSibling )a.nodeType === 1 && a !== b && d.push( a );
+        return d
+    }} );
+    var Ja = / jQuery\d+="(?:\d+|null)"/g,V = /^\s+/,Ka = /(<([\w:]+)[^>]*?)\/>/g,hb = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La = /<([\w:]+)/,ib = /<tbody/i,jb = /<|&#?\w+;/,ta = /<script|<object|<embed|<option|<style/i,ua = /checked\s*(?:[^=]|=\s*.checked.)/i,Ma = function( a, b, d )
+    {
+        return hb.test( d ) ?
+                a : b + "></" + d + ">"
+    },F = {option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};
+    F.optgroup = F.option;
+    F.tbody = F.tfoot = F.colgroup = F.caption = F.thead;
+    F.th = F.td;
+    if( !c.support.htmlSerialize )F._default = [1,"div<div>","</div>"];
+    c.fn.extend( {text:function( a )
+    {
+        if( c.isFunction( a ) )return this.each( function( b )
+        {
+            var d =
+                    c( this );
+            d.text( a.call( this, b, d.text() ) )
+        } );
+        if( typeof a !== "object" && a !== w )return this.empty().append( (this[0] && this[0].ownerDocument || s).createTextNode( a ) );
+        return c.text( this )
+    },wrapAll:function( a )
+    {
+        if( c.isFunction( a ) )return this.each( function( d )
+        {
+            c( this ).wrapAll( a.call( this, d ) )
+        } );
+        if( this[0] )
+        {
+            var b = c( a, this[0].ownerDocument ).eq( 0 ).clone( true );
+            this[0].parentNode && b.insertBefore( this[0] );
+            b.map(
+                    function()
+                    {
+                        for( var d = this; d.firstChild && d.firstChild.nodeType === 1; )d = d.firstChild;
+                        return d
+                    } ).append( this )
+        }
+        return this
+    },
+        wrapInner:function( a )
+        {
+            if( c.isFunction( a ) )return this.each( function( b )
+            {
+                c( this ).wrapInner( a.call( this, b ) )
+            } );
+            return this.each( function()
+            {
+                var b = c( this ),d = b.contents();
+                d.length ? d.wrapAll( a ) : b.append( a )
+            } )
+        },wrap:function( a )
+        {
+            return this.each( function()
+            {
+                c( this ).wrapAll( a )
+            } )
+        },unwrap:function()
+        {
+            return this.parent().each(
+                    function()
+                    {
+                        c.nodeName( this, "body" ) || c( this ).replaceWith( this.childNodes )
+                    } ).end()
+        },append:function()
+        {
+            return this.domManip( arguments, true, function( a )
+            {
+                this.nodeType === 1 && this.appendChild( a )
+            } )
+        },
+        prepend:function()
+        {
+            return this.domManip( arguments, true, function( a )
+            {
+                this.nodeType === 1 && this.insertBefore( a, this.firstChild )
+            } )
+        },before:function()
+        {
+            if( this[0] && this[0].parentNode )return this.domManip( arguments, false, function( b )
+            {
+                this.parentNode.insertBefore( b, this )
+            } ); else if( arguments.length )
+            {
+                var a = c( arguments[0] );
+                a.push.apply( a, this.toArray() );
+                return this.pushStack( a, "before", arguments )
+            }
+        },after:function()
+        {
+            if( this[0] && this[0].parentNode )return this.domManip( arguments, false, function( b )
+            {
+                this.parentNode.insertBefore( b,
+                        this.nextSibling )
+            } ); else if( arguments.length )
+            {
+                var a = this.pushStack( this, "after", arguments );
+                a.push.apply( a, c( arguments[0] ).toArray() );
+                return a
+            }
+        },remove:function( a, b )
+        {
+            for( var d = 0,f; (f = this[d]) != null; d++ )if( !a || c.filter( a, [f] ).length )
+            {
+                if( !b && f.nodeType === 1 )
+                {
+                    c.cleanData( f.getElementsByTagName( "*" ) );
+                    c.cleanData( [f] )
+                }
+                f.parentNode && f.parentNode.removeChild( f )
+            }
+            return this
+        },empty:function()
+        {
+            for( var a = 0,b; (b = this[a]) != null; a++ )for( b.nodeType === 1 && c.cleanData( b.getElementsByTagName( "*" ) ); b.firstChild; )b.removeChild( b.firstChild );
+            return this
+        },clone:function( a )
+        {
+            var b = this.map( function()
+            {
+                if( !c.support.noCloneEvent && !c.isXMLDoc( this ) )
+                {
+                    var d = this.outerHTML,f = this.ownerDocument;
+                    if( !d )
+                    {
+                        d = f.createElement( "div" );
+                        d.appendChild( this.cloneNode( true ) );
+                        d = d.innerHTML
+                    }
+                    return c.clean( [d.replace( Ja, "" ).replace( /=([^="'>\s]+\/)>/g, '="$1">' ).replace( V, "" )], f )[0]
+                }
+                else return this.cloneNode( true )
+            } );
+            if( a === true )
+            {
+                ra( this, b );
+                ra( this.find( "*" ), b.find( "*" ) )
+            }
+            return b
+        },html:function( a )
+        {
+            if( a === w )return this[0] && this[0].nodeType === 1 ? this[0].innerHTML.replace( Ja,
+                    "" ) : null; else if( typeof a === "string" && !ta.test( a ) && (c.support.leadingWhitespace || !V.test( a )) && !F[(La.exec( a ) || ["",""])[1].toLowerCase()] )
+            {
+                a = a.replace( Ka, Ma );
+                try
+                {
+                    for( var b = 0,d = this.length; b < d; b++ )if( this[b].nodeType === 1 )
+                    {
+                        c.cleanData( this[b].getElementsByTagName( "*" ) );
+                        this[b].innerHTML = a
+                    }
+                }
+                catch( f )
+                {
+                    this.empty().append( a )
+                }
+            }
+            else c.isFunction( a ) ? this.each( function( e )
+                {
+                    var j = c( this ),i = j.html();
+                    j.empty().append( function()
+                    {
+                        return a.call( this, e, i )
+                    } )
+                } ) : this.empty().append( a );
+            return this
+        },replaceWith:function( a )
+        {
+            if( this[0] &&
+                    this[0].parentNode )
+            {
+                if( c.isFunction( a ) )return this.each( function( b )
+                {
+                    var d = c( this ),f = d.html();
+                    d.replaceWith( a.call( this, b, f ) )
+                } );
+                if( typeof a !== "string" )a = c( a ).detach();
+                return this.each( function()
+                {
+                    var b = this.nextSibling,d = this.parentNode;
+                    c( this ).remove();
+                    b ? c( b ).before( a ) : c( d ).append( a )
+                } )
+            }
+            else return this.pushStack( c( c.isFunction( a ) ? a() : a ), "replaceWith", a )
+        },detach:function( a )
+        {
+            return this.remove( a, true )
+        },domManip:function( a, b, d )
+        {
+            function f( u )
+            {
+                return c.nodeName( u, "table" ) ? u.getElementsByTagName( "tbody" )[0] ||
+                        u.appendChild( u.ownerDocument.createElement( "tbody" ) ) : u
+            }
+
+            var e,j,i = a[0],o = [],k;
+            if( !c.support.checkClone && arguments.length === 3 && typeof i === "string" && ua.test( i ) )return this.each( function()
+            {
+                c( this ).domManip( a, b, d, true )
+            } );
+            if( c.isFunction( i ) )return this.each( function( u )
+            {
+                var z = c( this );
+                a[0] = i.call( this, u, b ? z.html() : w );
+                z.domManip( a, b, d )
+            } );
+            if( this[0] )
+            {
+                e = i && i.parentNode;
+                e = c.support.parentNode && e && e.nodeType === 11 && e.childNodes.length === this.length ? {fragment:e} : sa( a, this, o );
+                k = e.fragment;
+                if( j = k.childNodes.length ===
+                        1 ? (k = k.firstChild) : k.firstChild )
+                {
+                    b = b && c.nodeName( j, "tr" );
+                    for( var n = 0,r = this.length; n < r; n++ )d.call( b ? f( this[n], j ) : this[n], n > 0 || e.cacheable || this.length > 1 ? k.cloneNode( true ) : k )
+                }
+                o.length && c.each( o, Qa )
+            }
+            return this
+        }} );
+    c.fragments = {};
+    c.each( {appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"}, function( a, b )
+    {
+        c.fn[a] = function( d )
+        {
+            var f = [];
+            d = c( d );
+            var e = this.length === 1 && this[0].parentNode;
+            if( e && e.nodeType === 11 && e.childNodes.length === 1 && d.length === 1 )
+            {
+                d[b]( this[0] );
+                return this
+            }
+            else
+            {
+                e = 0;
+                for( var j = d.length; e < j; e++ )
+                {
+                    var i = (e > 0 ? this.clone( true ) : this).get();
+                    c.fn[b].apply( c( d[e] ), i );
+                    f = f.concat( i )
+                }
+                return this.pushStack( f, a, d.selector )
+            }
+        }
+    } );
+    c.extend( {clean:function( a, b, d, f )
+    {
+        b = b || s;
+        if( typeof b.createElement === "undefined" )b = b.ownerDocument || b[0] && b[0].ownerDocument || s;
+        for( var e = [],j = 0,i; (i = a[j]) != null; j++ )
+        {
+            if( typeof i === "number" )i += "";
+            if( i )
+            {
+                if( typeof i === "string" && !jb.test( i ) )i = b.createTextNode( i ); else if( typeof i === "string" )
+                {
+                    i = i.replace( Ka, Ma );
+                    var o = (La.exec( i ) || ["",
+                        ""])[1].toLowerCase(),k = F[o] || F._default,n = k[0],r = b.createElement( "div" );
+                    for( r.innerHTML = k[1] + i + k[2]; n--; )r = r.lastChild;
+                    if( !c.support.tbody )
+                    {
+                        n = ib.test( i );
+                        o = o === "table" && !n ? r.firstChild && r.firstChild.childNodes : k[1] === "<table>" && !n ? r.childNodes : [];
+                        for( k = o.length - 1; k >= 0; --k )c.nodeName( o[k], "tbody" ) && !o[k].childNodes.length && o[k].parentNode.removeChild( o[k] )
+                    }
+                    !c.support.leadingWhitespace && V.test( i ) && r.insertBefore( b.createTextNode( V.exec( i )[0] ), r.firstChild );
+                    i = r.childNodes
+                }
+                if( i.nodeType )e.push( i );
+                else e =
+                        c.merge( e, i )
+            }
+        }
+        if( d )for( j = 0; e[j]; j++ )if( f && c.nodeName( e[j], "script" ) && (!e[j].type || e[j].type.toLowerCase() === "text/javascript") )f.push( e[j].parentNode ? e[j].parentNode.removeChild( e[j] ) : e[j] );
+        else
+        {
+            e[j].nodeType === 1 && e.splice.apply( e, [j + 1,0].concat( c.makeArray( e[j].getElementsByTagName( "script" ) ) ) );
+            d.appendChild( e[j] )
+        }
+        return e
+    },cleanData:function( a )
+    {
+        for( var b,d,f = c.cache,e = c.event.special,j = c.support.deleteExpando,i = 0,o; (o = a[i]) != null; i++ )if( d = o[c.expando] )
+        {
+            b = f[d];
+            if( b.events )for( var k in b.events )e[k] ?
+                    c.event.remove( o, k ) : Ca( o, k, b.handle );
+            if( j )delete o[c.expando];
+            else o.removeAttribute && o.removeAttribute( c.expando );
+            delete f[d]
+        }
+    }} );
+    var kb = /z-?index|font-?weight|opacity|zoom|line-?height/i,Na = /alpha\([^)]*\)/,Oa = /opacity=([^)]*)/,ha = /float/i,ia = /-([a-z])/ig,lb = /([A-Z])/g,mb = /^-?\d+(?:px)?$/i,nb = /^-?\d/,ob = {position:"absolute",visibility:"hidden",display:"block"},pb = ["Left","Right"],qb = ["Top","Bottom"],rb = s.defaultView && s.defaultView.getComputedStyle,Pa = c.support.cssFloat ? "cssFloat" : "styleFloat",ja =
+            function( a, b )
+            {
+                return b.toUpperCase()
+            };
+    c.fn.css = function( a, b )
+    {
+        return X( this, a, b, true, function( d, f, e )
+        {
+            if( e === w )return c.curCSS( d, f );
+            if( typeof e === "number" && !kb.test( f ) )e += "px";
+            c.style( d, f, e )
+        } )
+    };
+    c.extend( {style:function( a, b, d )
+    {
+        if( !a || a.nodeType === 3 || a.nodeType === 8 )return w;
+        if( (b === "width" || b === "height") && parseFloat( d ) < 0 )d = w;
+        var f = a.style || a,e = d !== w;
+        if( !c.support.opacity && b === "opacity" )
+        {
+            if( e )
+            {
+                f.zoom = 1;
+                b = parseInt( d, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + d * 100 + ")";
+                a = f.filter || c.curCSS( a, "filter" ) || "";
+                f.filter =
+                        Na.test( a ) ? a.replace( Na, b ) : b
+            }
+            return f.filter && f.filter.indexOf( "opacity=" ) >= 0 ? parseFloat( Oa.exec( f.filter )[1] ) / 100 + "" : ""
+        }
+        if( ha.test( b ) )b = Pa;
+        b = b.replace( ia, ja );
+        if( e )f[b] = d;
+        return f[b]
+    },css:function( a, b, d, f )
+    {
+        if( b === "width" || b === "height" )
+        {
+            var e,j = b === "width" ? pb : qb;
+
+            function i()
+            {
+                e = b === "width" ? a.offsetWidth : a.offsetHeight;
+                f !== "border" && c.each( j, function()
+                {
+                    f || (e -= parseFloat( c.curCSS( a, "padding" + this, true ) ) || 0);
+                    if( f === "margin" )e += parseFloat( c.curCSS( a, "margin" + this, true ) ) || 0;
+                    else e -= parseFloat( c.curCSS( a,
+                            "border" + this + "Width", true ) ) || 0
+                } )
+            }
+
+            a.offsetWidth !== 0 ? i() : c.swap( a, ob, i );
+            return Math.max( 0, Math.round( e ) )
+        }
+        return c.curCSS( a, b, d )
+    },curCSS:function( a, b, d )
+    {
+        var f,e = a.style;
+        if( !c.support.opacity && b === "opacity" && a.currentStyle )
+        {
+            f = Oa.test( a.currentStyle.filter || "" ) ? parseFloat( RegExp.$1 ) / 100 + "" : "";
+            return f === "" ? "1" : f
+        }
+        if( ha.test( b ) )b = Pa;
+        if( !d && e && e[b] )f = e[b]; else if( rb )
+        {
+            if( ha.test( b ) )b = "float";
+            b = b.replace( lb, "-$1" ).toLowerCase();
+            e = a.ownerDocument.defaultView;
+            if( !e )return null;
+            if( a = e.getComputedStyle( a, null ) )f =
+                    a.getPropertyValue( b );
+            if( b === "opacity" && f === "" )f = "1"
+        } else if( a.currentStyle )
+        {
+            d = b.replace( ia, ja );
+            f = a.currentStyle[b] || a.currentStyle[d];
+            if( !mb.test( f ) && nb.test( f ) )
+            {
+                b = e.left;
+                var j = a.runtimeStyle.left;
+                a.runtimeStyle.left = a.currentStyle.left;
+                e.left = d === "fontSize" ? "1em" : f || 0;
+                f = e.pixelLeft + "px";
+                e.left = b;
+                a.runtimeStyle.left = j
+            }
+        }
+        return f
+    },swap:function( a, b, d )
+    {
+        var f = {};
+        for( var e in b )
+        {
+            f[e] = a.style[e];
+            a.style[e] = b[e]
+        }
+        d.call( a );
+        for( e in b )a.style[e] = f[e]
+    }} );
+    if( c.expr && c.expr.filters )
+    {
+        c.expr.filters.hidden = function( a )
+        {
+            var b =
+                    a.offsetWidth,d = a.offsetHeight,f = a.nodeName.toLowerCase() === "tr";
+            return b === 0 && d === 0 && !f ? true : b > 0 && d > 0 && !f ? false : c.curCSS( a, "display" ) === "none"
+        };
+        c.expr.filters.visible = function( a )
+        {
+            return!c.expr.filters.hidden( a )
+        }
+    }
+    var sb = J(),tb = /<script(.|\s)*?\/script>/gi,ub = /select|textarea/i,vb = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N = /=\?(&|$)/,ka = /\?/,wb = /(\?|&)_=.*?(&|$)/,xb = /^(\w+:)?\/\/([^\/?#]+)/,yb = /%20/g,zb = c.fn.load;
+    c.fn.extend( {load:function( a, b, d )
+    {
+        if( typeof a !==
+                "string" )return zb.call( this, a ); else if( !this.length )return this;
+        var f = a.indexOf( " " );
+        if( f >= 0 )
+        {
+            var e = a.slice( f, a.length );
+            a = a.slice( 0, f )
+        }
+        f = "GET";
+        if( b )if( c.isFunction( b ) )
+        {
+            d = b;
+            b = null
+        } else if( typeof b === "object" )
+        {
+            b = c.param( b, c.ajaxSettings.traditional );
+            f = "POST"
+        }
+        var j = this;
+        c.ajax( {url:a,type:f,dataType:"html",data:b,complete:function( i, o )
+        {
+            if( o === "success" || o === "notmodified" )j.html( e ? c( "<div />" ).append( i.responseText.replace( tb, "" ) ).find( e ) : i.responseText );
+            d && j.each( d, [i.responseText,o,i] )
+        }} );
+        return this
+    },
+        serialize:function()
+        {
+            return c.param( this.serializeArray() )
+        },serializeArray:function()
+        {
+            return this.map(
+                    function()
+                    {
+                        return this.elements ? c.makeArray( this.elements ) : this
+                    } ).filter(
+                    function()
+                    {
+                        return this.name && !this.disabled && (this.checked || ub.test( this.nodeName ) || vb.test( this.type ))
+                    } ).map(
+                    function( a, b )
+                    {
+                        a = c( this ).val();
+                        return a == null ? null : c.isArray( a ) ? c.map( a, function( d )
+                        {
+                            return{name:b.name,value:d}
+                        } ) : {name:b.name,value:a}
+                    } ).get()
+        }} );
+    c.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ),
+            function( a, b )
+            {
+                c.fn[b] = function( d )
+                {
+                    return this.bind( b, d )
+                }
+            } );
+    c.extend( {get:function( a, b, d, f )
+    {
+        if( c.isFunction( b ) )
+        {
+            f = f || d;
+            d = b;
+            b = null
+        }
+        return c.ajax( {type:"GET",url:a,data:b,success:d,dataType:f} )
+    },getScript:function( a, b )
+    {
+        return c.get( a, null, b, "script" )
+    },getJSON:function( a, b, d )
+    {
+        return c.get( a, b, d, "json" )
+    },post:function( a, b, d, f )
+    {
+        if( c.isFunction( b ) )
+        {
+            f = f || d;
+            d = b;
+            b = {}
+        }
+        return c.ajax( {type:"POST",url:a,data:b,success:d,dataType:f} )
+    },ajaxSetup:function( a )
+    {
+        c.extend( c.ajaxSettings, a )
+    },ajaxSettings:{url:location.href,
+        global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest && (A.location.protocol !== "file:" || !A.ActiveXObject) ? function()
+        {
+            return new A.XMLHttpRequest
+        } : function()
+        {
+            try
+            {
+                return new A.ActiveXObject( "Microsoft.XMLHTTP" )
+            }
+            catch( a )
+            {
+            }
+        },accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function( a )
+    {
+        function b()
+        {
+            e.success &&
+            e.success.call( k, o, i, x );
+            e.global && f( "ajaxSuccess", [x,e] )
+        }
+
+        function d()
+        {
+            e.complete && e.complete.call( k, x, i );
+            e.global && f( "ajaxComplete", [x,e] );
+            e.global && !--c.active && c.event.trigger( "ajaxStop" )
+        }
+
+        function f( q, p )
+        {
+            (e.context ? c( e.context ) : c.event).trigger( q, p )
+        }
+
+        var e = c.extend( true, {}, c.ajaxSettings, a ),j,i,o,k = a && a.context || e,n = e.type.toUpperCase();
+        if( e.data && e.processData && typeof e.data !== "string" )e.data = c.param( e.data, e.traditional );
+        if( e.dataType === "jsonp" )
+        {
+            if( n === "GET" )N.test( e.url ) || (e.url += (ka.test( e.url ) ?
+                    "&" : "?") + (e.jsonp || "callback") + "=?"); else if( !e.data || !N.test( e.data ) )e.data = (e.data ? e.data + "&" : "") + (e.jsonp || "callback") + "=?";
+            e.dataType = "json"
+        }
+        if( e.dataType === "json" && (e.data && N.test( e.data ) || N.test( e.url )) )
+        {
+            j = e.jsonpCallback || "jsonp" + sb++;
+            if( e.data )e.data = (e.data + "").replace( N, "=" + j + "$1" );
+            e.url = e.url.replace( N, "=" + j + "$1" );
+            e.dataType = "script";
+            A[j] = A[j] || function( q )
+            {
+                o = q;
+                b();
+                d();
+                A[j] = w;
+                try
+                {
+                    delete A[j]
+                }
+                catch( p )
+                {
+                }
+                z && z.removeChild( C )
+            }
+        }
+        if( e.dataType === "script" && e.cache === null )e.cache = false;
+        if( e.cache ===
+                false && n === "GET" )
+        {
+            var r = J(),u = e.url.replace( wb, "$1_=" + r + "$2" );
+            e.url = u + (u === e.url ? (ka.test( e.url ) ? "&" : "?") + "_=" + r : "")
+        }
+        if( e.data && n === "GET" )e.url += (ka.test( e.url ) ? "&" : "?") + e.data;
+        e.global && !c.active++ && c.event.trigger( "ajaxStart" );
+        r = (r = xb.exec( e.url )) && (r[1] && r[1] !== location.protocol || r[2] !== location.host);
+        if( e.dataType === "script" && n === "GET" && r )
+        {
+            var z = s.getElementsByTagName( "head" )[0] || s.documentElement,C = s.createElement( "script" );
+            C.src = e.url;
+            if( e.scriptCharset )C.charset = e.scriptCharset;
+            if( !j )
+            {
+                var B =
+                        false;
+                C.onload = C.onreadystatechange = function()
+                {
+                    if( !B && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") )
+                    {
+                        B = true;
+                        b();
+                        d();
+                        C.onload = C.onreadystatechange = null;
+                        z && C.parentNode && z.removeChild( C )
+                    }
+                }
+            }
+            z.insertBefore( C, z.firstChild );
+            return w
+        }
+        var E = false,x = e.xhr();
+        if( x )
+        {
+            e.username ? x.open( n, e.url, e.async, e.username, e.password ) : x.open( n, e.url, e.async );
+            try
+            {
+                if( e.data || a && a.contentType )x.setRequestHeader( "Content-Type", e.contentType );
+                if( e.ifModified )
+                {
+                    c.lastModified[e.url] && x.setRequestHeader( "If-Modified-Since",
+                            c.lastModified[e.url] );
+                    c.etag[e.url] && x.setRequestHeader( "If-None-Match", c.etag[e.url] )
+                }
+                r || x.setRequestHeader( "X-Requested-With", "XMLHttpRequest" );
+                x.setRequestHeader( "Accept", e.dataType && e.accepts[e.dataType] ? e.accepts[e.dataType] + ", */*" : e.accepts._default )
+            }
+            catch( ga )
+            {
+            }
+            if( e.beforeSend && e.beforeSend.call( k, x, e ) === false )
+            {
+                e.global && !--c.active && c.event.trigger( "ajaxStop" );
+                x.abort();
+                return false
+            }
+            e.global && f( "ajaxSend", [x,e] );
+            var g = x.onreadystatechange = function( q )
+            {
+                if( !x || x.readyState === 0 || q === "abort" )
+                {
+                    E ||
+                    d();
+                    E = true;
+                    if( x )x.onreadystatechange = c.noop
+                } else if( !E && x && (x.readyState === 4 || q === "timeout") )
+                {
+                    E = true;
+                    x.onreadystatechange = c.noop;
+                    i = q === "timeout" ? "timeout" : !c.httpSuccess( x ) ? "error" : e.ifModified && c.httpNotModified( x, e.url ) ? "notmodified" : "success";
+                    var p;
+                    if( i === "success" )try
+                    {
+                        o = c.httpData( x, e.dataType, e )
+                    }
+                    catch( v )
+                    {
+                        i = "parsererror";
+                        p = v
+                    }
+                    if( i === "success" || i === "notmodified" )j || b();
+                    else c.handleError( e, x, i, p );
+                    d();
+                    q === "timeout" && x.abort();
+                    if( e.async )x = null
+                }
+            };
+            try
+            {
+                var h = x.abort;
+                x.abort = function()
+                {
+                    x && h.call( x );
+                    g( "abort" )
+                }
+            }
+            catch( l )
+            {
+            }
+            e.async && e.timeout > 0 && setTimeout( function()
+            {
+                x && !E && g( "timeout" )
+            }, e.timeout );
+            try
+            {
+                x.send( n === "POST" || n === "PUT" || n === "DELETE" ? e.data : null )
+            }
+            catch( m )
+            {
+                c.handleError( e, x, null, m );
+                d()
+            }
+            e.async || g();
+            return x
+        }
+    },handleError:function( a, b, d, f )
+    {
+        if( a.error )a.error.call( a.context || a, b, d, f );
+        if( a.global )(a.context ? c( a.context ) : c.event).trigger( "ajaxError", [b,a,f] )
+    },active:0,httpSuccess:function( a )
+    {
+        try
+        {
+            return!a.status && location.protocol === "file:" || a.status >= 200 && a.status < 300 || a.status === 304 || a.status ===
+                    1223 || a.status === 0
+        }
+        catch( b )
+        {
+        }
+        return false
+    },httpNotModified:function( a, b )
+    {
+        var d = a.getResponseHeader( "Last-Modified" ),f = a.getResponseHeader( "Etag" );
+        if( d )c.lastModified[b] = d;
+        if( f )c.etag[b] = f;
+        return a.status === 304 || a.status === 0
+    },httpData:function( a, b, d )
+    {
+        var f = a.getResponseHeader( "content-type" ) || "",e = b === "xml" || !b && f.indexOf( "xml" ) >= 0;
+        a = e ? a.responseXML : a.responseText;
+        e && a.documentElement.nodeName === "parsererror" && c.error( "parsererror" );
+        if( d && d.dataFilter )a = d.dataFilter( a, b );
+        if( typeof a === "string" )if( b ===
+                "json" || !b && f.indexOf( "json" ) >= 0 )a = c.parseJSON( a ); else if( b === "script" || !b && f.indexOf( "javascript" ) >= 0 )c.globalEval( a );
+        return a
+    },param:function( a, b )
+    {
+        function d( i, o )
+        {
+            if( c.isArray( o ) )c.each( o, function( k, n )
+            {
+                b || /\[\]$/.test( i ) ? f( i, n ) : d( i + "[" + (typeof n === "object" || c.isArray( n ) ? k : "") + "]", n )
+            } );
+            else!b && o != null && typeof o === "object" ? c.each( o, function( k, n )
+            {
+                d( i + "[" + k + "]", n )
+            } ) : f( i, o )
+        }
+
+        function f( i, o )
+        {
+            o = c.isFunction( o ) ? o() : o;
+            e[e.length] = encodeURIComponent( i ) + "=" + encodeURIComponent( o )
+        }
+
+        var e = [];
+        if( b === w )b = c.ajaxSettings.traditional;
+        if( c.isArray( a ) || a.jquery )c.each( a, function()
+        {
+            f( this.name, this.value )
+        } );
+        else for( var j in a )d( j, a[j] );
+        return e.join( "&" ).replace( yb, "+" )
+    }} );
+    var la = {},Ab = /toggle|show|hide/,Bb = /^([+-]=)?([\d+-.]+)(.*)$/,W,va = [
+        ["height","marginTop","marginBottom","paddingTop","paddingBottom"],
+        ["width","marginLeft","marginRight","paddingLeft","paddingRight"],
+        ["opacity"]
+    ];
+    c.fn.extend( {show:function( a, b )
+    {
+        if( a || a === 0 )return this.animate( K( "show", 3 ), a, b );
+        else
+        {
+            a = 0;
+            for( b = this.length; a < b; a++ )
+            {
+                var d = c.data( this[a], "olddisplay" );
+                this[a].style.display = d || "";
+                if( c.css( this[a], "display" ) === "none" )
+                {
+                    d = this[a].nodeName;
+                    var f;
+                    if( la[d] )f = la[d];
+                    else
+                    {
+                        var e = c( "<" + d + " />" ).appendTo( "body" );
+                        f = e.css( "display" );
+                        if( f === "none" )f = "block";
+                        e.remove();
+                        la[d] = f
+                    }
+                    c.data( this[a], "olddisplay", f )
+                }
+            }
+            a = 0;
+            for( b = this.length; a < b; a++ )this[a].style.display = c.data( this[a], "olddisplay" ) || "";
+            return this
+        }
+    },hide:function( a, b )
+    {
+        if( a || a === 0 )return this.animate( K( "hide", 3 ), a, b );
+        else
+        {
+            a = 0;
+            for( b = this.length; a < b; a++ )
+            {
+                var d = c.data( this[a], "olddisplay" );
+                !d && d !== "none" && c.data( this[a],
+                        "olddisplay", c.css( this[a], "display" ) )
+            }
+            a = 0;
+            for( b = this.length; a < b; a++ )this[a].style.display = "none";
+            return this
+        }
+    },_toggle:c.fn.toggle,toggle:function( a, b )
+    {
+        var d = typeof a === "boolean";
+        if( c.isFunction( a ) && c.isFunction( b ) )this._toggle.apply( this, arguments );
+        else a == null || d ? this.each( function()
+        {
+            var f = d ? a : c( this ).is( ":hidden" );
+            c( this )[f ? "show" : "hide"]()
+        } ) : this.animate( K( "toggle", 3 ), a, b );
+        return this
+    },fadeTo:function( a, b, d )
+    {
+        return this.filter( ":hidden" ).css( "opacity", 0 ).show().end().animate( {opacity:b}, a, d )
+    },
+        animate:function( a, b, d, f )
+        {
+            var e = c.speed( b, d, f );
+            if( c.isEmptyObject( a ) )return this.each( e.complete );
+            return this[e.queue === false ? "each" : "queue"]( function()
+            {
+                var j = c.extend( {}, e ),i,o = this.nodeType === 1 && c( this ).is( ":hidden" ),k = this;
+                for( i in a )
+                {
+                    var n = i.replace( ia, ja );
+                    if( i !== n )
+                    {
+                        a[n] = a[i];
+                        delete a[i];
+                        i = n
+                    }
+                    if( a[i] === "hide" && o || a[i] === "show" && !o )return j.complete.call( this );
+                    if( (i === "height" || i === "width") && this.style )
+                    {
+                        j.display = c.css( this, "display" );
+                        j.overflow = this.style.overflow
+                    }
+                    if( c.isArray( a[i] ) )
+                    {
+                        (j.specialEasing =
+                                j.specialEasing || {})[i] = a[i][1];
+                        a[i] = a[i][0]
+                    }
+                }
+                if( j.overflow != null )this.style.overflow = "hidden";
+                j.curAnim = c.extend( {}, a );
+                c.each( a, function( r, u )
+                {
+                    var z = new c.fx( k, j, r );
+                    if( Ab.test( u ) )z[u === "toggle" ? o ? "show" : "hide" : u]( a );
+                    else
+                    {
+                        var C = Bb.exec( u ),B = z.cur( true ) || 0;
+                        if( C )
+                        {
+                            u = parseFloat( C[2] );
+                            var E = C[3] || "px";
+                            if( E !== "px" )
+                            {
+                                k.style[r] = (u || 1) + E;
+                                B = (u || 1) / z.cur( true ) * B;
+                                k.style[r] = B + E
+                            }
+                            if( C[1] )u = (C[1] === "-=" ? -1 : 1) * u + B;
+                            z.custom( B, u, E )
+                        }
+                        else z.custom( B, u, "" )
+                    }
+                } );
+                return true
+            } )
+        },stop:function( a, b )
+        {
+            var d = c.timers;
+            a && this.queue( [] );
+            this.each( function()
+            {
+                for( var f = d.length - 1; f >= 0; f-- )if( d[f].elem === this )
+                {
+                    b && d[f]( true );
+                    d.splice( f, 1 )
+                }
+            } );
+            b || this.dequeue();
+            return this
+        }} );
+    c.each( {slideDown:K( "show", 1 ),slideUp:K( "hide", 1 ),slideToggle:K( "toggle", 1 ),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}}, function( a, b )
+    {
+        c.fn[a] = function( d, f )
+        {
+            return this.animate( b, d, f )
+        }
+    } );
+    c.extend( {speed:function( a, b, d )
+    {
+        var f = a && typeof a === "object" ? a : {complete:d || !d && b || c.isFunction( a ) && a,duration:a,easing:d && b || b && !c.isFunction( b ) && b};
+        f.duration = c.fx.off ? 0 : typeof f.duration ===
+                "number" ? f.duration : c.fx.speeds[f.duration] || c.fx.speeds._default;
+        f.old = f.complete;
+        f.complete = function()
+        {
+            f.queue !== false && c( this ).dequeue();
+            c.isFunction( f.old ) && f.old.call( this )
+        };
+        return f
+    },easing:{linear:function( a, b, d, f )
+    {
+        return d + f * a
+    },swing:function( a, b, d, f )
+    {
+        return(-Math.cos( a * Math.PI ) / 2 + 0.5) * f + d
+    }},timers:[],fx:function( a, b, d )
+    {
+        this.options = b;
+        this.elem = a;
+        this.prop = d;
+        if( !b.orig )b.orig = {}
+    }} );
+    c.fx.prototype = {update:function()
+    {
+        this.options.step && this.options.step.call( this.elem, this.now, this );
+        (c.fx.step[this.prop] ||
+                c.fx.step._default)( this );
+        if( (this.prop === "height" || this.prop === "width") && this.elem.style )this.elem.style.display = "block"
+    },cur:function( a )
+    {
+        if( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )return this.elem[this.prop];
+        return(a = parseFloat( c.css( this.elem, this.prop, a ) )) && a > -10000 ? a : parseFloat( c.curCSS( this.elem, this.prop ) ) || 0
+    },custom:function( a, b, d )
+    {
+        function f( j )
+        {
+            return e.step( j )
+        }
+
+        this.startTime = J();
+        this.start = a;
+        this.end = b;
+        this.unit = d || this.unit || "px";
+        this.now = this.start;
+        this.pos = this.state = 0;
+        var e = this;
+        f.elem = this.elem;
+        if( f() && c.timers.push( f ) && !W )W = setInterval( c.fx.tick, 13 )
+    },show:function()
+    {
+        this.options.orig[this.prop] = c.style( this.elem, this.prop );
+        this.options.show = true;
+        this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+        c( this.elem ).show()
+    },hide:function()
+    {
+        this.options.orig[this.prop] = c.style( this.elem, this.prop );
+        this.options.hide = true;
+        this.custom( this.cur(), 0 )
+    },step:function( a )
+    {
+        var b = J(),d = true;
+        if( a || b >= this.options.duration + this.startTime )
+        {
+            this.now =
+                    this.end;
+            this.pos = this.state = 1;
+            this.update();
+            this.options.curAnim[this.prop] = true;
+            for( var f in this.options.curAnim )if( this.options.curAnim[f] !== true )d = false;
+            if( d )
+            {
+                if( this.options.display != null )
+                {
+                    this.elem.style.overflow = this.options.overflow;
+                    a = c.data( this.elem, "olddisplay" );
+                    this.elem.style.display = a ? a : this.options.display;
+                    if( c.css( this.elem, "display" ) === "none" )this.elem.style.display = "block"
+                }
+                this.options.hide && c( this.elem ).hide();
+                if( this.options.hide || this.options.show )for( var e in this.options.curAnim )c.style( this.elem,
+                        e, this.options.orig[e] );
+                this.options.complete.call( this.elem )
+            }
+            return false
+        }
+        else
+        {
+            e = b - this.startTime;
+            this.state = e / this.options.duration;
+            a = this.options.easing || (c.easing.swing ? "swing" : "linear");
+            this.pos = c.easing[this.options.specialEasing && this.options.specialEasing[this.prop] || a]( this.state, e, 0, 1, this.options.duration );
+            this.now = this.start + (this.end - this.start) * this.pos;
+            this.update()
+        }
+        return true
+    }};
+    c.extend( c.fx, {tick:function()
+    {
+        for( var a = c.timers,b = 0; b < a.length; b++ )a[b]() || a.splice( b--, 1 );
+        a.length ||
+        c.fx.stop()
+    },stop:function()
+    {
+        clearInterval( W );
+        W = null
+    },speeds:{slow:600,fast:200,_default:400},step:{opacity:function( a )
+    {
+        c.style( a.elem, "opacity", a.now )
+    },_default:function( a )
+    {
+        if( a.elem.style && a.elem.style[a.prop] != null )a.elem.style[a.prop] = (a.prop === "width" || a.prop === "height" ? Math.max( 0, a.now ) : a.now) + a.unit;
+        else a.elem[a.prop] = a.now
+    }}} );
+    if( c.expr && c.expr.filters )c.expr.filters.animated = function( a )
+    {
+        return c.grep( c.timers,
+                function( b )
+                {
+                    return a === b.elem
+                } ).length
+    };
+    c.fn.offset = "getBoundingClientRect"in s.documentElement ?
+            function( a )
+            {
+                var b = this[0];
+                if( a )return this.each( function( e )
+                {
+                    c.offset.setOffset( this, a, e )
+                } );
+                if( !b || !b.ownerDocument )return null;
+                if( b === b.ownerDocument.body )return c.offset.bodyOffset( b );
+                var d = b.getBoundingClientRect(),f = b.ownerDocument;
+                b = f.body;
+                f = f.documentElement;
+                return{top:d.top + (self.pageYOffset || c.support.boxModel && f.scrollTop || b.scrollTop) - (f.clientTop || b.clientTop || 0),left:d.left + (self.pageXOffset || c.support.boxModel && f.scrollLeft || b.scrollLeft) - (f.clientLeft || b.clientLeft || 0)}
+            } : function( a )
+            {
+                var b =
+                        this[0];
+                if( a )return this.each( function( r )
+                {
+                    c.offset.setOffset( this, a, r )
+                } );
+                if( !b || !b.ownerDocument )return null;
+                if( b === b.ownerDocument.body )return c.offset.bodyOffset( b );
+                c.offset.initialize();
+                var d = b.offsetParent,f = b,e = b.ownerDocument,j,i = e.documentElement,o = e.body;
+                f = (e = e.defaultView) ? e.getComputedStyle( b, null ) : b.currentStyle;
+                for( var k = b.offsetTop,n = b.offsetLeft; (b = b.parentNode) && b !== o && b !== i; )
+                {
+                    if( c.offset.supportsFixedPosition && f.position === "fixed" )break;
+                    j = e ? e.getComputedStyle( b, null ) : b.currentStyle;
+                    k -= b.scrollTop;
+                    n -= b.scrollLeft;
+                    if( b === d )
+                    {
+                        k += b.offsetTop;
+                        n += b.offsetLeft;
+                        if( c.offset.doesNotAddBorder && !(c.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test( b.nodeName )) )
+                        {
+                            k += parseFloat( j.borderTopWidth ) || 0;
+                            n += parseFloat( j.borderLeftWidth ) || 0
+                        }
+                        f = d;
+                        d = b.offsetParent
+                    }
+                    if( c.offset.subtractsBorderForOverflowNotVisible && j.overflow !== "visible" )
+                    {
+                        k += parseFloat( j.borderTopWidth ) || 0;
+                        n += parseFloat( j.borderLeftWidth ) || 0
+                    }
+                    f = j
+                }
+                if( f.position === "relative" || f.position === "static" )
+                {
+                    k += o.offsetTop;
+                    n += o.offsetLeft
+                }
+                if( c.offset.supportsFixedPosition &&
+                        f.position === "fixed" )
+                {
+                    k += Math.max( i.scrollTop, o.scrollTop );
+                    n += Math.max( i.scrollLeft, o.scrollLeft )
+                }
+                return{top:k,left:n}
+            };
+    c.offset = {initialize:function()
+    {
+        var a = s.body,b = s.createElement( "div" ),d,f,e,j = parseFloat( c.curCSS( a, "marginTop", true ) ) || 0;
+        c.extend( b.style, {position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"} );
+        b.innerHTML = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+        a.insertBefore( b, a.firstChild );
+        d = b.firstChild;
+        f = d.firstChild;
+        e = d.nextSibling.firstChild.firstChild;
+        this.doesNotAddBorder = f.offsetTop !== 5;
+        this.doesAddBorderForTableAndCells = e.offsetTop === 5;
+        f.style.position = "fixed";
+        f.style.top = "20px";
+        this.supportsFixedPosition = f.offsetTop === 20 || f.offsetTop === 15;
+        f.style.position = f.style.top = "";
+        d.style.overflow = "hidden";
+        d.style.position = "relative";
+        this.subtractsBorderForOverflowNotVisible = f.offsetTop === -5;
+        this.doesNotIncludeMarginInBodyOffset = a.offsetTop !== j;
+        a.removeChild( b );
+        c.offset.initialize = c.noop
+    },bodyOffset:function( a )
+    {
+        var b = a.offsetTop,d = a.offsetLeft;
+        c.offset.initialize();
+        if( c.offset.doesNotIncludeMarginInBodyOffset )
+        {
+            b += parseFloat( c.curCSS( a, "marginTop", true ) ) || 0;
+            d += parseFloat( c.curCSS( a, "marginLeft", true ) ) || 0
+        }
+        return{top:b,left:d}
+    },setOffset:function( a, b, d )
+    {
+        if( /static/.test( c.curCSS( a, "position" ) ) )a.style.position = "relative";
+        var f = c( a ),e = f.offset(),j = parseInt( c.curCSS( a, "top", true ), 10 ) || 0,i = parseInt( c.curCSS( a, "left", true ), 10 ) || 0;
+        if( c.isFunction( b ) )b = b.call( a,
+                d, e );
+        d = {top:b.top - e.top + j,left:b.left - e.left + i};
+        "using"in b ? b.using.call( a, d ) : f.css( d )
+    }};
+    c.fn.extend( {position:function()
+    {
+        if( !this[0] )return null;
+        var a = this[0],b = this.offsetParent(),d = this.offset(),f = /^body|html$/i.test( b[0].nodeName ) ? {top:0,left:0} : b.offset();
+        d.top -= parseFloat( c.curCSS( a, "marginTop", true ) ) || 0;
+        d.left -= parseFloat( c.curCSS( a, "marginLeft", true ) ) || 0;
+        f.top += parseFloat( c.curCSS( b[0], "borderTopWidth", true ) ) || 0;
+        f.left += parseFloat( c.curCSS( b[0], "borderLeftWidth", true ) ) || 0;
+        return{top:d.top -
+                f.top,left:d.left - f.left}
+    },offsetParent:function()
+    {
+        return this.map( function()
+        {
+            for( var a = this.offsetParent || s.body; a && !/^body|html$/i.test( a.nodeName ) && c.css( a, "position" ) === "static"; )a = a.offsetParent;
+            return a
+        } )
+    }} );
+    c.each( ["Left","Top"], function( a, b )
+    {
+        var d = "scroll" + b;
+        c.fn[d] = function( f )
+        {
+            var e = this[0],j;
+            if( !e )return null;
+            if( f !== w )return this.each( function()
+            {
+                if( j = wa( this ) )j.scrollTo( !a ? f : c( j ).scrollLeft(), a ? f : c( j ).scrollTop() );
+                else this[d] = f
+            } );
+            else return(j = wa( e )) ? "pageXOffset"in j ? j[a ? "pageYOffset" :
+                    "pageXOffset"] : c.support.boxModel && j.document.documentElement[d] || j.document.body[d] : e[d]
+        }
+    } );
+    c.each( ["Height","Width"], function( a, b )
+    {
+        var d = b.toLowerCase();
+        c.fn["inner" + b] = function()
+        {
+            return this[0] ? c.css( this[0], d, false, "padding" ) : null
+        };
+        c.fn["outer" + b] = function( f )
+        {
+            return this[0] ? c.css( this[0], d, false, f ? "margin" : "border" ) : null
+        };
+        c.fn[d] = function( f )
+        {
+            var e = this[0];
+            if( !e )return f == null ? null : this;
+            if( c.isFunction( f ) )return this.each( function( j )
+            {
+                var i = c( this );
+                i[d]( f.call( this, j, i[d]() ) )
+            } );
+            return"scrollTo"in
+                    e && e.document ? e.document.compatMode === "CSS1Compat" && e.document.documentElement["client" + b] || e.document.body["client" + b] : e.nodeType === 9 ? Math.max( e.documentElement["client" + b], e.body["scroll" + b], e.documentElement["scroll" + b], e.body["offset" + b], e.documentElement["offset" + b] ) : f === w ? c.css( e, d ) : this.css( d, typeof f === "string" ? f : f + "px" )
+        }
+    } );
+    A.jQuery = A.$ = c
+})( window );
Index: /ether_2012/web/cathy/js/prototype.js
===================================================================
--- /ether_2012/web/cathy/js/prototype.js	(revision 319)
+++ /ether_2012/web/cathy/js/prototype.js	(revision 319)
@@ -0,0 +1,4320 @@
+/*  Prototype JavaScript framework, version 1.6.0.3
+ *  (c) 2005-2008 Sam Stephenson
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *  For details, see the Prototype web site: http://www.prototypejs.org/
+ *
+ *--------------------------------------------------------------------------*/
+
+var Prototype = {
+  Version: '1.6.0.3',
+
+  Browser: {
+    IE:     !!(window.attachEvent &&
+      navigator.userAgent.indexOf('Opera') === -1),
+    Opera:  navigator.userAgent.indexOf('Opera') > -1,
+    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
+    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 &&
+      navigator.userAgent.indexOf('KHTML') === -1,
+    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
+  },
+
+  BrowserFeatures: {
+    XPath: !!document.evaluate,
+    SelectorsAPI: !!document.querySelector,
+    ElementExtensions: !!window.HTMLElement,
+    SpecificElementExtensions:
+      document.createElement('div')['__proto__'] &&
+      document.createElement('div')['__proto__'] !==
+        document.createElement('form')['__proto__']
+  },
+
+  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
+  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
+
+  emptyFunction: function() { },
+  K: function(x) { return x }
+};
+
+if (Prototype.Browser.MobileSafari)
+  Prototype.BrowserFeatures.SpecificElementExtensions = false;
+
+
+/* Based on Alex Arnell's inheritance implementation. */
+var Class = {
+  create: function() {
+    var parent = null, properties = $A(arguments);
+    if (Object.isFunction(properties[0]))
+      parent = properties.shift();
+
+    function klass() {
+      this.initialize.apply(this, arguments);
+    }
+
+    Object.extend(klass, Class.Methods);
+    klass.superclass = parent;
+    klass.subclasses = [];
+
+    if (parent) {
+      var subclass = function() { };
+      subclass.prototype = parent.prototype;
+      klass.prototype = new subclass;
+      parent.subclasses.push(klass);
+    }
+
+    for (var i = 0; i < properties.length; i++)
+      klass.addMethods(properties[i]);
+
+    if (!klass.prototype.initialize)
+      klass.prototype.initialize = Prototype.emptyFunction;
+
+    klass.prototype.constructor = klass;
+
+    return klass;
+  }
+};
+
+Class.Methods = {
+  addMethods: function(source) {
+    var ancestor   = this.superclass && this.superclass.prototype;
+    var properties = Object.keys(source);
+
+    if (!Object.keys({ toString: true }).length)
+      properties.push("toString", "valueOf");
+
+    for (var i = 0, length = properties.length; i < length; i++) {
+      var property = properties[i], value = source[property];
+      if (ancestor && Object.isFunction(value) &&
+          value.argumentNames().first() == "$super") {
+        var method = value;
+        value = (function(m) {
+          return function() { return ancestor[m].apply(this, arguments) };
+        })(property).wrap(method);
+
+        value.valueOf = method.valueOf.bind(method);
+        value.toString = method.toString.bind(method);
+      }
+      this.prototype[property] = value;
+    }
+
+    return this;
+  }
+};
+
+var Abstract = { };
+
+Object.extend = function(destination, source) {
+  for (var property in source)
+    destination[property] = source[property];
+  return destination;
+};
+
+Object.extend(Object, {
+  inspect: function(object) {
+    try {
+      if (Object.isUndefined(object)) return 'undefined';
+      if (object === null) return 'null';
+      return object.inspect ? object.inspect() : String(object);
+    } catch (e) {
+      if (e instanceof RangeError) return '...';
+      throw e;
+    }
+  },
+
+  toJSON: function(object) {
+    var type = typeof object;
+    switch (type) {
+      case 'undefined':
+      case 'function':
+      case 'unknown': return;
+      case 'boolean': return object.toString();
+    }
+
+    if (object === null) return 'null';
+    if (object.toJSON) return object.toJSON();
+    if (Object.isElement(object)) return;
+
+    var results = [];
+    for (var property in object) {
+      var value = Object.toJSON(object[property]);
+      if (!Object.isUndefined(value))
+        results.push(property.toJSON() + ': ' + value);
+    }
+
+    return '{' + results.join(', ') + '}';
+  },
+
+  toQueryString: function(object) {
+    return $H(object).toQueryString();
+  },
+
+  toHTML: function(object) {
+    return object && object.toHTML ? object.toHTML() : String.interpret(object);
+  },
+
+  keys: function(object) {
+    var keys = [];
+    for (var property in object)
+      keys.push(property);
+    return keys;
+  },
+
+  values: function(object) {
+    var values = [];
+    for (var property in object)
+      values.push(object[property]);
+    return values;
+  },
+
+  clone: function(object) {
+    return Object.extend({ }, object);
+  },
+
+  isElement: function(object) {
+    return !!(object && object.nodeType == 1);
+  },
+
+  isArray: function(object) {
+    return object != null && typeof object == "object" &&
+      'splice' in object && 'join' in object;
+  },
+
+  isHash: function(object) {
+    return object instanceof Hash;
+  },
+
+  isFunction: function(object) {
+    return typeof object == "function";
+  },
+
+  isString: function(object) {
+    return typeof object == "string";
+  },
+
+  isNumber: function(object) {
+    return typeof object == "number";
+  },
+
+  isUndefined: function(object) {
+    return typeof object == "undefined";
+  }
+});
+
+Object.extend(Function.prototype, {
+  argumentNames: function() {
+    var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1]
+      .replace(/\s+/g, '').split(',');
+    return names.length == 1 && !names[0] ? [] : names;
+  },
+
+  bind: function() {
+    if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
+    var __method = this, args = $A(arguments), object = args.shift();
+    return function() {
+      return __method.apply(object, args.concat($A(arguments)));
+    }
+  },
+
+  bindAsEventListener: function() {
+    var __method = this, args = $A(arguments), object = args.shift();
+    return function(event) {
+      return __method.apply(object, [event || window.event].concat(args));
+    }
+  },
+
+  curry: function() {
+    if (!arguments.length) return this;
+    var __method = this, args = $A(arguments);
+    return function() {
+      return __method.apply(this, args.concat($A(arguments)));
+    }
+  },
+
+  delay: function() {
+    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
+    return window.setTimeout(function() {
+      return __method.apply(__method, args);
+    }, timeout);
+  },
+
+  defer: function() {
+    var args = [0.01].concat($A(arguments));
+    return this.delay.apply(this, args);
+  },
+
+  wrap: function(wrapper) {
+    var __method = this;
+    return function() {
+      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
+    }
+  },
+
+  methodize: function() {
+    if (this._methodized) return this._methodized;
+    var __method = this;
+    return this._methodized = function() {
+      return __method.apply(null, [this].concat($A(arguments)));
+    };
+  }
+});
+
+Date.prototype.toJSON = function() {
+  return '"' + this.getUTCFullYear() + '-' +
+    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
+    this.getUTCDate().toPaddedString(2) + 'T' +
+    this.getUTCHours().toPaddedString(2) + ':' +
+    this.getUTCMinutes().toPaddedString(2) + ':' +
+    this.getUTCSeconds().toPaddedString(2) + 'Z"';
+};
+
+var Try = {
+  these: function() {
+    var returnValue;
+
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      var lambda = arguments[i];
+      try {
+        returnValue = lambda();
+        break;
+      } catch (e) { }
+    }
+
+    return returnValue;
+  }
+};
+
+RegExp.prototype.match = RegExp.prototype.test;
+
+RegExp.escape = function(str) {
+  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+};
+
+/*--------------------------------------------------------------------------*/
+
+var PeriodicalExecuter = Class.create({
+  initialize: function(callback, frequency) {
+    this.callback = callback;
+    this.frequency = frequency;
+    this.currentlyExecuting = false;
+
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  execute: function() {
+    this.callback(this);
+  },
+
+  stop: function() {
+    if (!this.timer) return;
+    clearInterval(this.timer);
+    this.timer = null;
+  },
+
+  onTimerEvent: function() {
+    if (!this.currentlyExecuting) {
+      try {
+        this.currentlyExecuting = true;
+        this.execute();
+      } finally {
+        this.currentlyExecuting = false;
+      }
+    }
+  }
+});
+Object.extend(String, {
+  interpret: function(value) {
+    return value == null ? '' : String(value);
+  },
+  specialChar: {
+    '\b': '\\b',
+    '\t': '\\t',
+    '\n': '\\n',
+    '\f': '\\f',
+    '\r': '\\r',
+    '\\': '\\\\'
+  }
+});
+
+Object.extend(String.prototype, {
+  gsub: function(pattern, replacement) {
+    var result = '', source = this, match;
+    replacement = arguments.callee.prepareReplacement(replacement);
+
+    while (source.length > 0) {
+      if (match = source.match(pattern)) {
+        result += source.slice(0, match.index);
+        result += String.interpret(replacement(match));
+        source  = source.slice(match.index + match[0].length);
+      } else {
+        result += source, source = '';
+      }
+    }
+    return result;
+  },
+
+  sub: function(pattern, replacement, count) {
+    replacement = this.gsub.prepareReplacement(replacement);
+    count = Object.isUndefined(count) ? 1 : count;
+
+    return this.gsub(pattern, function(match) {
+      if (--count < 0) return match[0];
+      return replacement(match);
+    });
+  },
+
+  scan: function(pattern, iterator) {
+    this.gsub(pattern, iterator);
+    return String(this);
+  },
+
+  truncate: function(length, truncation) {
+    length = length || 30;
+    truncation = Object.isUndefined(truncation) ? '...' : truncation;
+    return this.length > length ?
+      this.slice(0, length - truncation.length) + truncation : String(this);
+  },
+
+  strip: function() {
+    return this.replace(/^\s+/, '').replace(/\s+$/, '');
+  },
+
+  stripTags: function() {
+    return this.replace(/<\/?[^>]+>/gi, '');
+  },
+
+  stripScripts: function() {
+    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
+  },
+
+  extractScripts: function() {
+    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
+    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
+    return (this.match(matchAll) || []).map(function(scriptTag) {
+      return (scriptTag.match(matchOne) || ['', ''])[1];
+    });
+  },
+
+  evalScripts: function() {
+    return this.extractScripts().map(function(script) { return eval(script) });
+  },
+
+  escapeHTML: function() {
+    var self = arguments.callee;
+    self.text.data = this;
+    return self.div.innerHTML;
+  },
+
+  unescapeHTML: function() {
+    var div = new Element('div');
+    div.innerHTML = this.stripTags();
+    return div.childNodes[0] ? (div.childNodes.length > 1 ?
+      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
+      div.childNodes[0].nodeValue) : '';
+  },
+
+  toQueryParams: function(separator) {
+    var match = this.strip().match(/([^?#]*)(#.*)?$/);
+    if (!match) return { };
+
+    return match[1].split(separator || '&').inject({ }, function(hash, pair) {
+      if ((pair = pair.split('='))[0]) {
+        var key = decodeURIComponent(pair.shift());
+        var value = pair.length > 1 ? pair.join('=') : pair[0];
+        if (value != undefined) value = decodeURIComponent(value);
+
+        if (key in hash) {
+          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
+          hash[key].push(value);
+        }
+        else hash[key] = value;
+      }
+      return hash;
+    });
+  },
+
+  toArray: function() {
+    return this.split('');
+  },
+
+  succ: function() {
+    return this.slice(0, this.length - 1) +
+      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
+  },
+
+  times: function(count) {
+    return count < 1 ? '' : new Array(count + 1).join(this);
+  },
+
+  camelize: function() {
+    var parts = this.split('-'), len = parts.length;
+    if (len == 1) return parts[0];
+
+    var camelized = this.charAt(0) == '-'
+      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
+      : parts[0];
+
+    for (var i = 1; i < len; i++)
+      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
+
+    return camelized;
+  },
+
+  capitalize: function() {
+    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
+  },
+
+  underscore: function() {
+    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
+  },
+
+  dasherize: function() {
+    return this.gsub(/_/,'-');
+  },
+
+  inspect: function(useDoubleQuotes) {
+    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
+      var character = String.specialChar[match[0]];
+      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
+    });
+    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
+    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+  },
+
+  toJSON: function() {
+    return this.inspect(true);
+  },
+
+  unfilterJSON: function(filter) {
+    return this.sub(filter || Prototype.JSONFilter, '#{1}');
+  },
+
+  isJSON: function() {
+    var str = this;
+    if (str.blank()) return false;
+    str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
+    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
+  },
+
+  evalJSON: function(sanitize) {
+    var json = this.unfilterJSON();
+    try {
+      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
+    } catch (e) { }
+    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
+  },
+
+  include: function(pattern) {
+    return this.indexOf(pattern) > -1;
+  },
+
+  startsWith: function(pattern) {
+    return this.indexOf(pattern) === 0;
+  },
+
+  endsWith: function(pattern) {
+    var d = this.length - pattern.length;
+    return d >= 0 && this.lastIndexOf(pattern) === d;
+  },
+
+  empty: function() {
+    return this == '';
+  },
+
+  blank: function() {
+    return /^\s*$/.test(this);
+  },
+
+  interpolate: function(object, pattern) {
+    return new Template(this, pattern).evaluate(object);
+  }
+});
+
+if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
+  escapeHTML: function() {
+    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+  },
+  unescapeHTML: function() {
+    return this.stripTags().replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
+  }
+});
+
+String.prototype.gsub.prepareReplacement = function(replacement) {
+  if (Object.isFunction(replacement)) return replacement;
+  var template = new Template(replacement);
+  return function(match) { return template.evaluate(match) };
+};
+
+String.prototype.parseQuery = String.prototype.toQueryParams;
+
+Object.extend(String.prototype.escapeHTML, {
+  div:  document.createElement('div'),
+  text: document.createTextNode('')
+});
+
+String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text);
+
+var Template = Class.create({
+  initialize: function(template, pattern) {
+    this.template = template.toString();
+    this.pattern = pattern || Template.Pattern;
+  },
+
+  evaluate: function(object) {
+    if (Object.isFunction(object.toTemplateReplacements))
+      object = object.toTemplateReplacements();
+
+    return this.template.gsub(this.pattern, function(match) {
+      if (object == null) return '';
+
+      var before = match[1] || '';
+      if (before == '\\') return match[2];
+
+      var ctx = object, expr = match[3];
+      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
+      match = pattern.exec(expr);
+      if (match == null) return before;
+
+      while (match != null) {
+        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
+        ctx = ctx[comp];
+        if (null == ctx || '' == match[3]) break;
+        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
+        match = pattern.exec(expr);
+      }
+
+      return before + String.interpret(ctx);
+    });
+  }
+});
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+
+var $break = { };
+
+var Enumerable = {
+  each: function(iterator, context) {
+    var index = 0;
+    try {
+      this._each(function(value) {
+        iterator.call(context, value, index++);
+      });
+    } catch (e) {
+      if (e != $break) throw e;
+    }
+    return this;
+  },
+
+  eachSlice: function(number, iterator, context) {
+    var index = -number, slices = [], array = this.toArray();
+    if (number < 1) return array;
+    while ((index += number) < array.length)
+      slices.push(array.slice(index, index+number));
+    return slices.collect(iterator, context);
+  },
+
+  all: function(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var result = true;
+    this.each(function(value, index) {
+      result = result && !!iterator.call(context, value, index);
+      if (!result) throw $break;
+    });
+    return result;
+  },
+
+  any: function(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var result = false;
+    this.each(function(value, index) {
+      if (result = !!iterator.call(context, value, index))
+        throw $break;
+    });
+    return result;
+  },
+
+  collect: function(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var results = [];
+    this.each(function(value, index) {
+      results.push(iterator.call(context, value, index));
+    });
+    return results;
+  },
+
+  detect: function(iterator, context) {
+    var result;
+    this.each(function(value, index) {
+      if (iterator.call(context, value, index)) {
+        result = value;
+        throw $break;
+      }
+    });
+    return result;
+  },
+
+  findAll: function(iterator, context) {
+    var results = [];
+    this.each(function(value, index) {
+      if (iterator.call(context, value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  grep: function(filter, iterator, context) {
+    iterator = iterator || Prototype.K;
+    var results = [];
+
+    if (Object.isString(filter))
+      filter = new RegExp(filter);
+
+    this.each(function(value, index) {
+      if (filter.match(value))
+        results.push(iterator.call(context, value, index));
+    });
+    return results;
+  },
+
+  include: function(object) {
+    if (Object.isFunction(this.indexOf))
+      if (this.indexOf(object) != -1) return true;
+
+    var found = false;
+    this.each(function(value) {
+      if (value == object) {
+        found = true;
+        throw $break;
+      }
+    });
+    return found;
+  },
+
+  inGroupsOf: function(number, fillWith) {
+    fillWith = Object.isUndefined(fillWith) ? null : fillWith;
+    return this.eachSlice(number, function(slice) {
+      while(slice.length < number) slice.push(fillWith);
+      return slice;
+    });
+  },
+
+  inject: function(memo, iterator, context) {
+    this.each(function(value, index) {
+      memo = iterator.call(context, memo, value, index);
+    });
+    return memo;
+  },
+
+  invoke: function(method) {
+    var args = $A(arguments).slice(1);
+    return this.map(function(value) {
+      return value[method].apply(value, args);
+    });
+  },
+
+  max: function(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var result;
+    this.each(function(value, index) {
+      value = iterator.call(context, value, index);
+      if (result == null || value >= result)
+        result = value;
+    });
+    return result;
+  },
+
+  min: function(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var result;
+    this.each(function(value, index) {
+      value = iterator.call(context, value, index);
+      if (result == null || value < result)
+        result = value;
+    });
+    return result;
+  },
+
+  partition: function(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var trues = [], falses = [];
+    this.each(function(value, index) {
+      (iterator.call(context, value, index) ?
+        trues : falses).push(value);
+    });
+    return [trues, falses];
+  },
+
+  pluck: function(property) {
+    var results = [];
+    this.each(function(value) {
+      results.push(value[property]);
+    });
+    return results;
+  },
+
+  reject: function(iterator, context) {
+    var results = [];
+    this.each(function(value, index) {
+      if (!iterator.call(context, value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  sortBy: function(iterator, context) {
+    return this.map(function(value, index) {
+      return {
+        value: value,
+        criteria: iterator.call(context, value, index)
+      };
+    }).sort(function(left, right) {
+      var a = left.criteria, b = right.criteria;
+      return a < b ? -1 : a > b ? 1 : 0;
+    }).pluck('value');
+  },
+
+  toArray: function() {
+    return this.map();
+  },
+
+  zip: function() {
+    var iterator = Prototype.K, args = $A(arguments);
+    if (Object.isFunction(args.last()))
+      iterator = args.pop();
+
+    var collections = [this].concat(args).map($A);
+    return this.map(function(value, index) {
+      return iterator(collections.pluck(index));
+    });
+  },
+
+  size: function() {
+    return this.toArray().length;
+  },
+
+  inspect: function() {
+    return '#<Enumerable:' + this.toArray().inspect() + '>';
+  }
+};
+
+Object.extend(Enumerable, {
+  map:     Enumerable.collect,
+  find:    Enumerable.detect,
+  select:  Enumerable.findAll,
+  filter:  Enumerable.findAll,
+  member:  Enumerable.include,
+  entries: Enumerable.toArray,
+  every:   Enumerable.all,
+  some:    Enumerable.any
+});
+function $A(iterable) {
+  if (!iterable) return [];
+  if (iterable.toArray) return iterable.toArray();
+  var length = iterable.length || 0, results = new Array(length);
+  while (length--) results[length] = iterable[length];
+  return results;
+}
+
+if (Prototype.Browser.WebKit) {
+  $A = function(iterable) {
+    if (!iterable) return [];
+    // In Safari, only use the `toArray` method if it's not a NodeList.
+    // A NodeList is a function, has an function `item` property, and a numeric
+    // `length` property. Adapted from Google Doctype.
+    if (!(typeof iterable === 'function' && typeof iterable.length ===
+        'number' && typeof iterable.item === 'function') && iterable.toArray)
+      return iterable.toArray();
+    var length = iterable.length || 0, results = new Array(length);
+    while (length--) results[length] = iterable[length];
+    return results;
+  };
+}
+
+Array.from = $A;
+
+Object.extend(Array.prototype, Enumerable);
+
+if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;
+
+Object.extend(Array.prototype, {
+  _each: function(iterator) {
+    for (var i = 0, length = this.length; i < length; i++)
+      iterator(this[i]);
+  },
+
+  clear: function() {
+    this.length = 0;
+    return this;
+  },
+
+  first: function() {
+    return this[0];
+  },
+
+  last: function() {
+    return this[this.length - 1];
+  },
+
+  compact: function() {
+    return this.select(function(value) {
+      return value != null;
+    });
+  },
+
+  flatten: function() {
+    return this.inject([], function(array, value) {
+      return array.concat(Object.isArray(value) ?
+        value.flatten() : [value]);
+    });
+  },
+
+  without: function() {
+    var values = $A(arguments);
+    return this.select(function(value) {
+      return !values.include(value);
+    });
+  },
+
+  reverse: function(inline) {
+    return (inline !== false ? this : this.toArray())._reverse();
+  },
+
+  reduce: function() {
+    return this.length > 1 ? this : this[0];
+  },
+
+  uniq: function(sorted) {
+    return this.inject([], function(array, value, index) {
+      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
+        array.push(value);
+      return array;
+    });
+  },
+
+  intersect: function(array) {
+    return this.uniq().findAll(function(item) {
+      return array.detect(function(value) { return item === value });
+    });
+  },
+
+  clone: function() {
+    return [].concat(this);
+  },
+
+  size: function() {
+    return this.length;
+  },
+
+  inspect: function() {
+    return '[' + this.map(Object.inspect).join(', ') + ']';
+  },
+
+  toJSON: function() {
+    var results = [];
+    this.each(function(object) {
+      var value = Object.toJSON(object);
+      if (!Object.isUndefined(value)) results.push(value);
+    });
+    return '[' + results.join(', ') + ']';
+  }
+});
+
+// use native browser JS 1.6 implementation if available
+if (Object.isFunction(Array.prototype.forEach))
+  Array.prototype._each = Array.prototype.forEach;
+
+if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
+  i || (i = 0);
+  var length = this.length;
+  if (i < 0) i = length + i;
+  for (; i < length; i++)
+    if (this[i] === item) return i;
+  return -1;
+};
+
+if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
+  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
+  var n = this.slice(0, i).reverse().indexOf(item);
+  return (n < 0) ? n : i - n - 1;
+};
+
+Array.prototype.toArray = Array.prototype.clone;
+
+function $w(string) {
+  if (!Object.isString(string)) return [];
+  string = string.strip();
+  return string ? string.split(/\s+/) : [];
+}
+
+if (Prototype.Browser.Opera){
+  Array.prototype.concat = function() {
+    var array = [];
+    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      if (Object.isArray(arguments[i])) {
+        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
+          array.push(arguments[i][j]);
+      } else {
+        array.push(arguments[i]);
+      }
+    }
+    return array;
+  };
+}
+Object.extend(Number.prototype, {
+  toColorPart: function() {
+    return this.toPaddedString(2, 16);
+  },
+
+  succ: function() {
+    return this + 1;
+  },
+
+  times: function(iterator, context) {
+    $R(0, this, true).each(iterator, context);
+    return this;
+  },
+
+  toPaddedString: function(length, radix) {
+    var string = this.toString(radix || 10);
+    return '0'.times(length - string.length) + string;
+  },
+
+  toJSON: function() {
+    return isFinite(this) ? this.toString() : 'null';
+  }
+});
+
+$w('abs round ceil floor').each(function(method){
+  Number.prototype[method] = Math[method].methodize();
+});
+function $H(object) {
+  return new Hash(object);
+};
+
+var Hash = Class.create(Enumerable, (function() {
+
+  function toQueryPair(key, value) {
+    if (Object.isUndefined(value)) return key;
+    return key + '=' + encodeURIComponent(String.interpret(value));
+  }
+
+  return {
+    initialize: function(object) {
+      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
+    },
+
+    _each: function(iterator) {
+      for (var key in this._object) {
+        var value = this._object[key], pair = [key, value];
+        pair.key = key;
+        pair.value = value;
+        iterator(pair);
+      }
+    },
+
+    set: function(key, value) {
+      return this._object[key] = value;
+    },
+
+    get: function(key) {
+      // simulating poorly supported hasOwnProperty
+      if (this._object[key] !== Object.prototype[key])
+        return this._object[key];
+    },
+
+    unset: function(key) {
+      var value = this._object[key];
+      delete this._object[key];
+      return value;
+    },
+
+    toObject: function() {
+      return Object.clone(this._object);
+    },
+
+    keys: function() {
+      return this.pluck('key');
+    },
+
+    values: function() {
+      return this.pluck('value');
+    },
+
+    index: function(value) {
+      var match = this.detect(function(pair) {
+        return pair.value === value;
+      });
+      return match && match.key;
+    },
+
+    merge: function(object) {
+      return this.clone().update(object);
+    },
+
+    update: function(object) {
+      return new Hash(object).inject(this, function(result, pair) {
+        result.set(pair.key, pair.value);
+        return result;
+      });
+    },
+
+    toQueryString: function() {
+      return this.inject([], function(results, pair) {
+        var key = encodeURIComponent(pair.key), values = pair.value;
+
+        if (values && typeof values == 'object') {
+          if (Object.isArray(values))
+            return results.concat(values.map(toQueryPair.curry(key)));
+        } else results.push(toQueryPair(key, values));
+        return results;
+      }).join('&');
+    },
+
+    inspect: function() {
+      return '#<Hash:{' + this.map(function(pair) {
+        return pair.map(Object.inspect).join(': ');
+      }).join(', ') + '}>';
+    },
+
+    toJSON: function() {
+      return Object.toJSON(this.toObject());
+    },
+
+    clone: function() {
+      return new Hash(this);
+    }
+  }
+})());
+
+Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
+Hash.from = $H;
+var ObjectRange = Class.create(Enumerable, {
+  initialize: function(start, end, exclusive) {
+    this.start = start;
+    this.end = end;
+    this.exclusive = exclusive;
+  },
+
+  _each: function(iterator) {
+    var value = this.start;
+    while (this.include(value)) {
+      iterator(value);
+      value = value.succ();
+    }
+  },
+
+  include: function(value) {
+    if (value < this.start)
+      return false;
+    if (this.exclusive)
+      return value < this.end;
+    return value <= this.end;
+  }
+});
+
+var $R = function(start, end, exclusive) {
+  return new ObjectRange(start, end, exclusive);
+};
+
+var Ajax = {
+  getTransport: function() {
+    return Try.these(
+      function() {return new XMLHttpRequest()},
+      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
+    ) || false;
+  },
+
+  activeRequestCount: 0
+};
+
+Ajax.Responders = {
+  responders: [],
+
+  _each: function(iterator) {
+    this.responders._each(iterator);
+  },
+
+  register: function(responder) {
+    if (!this.include(responder))
+      this.responders.push(responder);
+  },
+
+  unregister: function(responder) {
+    this.responders = this.responders.without(responder);
+  },
+
+  dispatch: function(callback, request, transport, json) {
+    this.each(function(responder) {
+      if (Object.isFunction(responder[callback])) {
+        try {
+          responder[callback].apply(responder, [request, transport, json]);
+        } catch (e) { }
+      }
+    });
+  }
+};
+
+Object.extend(Ajax.Responders, Enumerable);
+
+Ajax.Responders.register({
+  onCreate:   function() { Ajax.activeRequestCount++ },
+  onComplete: function() { Ajax.activeRequestCount-- }
+});
+
+Ajax.Base = Class.create({
+  initialize: function(options) {
+    this.options = {
+      method:       'post',
+      asynchronous: true,
+      contentType:  'application/x-www-form-urlencoded',
+      encoding:     'UTF-8',
+      parameters:   '',
+      evalJSON:     true,
+      evalJS:       true
+    };
+    Object.extend(this.options, options || { });
+
+    this.options.method = this.options.method.toLowerCase();
+
+    if (Object.isString(this.options.parameters))
+      this.options.parameters = this.options.parameters.toQueryParams();
+    else if (Object.isHash(this.options.parameters))
+      this.options.parameters = this.options.parameters.toObject();
+  }
+});
+
+Ajax.Request = Class.create(Ajax.Base, {
+  _complete: false,
+
+  initialize: function($super, url, options) {
+    $super(options);
+    this.transport = Ajax.getTransport();
+    this.request(url);
+  },
+
+  request: function(url) {
+    this.url = url;
+    this.method = this.options.method;
+    var params = Object.clone(this.options.parameters);
+
+    if (!['get', 'post'].include(this.method)) {
+      // simulate other verbs over post
+      params['_method'] = this.method;
+      this.method = 'post';
+    }
+
+    this.parameters = params;
+
+    if (params = Object.toQueryString(params)) {
+      // when GET, append parameters to URL
+      if (this.method == 'get')
+        this.url += (this.url.include('?') ? '&' : '?') + params;
+      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
+        params += '&_=';
+    }
+
+    try {
+      var response = new Ajax.Response(this);
+      if (this.options.onCreate) this.options.onCreate(response);
+      Ajax.Responders.dispatch('onCreate', this, response);
+
+      this.transport.open(this.method.toUpperCase(), this.url,
+        this.options.asynchronous);
+
+      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
+
+      this.transport.onreadystatechange = this.onStateChange.bind(this);
+      this.setRequestHeaders();
+
+      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
+      this.transport.send(this.body);
+
+      /* Force Firefox to handle ready state 4 for synchronous requests */
+      if (!this.options.asynchronous && this.transport.overrideMimeType)
+        this.onStateChange();
+
+    }
+    catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  onStateChange: function() {
+    var readyState = this.transport.readyState;
+    if (readyState > 1 && !((readyState == 4) && this._complete))
+      this.respondToReadyState(this.transport.readyState);
+  },
+
+  setRequestHeaders: function() {
+    var headers = {
+      'X-Requested-With': 'XMLHttpRequest',
+      'X-Prototype-Version': Prototype.Version,
+      'Accept': 'text/javascript, text/html, application/com.medias.xml, text/com.medias.xml, */*'
+    };
+
+    if (this.method == 'post') {
+      headers['Content-type'] = this.options.contentType +
+        (this.options.encoding ? '; charset=' + this.options.encoding : '');
+
+      /* Force "Connection: close" for older Mozilla browsers to work
+       * around a bug where XMLHttpRequest sends an incorrect
+       * Content-length header. See Mozilla Bugzilla #246651.
+       */
+      if (this.transport.overrideMimeType &&
+          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
+            headers['Connection'] = 'close';
+    }
+
+    // user-defined headers
+    if (typeof this.options.requestHeaders == 'object') {
+      var extras = this.options.requestHeaders;
+
+      if (Object.isFunction(extras.push))
+        for (var i = 0, length = extras.length; i < length; i += 2)
+          headers[extras[i]] = extras[i+1];
+      else
+        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
+    }
+
+    for (var name in headers)
+      this.transport.setRequestHeader(name, headers[name]);
+  },
+
+  success: function() {
+    var status = this.getStatus();
+    return !status || (status >= 200 && status < 300);
+  },
+
+  getStatus: function() {
+    try {
+      return this.transport.status || 0;
+    } catch (e) { return 0 }
+  },
+
+  respondToReadyState: function(readyState) {
+    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
+
+    if (state == 'Complete') {
+      try {
+        this._complete = true;
+        (this.options['on' + response.status]
+         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
+         || Prototype.emptyFunction)(response, response.headerJSON);
+      } catch (e) {
+        this.dispatchException(e);
+      }
+
+      var contentType = response.getHeader('Content-type');
+      if (this.options.evalJS == 'force'
+          || (this.options.evalJS && this.isSameOrigin() && contentType
+          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
+        this.evalResponse();
+    }
+
+    try {
+      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
+      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+
+    if (state == 'Complete') {
+      // avoid memory leak in MSIE: clean up
+      this.transport.onreadystatechange = Prototype.emptyFunction;
+    }
+  },
+
+  isSameOrigin: function() {
+    var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
+    return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
+      protocol: location.protocol,
+      domain: document.domain,
+      port: location.port ? ':' + location.port : ''
+    }));
+  },
+
+  getHeader: function(name) {
+    try {
+      return this.transport.getResponseHeader(name) || null;
+    } catch (e) { return null }
+  },
+
+  evalResponse: function() {
+    try {
+      return (this.transport.responseText || '').unfilterJSON().evalJSON();
+    } catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  dispatchException: function(exception) {
+    (this.options.onException || Prototype.emptyFunction)(this, exception);
+    Ajax.Responders.dispatch('onException', this, exception);
+  }
+});
+
+Ajax.Request.Events =
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Response = Class.create({
+  initialize: function(request){
+    this.request = request;
+    var transport  = this.transport  = request.transport,
+        readyState = this.readyState = transport.readyState;
+
+    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
+      this.status       = this.getStatus();
+      this.statusText   = this.getStatusText();
+      this.responseText = String.interpret(transport.responseText);
+      this.headerJSON   = this._getHeaderJSON();
+    }
+
+    if(readyState == 4) {
+      var xml = transport.responseXML;
+      this.responseXML  = Object.isUndefined(xml) ? null : xml;
+      this.responseJSON = this._getResponseJSON();
+    }
+  },
+
+  status:      0,
+  statusText: '',
+
+  getStatus: Ajax.Request.prototype.getStatus,
+
+  getStatusText: function() {
+    try {
+      return this.transport.statusText || '';
+    } catch (e) { return '' }
+  },
+
+  getHeader: Ajax.Request.prototype.getHeader,
+
+  getAllHeaders: function() {
+    try {
+      return this.getAllResponseHeaders();
+    } catch (e) { return null }
+  },
+
+  getResponseHeader: function(name) {
+    return this.transport.getResponseHeader(name);
+  },
+
+  getAllResponseHeaders: function() {
+    return this.transport.getAllResponseHeaders();
+  },
+
+  _getHeaderJSON: function() {
+    var json = this.getHeader('X-JSON');
+    if (!json) return null;
+    json = decodeURIComponent(escape(json));
+    try {
+      return json.evalJSON(this.request.options.sanitizeJSON ||
+        !this.request.isSameOrigin());
+    } catch (e) {
+      this.request.dispatchException(e);
+    }
+  },
+
+  _getResponseJSON: function() {
+    var options = this.request.options;
+    if (!options.evalJSON || (options.evalJSON != 'force' &&
+      !(this.getHeader('Content-type') || '').include('application/json')) ||
+        this.responseText.blank())
+          return null;
+    try {
+      return this.responseText.evalJSON(options.sanitizeJSON ||
+        !this.request.isSameOrigin());
+    } catch (e) {
+      this.request.dispatchException(e);
+    }
+  }
+});
+
+Ajax.Updater = Class.create(Ajax.Request, {
+  initialize: function($super, container, url, options) {
+    this.container = {
+      success: (container.success || container),
+      failure: (container.failure || (container.success ? null : container))
+    };
+
+    options = Object.clone(options);
+    var onComplete = options.onComplete;
+    options.onComplete = (function(response, json) {
+      this.updateContent(response.responseText);
+      if (Object.isFunction(onComplete)) onComplete(response, json);
+    }).bind(this);
+
+    $super(url, options);
+  },
+
+  updateContent: function(responseText) {
+    var receiver = this.container[this.success() ? 'success' : 'failure'],
+        options = this.options;
+
+    if (!options.evalScripts) responseText = responseText.stripScripts();
+
+    if (receiver = $(receiver)) {
+      if (options.insertion) {
+        if (Object.isString(options.insertion)) {
+          var insertion = { }; insertion[options.insertion] = responseText;
+          receiver.insert(insertion);
+        }
+        else options.insertion(receiver, responseText);
+      }
+      else receiver.update(responseText);
+    }
+  }
+});
+
+Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
+  initialize: function($super, container, url, options) {
+    $super(options);
+    this.onComplete = this.options.onComplete;
+
+    this.frequency = (this.options.frequency || 2);
+    this.decay = (this.options.decay || 1);
+
+    this.updater = { };
+    this.container = container;
+    this.url = url;
+
+    this.start();
+  },
+
+  start: function() {
+    this.options.onComplete = this.updateComplete.bind(this);
+    this.onTimerEvent();
+  },
+
+  stop: function() {
+    this.updater.options.onComplete = undefined;
+    clearTimeout(this.timer);
+    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
+  },
+
+  updateComplete: function(response) {
+    if (this.options.decay) {
+      this.decay = (response.responseText == this.lastText ?
+        this.decay * this.options.decay : 1);
+
+      this.lastText = response.responseText;
+    }
+    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
+  },
+
+  onTimerEvent: function() {
+    this.updater = new Ajax.Updater(this.container, this.url, this.options);
+  }
+});
+function $(element) {
+  if (arguments.length > 1) {
+    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
+      elements.push($(arguments[i]));
+    return elements;
+  }
+  if (Object.isString(element))
+    element = document.getElementById(element);
+  return Element.extend(element);
+}
+
+if (Prototype.BrowserFeatures.XPath) {
+  document._getElementsByXPath = function(expression, parentElement) {
+    var results = [];
+    var query = document.evaluate(expression, $(parentElement) || document,
+      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    for (var i = 0, length = query.snapshotLength; i < length; i++)
+      results.push(Element.extend(query.snapshotItem(i)));
+    return results;
+  };
+}
+
+/*--------------------------------------------------------------------------*/
+
+if (!window.Node) var Node = { };
+
+if (!Node.ELEMENT_NODE) {
+  // DOM level 2 ECMAScript Language Binding
+  Object.extend(Node, {
+    ELEMENT_NODE: 1,
+    ATTRIBUTE_NODE: 2,
+    TEXT_NODE: 3,
+    CDATA_SECTION_NODE: 4,
+    ENTITY_REFERENCE_NODE: 5,
+    ENTITY_NODE: 6,
+    PROCESSING_INSTRUCTION_NODE: 7,
+    COMMENT_NODE: 8,
+    DOCUMENT_NODE: 9,
+    DOCUMENT_TYPE_NODE: 10,
+    DOCUMENT_FRAGMENT_NODE: 11,
+    NOTATION_NODE: 12
+  });
+}
+
+(function() {
+  var element = this.Element;
+  this.Element = function(tagName, attributes) {
+    attributes = attributes || { };
+    tagName = tagName.toLowerCase();
+    var cache = Element.cache;
+    if (Prototype.Browser.IE && attributes.name) {
+      tagName = '<' + tagName + ' name="' + attributes.name + '">';
+      delete attributes.name;
+      return Element.writeAttribute(document.createElement(tagName), attributes);
+    }
+    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
+    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
+  };
+  Object.extend(this.Element, element || { });
+  if (element) this.Element.prototype = element.prototype;
+}).call(window);
+
+Element.cache = { };
+
+Element.Methods = {
+  visible: function(element) {
+    return $(element).style.display != 'none';
+  },
+
+  toggle: function(element) {
+    element = $(element);
+    Element[Element.visible(element) ? 'hide' : 'show'](element);
+    return element;
+  },
+
+  hide: function(element) {
+    element = $(element);
+    element.style.display = 'none';
+    return element;
+  },
+
+  show: function(element) {
+    element = $(element);
+    element.style.display = '';
+    return element;
+  },
+
+  remove: function(element) {
+    element = $(element);
+    element.parentNode.removeChild(element);
+    return element;
+  },
+
+  update: function(element, content) {
+    element = $(element);
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) return element.update().insert(content);
+    content = Object.toHTML(content);
+    element.innerHTML = content.stripScripts();
+    content.evalScripts.bind(content).defer();
+    return element;
+  },
+
+  replace: function(element, content) {
+    element = $(element);
+    if (content && content.toElement) content = content.toElement();
+    else if (!Object.isElement(content)) {
+      content = Object.toHTML(content);
+      var range = element.ownerDocument.createRange();
+      range.selectNode(element);
+      content.evalScripts.bind(content).defer();
+      content = range.createContextualFragment(content.stripScripts());
+    }
+    element.parentNode.replaceChild(content, element);
+    return element;
+  },
+
+  insert: function(element, insertions) {
+    element = $(element);
+
+    if (Object.isString(insertions) || Object.isNumber(insertions) ||
+        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
+          insertions = {bottom:insertions};
+
+    var content, insert, tagName, childNodes;
+
+    for (var position in insertions) {
+      content  = insertions[position];
+      position = position.toLowerCase();
+      insert = Element._insertionTranslations[position];
+
+      if (content && content.toElement) content = content.toElement();
+      if (Object.isElement(content)) {
+        insert(element, content);
+        continue;
+      }
+
+      content = Object.toHTML(content);
+
+      tagName = ((position == 'before' || position == 'after')
+        ? element.parentNode : element).tagName.toUpperCase();
+
+      childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+
+      if (position == 'top' || position == 'after') childNodes.reverse();
+      childNodes.each(insert.curry(element));
+
+      content.evalScripts.bind(content).defer();
+    }
+
+    return element;
+  },
+
+  wrap: function(element, wrapper, attributes) {
+    element = $(element);
+    if (Object.isElement(wrapper))
+      $(wrapper).writeAttribute(attributes || { });
+    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
+    else wrapper = new Element('div', wrapper);
+    if (element.parentNode)
+      element.parentNode.replaceChild(wrapper, element);
+    wrapper.appendChild(element);
+    return wrapper;
+  },
+
+  inspect: function(element) {
+    element = $(element);
+    var result = '<' + element.tagName.toLowerCase();
+    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
+      var property = pair.first(), attribute = pair.last();
+      var value = (element[property] || '').toString();
+      if (value) result += ' ' + attribute + '=' + value.inspect(true);
+    });
+    return result + '>';
+  },
+
+  recursivelyCollect: function(element, property) {
+    element = $(element);
+    var elements = [];
+    while (element = element[property])
+      if (element.nodeType == 1)
+        elements.push(Element.extend(element));
+    return elements;
+  },
+
+  ancestors: function(element) {
+    return $(element).recursivelyCollect('parentNode');
+  },
+
+  descendants: function(element) {
+    return $(element).select("*");
+  },
+
+  firstDescendant: function(element) {
+    element = $(element).firstChild;
+    while (element && element.nodeType != 1) element = element.nextSibling;
+    return $(element);
+  },
+
+  immediateDescendants: function(element) {
+    if (!(element = $(element).firstChild)) return [];
+    while (element && element.nodeType != 1) element = element.nextSibling;
+    if (element) return [element].concat($(element).nextSiblings());
+    return [];
+  },
+
+  previousSiblings: function(element) {
+    return $(element).recursivelyCollect('previousSibling');
+  },
+
+  nextSiblings: function(element) {
+    return $(element).recursivelyCollect('nextSibling');
+  },
+
+  siblings: function(element) {
+    element = $(element);
+    return element.previousSiblings().reverse().concat(element.nextSiblings());
+  },
+
+  match: function(element, selector) {
+    if (Object.isString(selector))
+      selector = new Selector(selector);
+    return selector.match($(element));
+  },
+
+  up: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return $(element.parentNode);
+    var ancestors = element.ancestors();
+    return Object.isNumber(expression) ? ancestors[expression] :
+      Selector.findElement(ancestors, expression, index);
+  },
+
+  down: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return element.firstDescendant();
+    return Object.isNumber(expression) ? element.descendants()[expression] :
+      Element.select(element, expression)[index || 0];
+  },
+
+  previous: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
+    var previousSiblings = element.previousSiblings();
+    return Object.isNumber(expression) ? previousSiblings[expression] :
+      Selector.findElement(previousSiblings, expression, index);
+  },
+
+  next: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
+    var nextSiblings = element.nextSiblings();
+    return Object.isNumber(expression) ? nextSiblings[expression] :
+      Selector.findElement(nextSiblings, expression, index);
+  },
+
+  select: function() {
+    var args = $A(arguments), element = $(args.shift());
+    return Selector.findChildElements(element, args);
+  },
+
+  adjacent: function() {
+    var args = $A(arguments), element = $(args.shift());
+    return Selector.findChildElements(element.parentNode, args).without(element);
+  },
+
+  identify: function(element) {
+    element = $(element);
+    var id = element.readAttribute('id'), self = arguments.callee;
+    if (id) return id;
+    do { id = 'anonymous_element_' + self.counter++ } while ($(id));
+    element.writeAttribute('id', id);
+    return id;
+  },
+
+  readAttribute: function(element, name) {
+    element = $(element);
+    if (Prototype.Browser.IE) {
+      var t = Element._attributeTranslations.read;
+      if (t.values[name]) return t.values[name](element, name);
+      if (t.names[name]) name = t.names[name];
+      if (name.include(':')) {
+        return (!element.attributes || !element.attributes[name]) ? null :
+         element.attributes[name].value;
+      }
+    }
+    return element.getAttribute(name);
+  },
+
+  writeAttribute: function(element, name, value) {
+    element = $(element);
+    var attributes = { }, t = Element._attributeTranslations.write;
+
+    if (typeof name == 'object') attributes = name;
+    else attributes[name] = Object.isUndefined(value) ? true : value;
+
+    for (var attr in attributes) {
+      name = t.names[attr] || attr;
+      value = attributes[attr];
+      if (t.values[attr]) name = t.values[attr](element, value);
+      if (value === false || value === null)
+        element.removeAttribute(name);
+      else if (value === true)
+        element.setAttribute(name, name);
+      else element.setAttribute(name, value);
+    }
+    return element;
+  },
+
+  getHeight: function(element) {
+    return $(element).getDimensions().height;
+  },
+
+  getWidth: function(element) {
+    return $(element).getDimensions().width;
+  },
+
+  classNames: function(element) {
+    return new Element.ClassNames(element);
+  },
+
+  hasClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    var elementClassName = element.className;
+    return (elementClassName.length > 0 && (elementClassName == className ||
+      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
+  },
+
+  addClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    if (!element.hasClassName(className))
+      element.className += (element.className ? ' ' : '') + className;
+    return element;
+  },
+
+  removeClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    element.className = element.className.replace(
+      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
+    return element;
+  },
+
+  toggleClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    return element[element.hasClassName(className) ?
+      'removeClassName' : 'addClassName'](className);
+  },
+
+  // removes whitespace-only text node children
+  cleanWhitespace: function(element) {
+    element = $(element);
+    var node = element.firstChild;
+    while (node) {
+      var nextNode = node.nextSibling;
+      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+        element.removeChild(node);
+      node = nextNode;
+    }
+    return element;
+  },
+
+  empty: function(element) {
+    return $(element).innerHTML.blank();
+  },
+
+  descendantOf: function(element, ancestor) {
+    element = $(element), ancestor = $(ancestor);
+
+    if (element.compareDocumentPosition)
+      return (element.compareDocumentPosition(ancestor) & 8) === 8;
+
+    if (ancestor.contains)
+      return ancestor.contains(element) && ancestor !== element;
+
+    while (element = element.parentNode)
+      if (element == ancestor) return true;
+
+    return false;
+  },
+
+  scrollTo: function(element) {
+    element = $(element);
+    var pos = element.cumulativeOffset();
+    window.scrollTo(pos[0], pos[1]);
+    return element;
+  },
+
+  getStyle: function(element, style) {
+    element = $(element);
+    style = style == 'float' ? 'cssFloat' : style.camelize();
+    var value = element.style[style];
+    if (!value || value == 'auto') {
+      var css = document.defaultView.getComputedStyle(element, null);
+      value = css ? css[style] : null;
+    }
+    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
+    return value == 'auto' ? null : value;
+  },
+
+  getOpacity: function(element) {
+    return $(element).getStyle('opacity');
+  },
+
+  setStyle: function(element, styles) {
+    element = $(element);
+    var elementStyle = element.style, match;
+    if (Object.isString(styles)) {
+      element.style.cssText += ';' + styles;
+      return styles.include('opacity') ?
+        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
+    }
+    for (var property in styles)
+      if (property == 'opacity') element.setOpacity(styles[property]);
+      else
+        elementStyle[(property == 'float' || property == 'cssFloat') ?
+          (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
+            property] = styles[property];
+
+    return element;
+  },
+
+  setOpacity: function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1 || value === '') ? '' :
+      (value < 0.00001) ? 0 : value;
+    return element;
+  },
+
+  getDimensions: function(element) {
+    element = $(element);
+    var display = element.getStyle('display');
+    if (display != 'none' && display != null) // Safari bug
+      return {width: element.offsetWidth, height: element.offsetHeight};
+
+    // All *Width and *Height properties give 0 on elements with display none,
+    // so enable the element temporarily
+    var els = element.style;
+    var originalVisibility = els.visibility;
+    var originalPosition = els.position;
+    var originalDisplay = els.display;
+    els.visibility = 'hidden';
+    els.position = 'absolute';
+    els.display = 'block';
+    var originalWidth = element.clientWidth;
+    var originalHeight = element.clientHeight;
+    els.display = originalDisplay;
+    els.position = originalPosition;
+    els.visibility = originalVisibility;
+    return {width: originalWidth, height: originalHeight};
+  },
+
+  makePositioned: function(element) {
+    element = $(element);
+    var pos = Element.getStyle(element, 'position');
+    if (pos == 'static' || !pos) {
+      element._madePositioned = true;
+      element.style.position = 'relative';
+      // Opera returns the offset relative to the positioning context, when an
+      // element is position relative but top and left have not been defined
+      if (Prototype.Browser.Opera) {
+        element.style.top = 0;
+        element.style.left = 0;
+      }
+    }
+    return element;
+  },
+
+  undoPositioned: function(element) {
+    element = $(element);
+    if (element._madePositioned) {
+      element._madePositioned = undefined;
+      element.style.position =
+        element.style.top =
+        element.style.left =
+        element.style.bottom =
+        element.style.right = '';
+    }
+    return element;
+  },
+
+  makeClipping: function(element) {
+    element = $(element);
+    if (element._overflow) return element;
+    element._overflow = Element.getStyle(element, 'overflow') || 'auto';
+    if (element._overflow !== 'hidden')
+      element.style.overflow = 'hidden';
+    return element;
+  },
+
+  undoClipping: function(element) {
+    element = $(element);
+    if (!element._overflow) return element;
+    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
+    element._overflow = null;
+    return element;
+  },
+
+  cumulativeOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
+  },
+
+  positionedOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+      if (element) {
+        if (element.tagName.toUpperCase() == 'BODY') break;
+        var p = Element.getStyle(element, 'position');
+        if (p !== 'static') break;
+      }
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
+  },
+
+  absolutize: function(element) {
+    element = $(element);
+    if (element.getStyle('position') == 'absolute') return element;
+    // Position.prepare(); // To be done manually by Scripty when it needs it.
+
+    var offsets = element.positionedOffset();
+    var top     = offsets[1];
+    var left    = offsets[0];
+    var width   = element.clientWidth;
+    var height  = element.clientHeight;
+
+    element._originalLeft   = left - parseFloat(element.style.left  || 0);
+    element._originalTop    = top  - parseFloat(element.style.top || 0);
+    element._originalWidth  = element.style.width;
+    element._originalHeight = element.style.height;
+
+    element.style.position = 'absolute';
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.width  = width + 'px';
+    element.style.height = height + 'px';
+    return element;
+  },
+
+  relativize: function(element) {
+    element = $(element);
+    if (element.getStyle('position') == 'relative') return element;
+    // Position.prepare(); // To be done manually by Scripty when it needs it.
+
+    element.style.position = 'relative';
+    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
+    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
+
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.height = element._originalHeight;
+    element.style.width  = element._originalWidth;
+    return element;
+  },
+
+  cumulativeScrollOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0;
+      element = element.parentNode;
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
+  },
+
+  getOffsetParent: function(element) {
+    if (element.offsetParent) return $(element.offsetParent);
+    if (element == document.body) return $(element);
+
+    while ((element = element.parentNode) && element != document.body)
+      if (Element.getStyle(element, 'position') != 'static')
+        return $(element);
+
+    return $(document.body);
+  },
+
+  viewportOffset: function(forElement) {
+    var valueT = 0, valueL = 0;
+
+    var element = forElement;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+
+      // Safari fix
+      if (element.offsetParent == document.body &&
+        Element.getStyle(element, 'position') == 'absolute') break;
+
+    } while (element = element.offsetParent);
+
+    element = forElement;
+    do {
+      if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) {
+        valueT -= element.scrollTop  || 0;
+        valueL -= element.scrollLeft || 0;
+      }
+    } while (element = element.parentNode);
+
+    return Element._returnOffset(valueL, valueT);
+  },
+
+  clonePosition: function(element, source) {
+    var options = Object.extend({
+      setLeft:    true,
+      setTop:     true,
+      setWidth:   true,
+      setHeight:  true,
+      offsetTop:  0,
+      offsetLeft: 0
+    }, arguments[2] || { });
+
+    // find page position of source
+    source = $(source);
+    var p = source.viewportOffset();
+
+    // find coordinate system to use
+    element = $(element);
+    var delta = [0, 0];
+    var parent = null;
+    // delta [0,0] will do fine with position: fixed elements,
+    // position:absolute needs offsetParent deltas
+    if (Element.getStyle(element, 'position') == 'absolute') {
+      parent = element.getOffsetParent();
+      delta = parent.viewportOffset();
+    }
+
+    // correct by body offsets (fixes Safari)
+    if (parent == document.body) {
+      delta[0] -= document.body.offsetLeft;
+      delta[1] -= document.body.offsetTop;
+    }
+
+    // set position
+    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
+    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
+    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
+    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
+    return element;
+  }
+};
+
+Element.Methods.identify.counter = 1;
+
+Object.extend(Element.Methods, {
+  getElementsBySelector: Element.Methods.select,
+  childElements: Element.Methods.immediateDescendants
+});
+
+Element._attributeTranslations = {
+  write: {
+    names: {
+      className: 'class',
+      htmlFor:   'for'
+    },
+    values: { }
+  }
+};
+
+if (Prototype.Browser.Opera) {
+  Element.Methods.getStyle = Element.Methods.getStyle.wrap(
+    function(proceed, element, style) {
+      switch (style) {
+        case 'left': case 'top': case 'right': case 'bottom':
+          if (proceed(element, 'position') === 'static') return null;
+        case 'height': case 'width':
+          // returns '0px' for hidden elements; we want it to return null
+          if (!Element.visible(element)) return null;
+
+          // returns the border-box dimensions rather than the content-box
+          // dimensions, so we subtract padding and borders from the value
+          var dim = parseInt(proceed(element, style), 10);
+
+          if (dim !== element['offset' + style.capitalize()])
+            return dim + 'px';
+
+          var properties;
+          if (style === 'height') {
+            properties = ['border-top-width', 'padding-top',
+             'padding-bottom', 'border-bottom-width'];
+          }
+          else {
+            properties = ['border-left-width', 'padding-left',
+             'padding-right', 'border-right-width'];
+          }
+          return properties.inject(dim, function(memo, property) {
+            var val = proceed(element, property);
+            return val === null ? memo : memo - parseInt(val, 10);
+          }) + 'px';
+        default: return proceed(element, style);
+      }
+    }
+  );
+
+  Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
+    function(proceed, element, attribute) {
+      if (attribute === 'title') return element.title;
+      return proceed(element, attribute);
+    }
+  );
+}
+
+else if (Prototype.Browser.IE) {
+  // IE doesn't report offsets correctly for static elements, so we change them
+  // to "relative" to get the values, then change them back.
+  Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
+    function(proceed, element) {
+      element = $(element);
+      // IE throws an error if element is not in document
+      try { element.offsetParent }
+      catch(e) { return $(document.body) }
+      var position = element.getStyle('position');
+      if (position !== 'static') return proceed(element);
+      element.setStyle({ position: 'relative' });
+      var value = proceed(element);
+      element.setStyle({ position: position });
+      return value;
+    }
+  );
+
+  $w('positionedOffset viewportOffset').each(function(method) {
+    Element.Methods[method] = Element.Methods[method].wrap(
+      function(proceed, element) {
+        element = $(element);
+        try { element.offsetParent }
+        catch(e) { return Element._returnOffset(0,0) }
+        var position = element.getStyle('position');
+        if (position !== 'static') return proceed(element);
+        // Trigger hasLayout on the offset parent so that IE6 reports
+        // accurate offsetTop and offsetLeft values for position: fixed.
+        var offsetParent = element.getOffsetParent();
+        if (offsetParent && offsetParent.getStyle('position') === 'fixed')
+          offsetParent.setStyle({ zoom: 1 });
+        element.setStyle({ position: 'relative' });
+        var value = proceed(element);
+        element.setStyle({ position: position });
+        return value;
+      }
+    );
+  });
+
+  Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap(
+    function(proceed, element) {
+      try { element.offsetParent }
+      catch(e) { return Element._returnOffset(0,0) }
+      return proceed(element);
+    }
+  );
+
+  Element.Methods.getStyle = function(element, style) {
+    element = $(element);
+    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
+    var value = element.style[style];
+    if (!value && element.currentStyle) value = element.currentStyle[style];
+
+    if (style == 'opacity') {
+      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
+        if (value[1]) return parseFloat(value[1]) / 100;
+      return 1.0;
+    }
+
+    if (value == 'auto') {
+      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
+        return element['offset' + style.capitalize()] + 'px';
+      return null;
+    }
+    return value;
+  };
+
+  Element.Methods.setOpacity = function(element, value) {
+    function stripAlpha(filter){
+      return filter.replace(/alpha\([^\)]*\)/gi,'');
+    }
+    element = $(element);
+    var currentStyle = element.currentStyle;
+    if ((currentStyle && !currentStyle.hasLayout) ||
+      (!currentStyle && element.style.zoom == 'normal'))
+        element.style.zoom = 1;
+
+    var filter = element.getStyle('filter'), style = element.style;
+    if (value == 1 || value === '') {
+      (filter = stripAlpha(filter)) ?
+        style.filter = filter : style.removeAttribute('filter');
+      return element;
+    } else if (value < 0.00001) value = 0;
+    style.filter = stripAlpha(filter) +
+      'alpha(opacity=' + (value * 100) + ')';
+    return element;
+  };
+
+  Element._attributeTranslations = {
+    read: {
+      names: {
+        'class': 'className',
+        'for':   'htmlFor'
+      },
+      values: {
+        _getAttr: function(element, attribute) {
+          return element.getAttribute(attribute, 2);
+        },
+        _getAttrNode: function(element, attribute) {
+          var node = element.getAttributeNode(attribute);
+          return node ? node.value : "";
+        },
+        _getEv: function(element, attribute) {
+          attribute = element.getAttribute(attribute);
+          return attribute ? attribute.toString().slice(23, -2) : null;
+        },
+        _flag: function(element, attribute) {
+          return $(element).hasAttribute(attribute) ? attribute : null;
+        },
+        style: function(element) {
+          return element.style.cssText.toLowerCase();
+        },
+        title: function(element) {
+          return element.title;
+        }
+      }
+    }
+  };
+
+  Element._attributeTranslations.write = {
+    names: Object.extend({
+      cellpadding: 'cellPadding',
+      cellspacing: 'cellSpacing'
+    }, Element._attributeTranslations.read.names),
+    values: {
+      checked: function(element, value) {
+        element.checked = !!value;
+      },
+
+      style: function(element, value) {
+        element.style.cssText = value ? value : '';
+      }
+    }
+  };
+
+  Element._attributeTranslations.has = {};
+
+  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
+      'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
+    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
+    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
+  });
+
+  (function(v) {
+    Object.extend(v, {
+      href:        v._getAttr,
+      src:         v._getAttr,
+      type:        v._getAttr,
+      action:      v._getAttrNode,
+      disabled:    v._flag,
+      checked:     v._flag,
+      readonly:    v._flag,
+      multiple:    v._flag,
+      onload:      v._getEv,
+      onunload:    v._getEv,
+      onclick:     v._getEv,
+      ondblclick:  v._getEv,
+      onmousedown: v._getEv,
+      onmouseup:   v._getEv,
+      onmouseover: v._getEv,
+      onmousemove: v._getEv,
+      onmouseout:  v._getEv,
+      onfocus:     v._getEv,
+      onblur:      v._getEv,
+      onkeypress:  v._getEv,
+      onkeydown:   v._getEv,
+      onkeyup:     v._getEv,
+      onsubmit:    v._getEv,
+      onreset:     v._getEv,
+      onselect:    v._getEv,
+      onchange:    v._getEv
+    });
+  })(Element._attributeTranslations.read.values);
+}
+
+else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
+  Element.Methods.setOpacity = function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1) ? 0.999999 :
+      (value === '') ? '' : (value < 0.00001) ? 0 : value;
+    return element;
+  };
+}
+
+else if (Prototype.Browser.WebKit) {
+  Element.Methods.setOpacity = function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1 || value === '') ? '' :
+      (value < 0.00001) ? 0 : value;
+
+    if (value == 1)
+      if(element.tagName.toUpperCase() == 'IMG' && element.width) {
+        element.width++; element.width--;
+      } else try {
+        var n = document.createTextNode(' ');
+        element.appendChild(n);
+        element.removeChild(n);
+      } catch (e) { }
+
+    return element;
+  };
+
+  // Safari returns margins on body which is incorrect if the child is absolutely
+  // positioned.  For performance reasons, redefine Element#cumulativeOffset for
+  // KHTML/WebKit only.
+  Element.Methods.cumulativeOffset = function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      if (element.offsetParent == document.body)
+        if (Element.getStyle(element, 'position') == 'absolute') break;
+
+      element = element.offsetParent;
+    } while (element);
+
+    return Element._returnOffset(valueL, valueT);
+  };
+}
+
+if (Prototype.Browser.IE || Prototype.Browser.Opera) {
+  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
+  Element.Methods.update = function(element, content) {
+    element = $(element);
+
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) return element.update().insert(content);
+
+    content = Object.toHTML(content);
+    var tagName = element.tagName.toUpperCase();
+
+    if (tagName in Element._insertionTranslations.tags) {
+      $A(element.childNodes).each(function(node) { element.removeChild(node) });
+      Element._getContentFromAnonymousElement(tagName, content.stripScripts())
+        .each(function(node) { element.appendChild(node) });
+    }
+    else element.innerHTML = content.stripScripts();
+
+    content.evalScripts.bind(content).defer();
+    return element;
+  };
+}
+
+if ('outerHTML' in document.createElement('div')) {
+  Element.Methods.replace = function(element, content) {
+    element = $(element);
+
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) {
+      element.parentNode.replaceChild(content, element);
+      return element;
+    }
+
+    content = Object.toHTML(content);
+    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
+
+    if (Element._insertionTranslations.tags[tagName]) {
+      var nextSibling = element.next();
+      var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+      parent.removeChild(element);
+      if (nextSibling)
+        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
+      else
+        fragments.each(function(node) { parent.appendChild(node) });
+    }
+    else element.outerHTML = content.stripScripts();
+
+    content.evalScripts.bind(content).defer();
+    return element;
+  };
+}
+
+Element._returnOffset = function(l, t) {
+  var result = [l, t];
+  result.left = l;
+  result.top = t;
+  return result;
+};
+
+Element._getContentFromAnonymousElement = function(tagName, html) {
+  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
+  if (t) {
+    div.innerHTML = t[0] + html + t[1];
+    t[2].times(function() { div = div.firstChild });
+  } else div.innerHTML = html;
+  return $A(div.childNodes);
+};
+
+Element._insertionTranslations = {
+  before: function(element, node) {
+    element.parentNode.insertBefore(node, element);
+  },
+  top: function(element, node) {
+    element.insertBefore(node, element.firstChild);
+  },
+  bottom: function(element, node) {
+    element.appendChild(node);
+  },
+  after: function(element, node) {
+    element.parentNode.insertBefore(node, element.nextSibling);
+  },
+  tags: {
+    TABLE:  ['<table>',                '</table>',                   1],
+    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
+    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
+    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
+    SELECT: ['<select>',               '</select>',                  1]
+  }
+};
+
+(function() {
+  Object.extend(this.tags, {
+    THEAD: this.tags.TBODY,
+    TFOOT: this.tags.TBODY,
+    TH:    this.tags.TD
+  });
+}).call(Element._insertionTranslations);
+
+Element.Methods.Simulated = {
+  hasAttribute: function(element, attribute) {
+    attribute = Element._attributeTranslations.has[attribute] || attribute;
+    var node = $(element).getAttributeNode(attribute);
+    return !!(node && node.specified);
+  }
+};
+
+Element.Methods.ByTag = { };
+
+Object.extend(Element, Element.Methods);
+
+if (!Prototype.BrowserFeatures.ElementExtensions &&
+    document.createElement('div')['__proto__']) {
+  window.HTMLElement = { };
+  window.HTMLElement.prototype = document.createElement('div')['__proto__'];
+  Prototype.BrowserFeatures.ElementExtensions = true;
+}
+
+Element.extend = (function() {
+  if (Prototype.BrowserFeatures.SpecificElementExtensions)
+    return Prototype.K;
+
+  var Methods = { }, ByTag = Element.Methods.ByTag;
+
+  var extend = Object.extend(function(element) {
+    if (!element || element._extendedByPrototype ||
+        element.nodeType != 1 || element == window) return element;
+
+    var methods = Object.clone(Methods),
+      tagName = element.tagName.toUpperCase(), property, value;
+
+    // extend methods for specific tags
+    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
+
+    for (property in methods) {
+      value = methods[property];
+      if (Object.isFunction(value) && !(property in element))
+        element[property] = value.methodize();
+    }
+
+    element._extendedByPrototype = Prototype.emptyFunction;
+    return element;
+
+  }, {
+    refresh: function() {
+      // extend methods for all tags (Safari doesn't need this)
+      if (!Prototype.BrowserFeatures.ElementExtensions) {
+        Object.extend(Methods, Element.Methods);
+        Object.extend(Methods, Element.Methods.Simulated);
+      }
+    }
+  });
+
+  extend.refresh();
+  return extend;
+})();
+
+Element.hasAttribute = function(element, attribute) {
+  if (element.hasAttribute) return element.hasAttribute(attribute);
+  return Element.Methods.Simulated.hasAttribute(element, attribute);
+};
+
+Element.addMethods = function(methods) {
+  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
+
+  if (!methods) {
+    Object.extend(Form, Form.Methods);
+    Object.extend(Form.Element, Form.Element.Methods);
+    Object.extend(Element.Methods.ByTag, {
+      "FORM":     Object.clone(Form.Methods),
+      "INPUT":    Object.clone(Form.Element.Methods),
+      "SELECT":   Object.clone(Form.Element.Methods),
+      "TEXTAREA": Object.clone(Form.Element.Methods)
+    });
+  }
+
+  if (arguments.length == 2) {
+    var tagName = methods;
+    methods = arguments[1];
+  }
+
+  if (!tagName) Object.extend(Element.Methods, methods || { });
+  else {
+    if (Object.isArray(tagName)) tagName.each(extend);
+    else extend(tagName);
+  }
+
+  function extend(tagName) {
+    tagName = tagName.toUpperCase();
+    if (!Element.Methods.ByTag[tagName])
+      Element.Methods.ByTag[tagName] = { };
+    Object.extend(Element.Methods.ByTag[tagName], methods);
+  }
+
+  function copy(methods, destination, onlyIfAbsent) {
+    onlyIfAbsent = onlyIfAbsent || false;
+    for (var property in methods) {
+      var value = methods[property];
+      if (!Object.isFunction(value)) continue;
+      if (!onlyIfAbsent || !(property in destination))
+        destination[property] = value.methodize();
+    }
+  }
+
+  function findDOMClass(tagName) {
+    var klass;
+    var trans = {
+      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
+      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
+      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
+      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
+      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
+      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
+      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
+      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
+      "FrameSet", "IFRAME": "IFrame"
+    };
+    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
+    if (window[klass]) return window[klass];
+    klass = 'HTML' + tagName + 'Element';
+    if (window[klass]) return window[klass];
+    klass = 'HTML' + tagName.capitalize() + 'Element';
+    if (window[klass]) return window[klass];
+
+    window[klass] = { };
+    window[klass].prototype = document.createElement(tagName)['__proto__'];
+    return window[klass];
+  }
+
+  if (F.ElementExtensions) {
+    copy(Element.Methods, HTMLElement.prototype);
+    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
+  }
+
+  if (F.SpecificElementExtensions) {
+    for (var tag in Element.Methods.ByTag) {
+      var klass = findDOMClass(tag);
+      if (Object.isUndefined(klass)) continue;
+      copy(T[tag], klass.prototype);
+    }
+  }
+
+  Object.extend(Element, Element.Methods);
+  delete Element.ByTag;
+
+  if (Element.extend.refresh) Element.extend.refresh();
+  Element.cache = { };
+};
+
+document.viewport = {
+  getDimensions: function() {
+    var dimensions = { }, B = Prototype.Browser;
+    $w('width height').each(function(d) {
+      var D = d.capitalize();
+      if (B.WebKit && !document.evaluate) {
+        // Safari <3.0 needs self.innerWidth/Height
+        dimensions[d] = self['inner' + D];
+      } else if (B.Opera && parseFloat(window.opera.version()) < 9.5) {
+        // Opera <9.5 needs document.body.clientWidth/Height
+        dimensions[d] = document.body['client' + D]
+      } else {
+        dimensions[d] = document.documentElement['client' + D];
+      }
+    });
+    return dimensions;
+  },
+
+  getWidth: function() {
+    return this.getDimensions().width;
+  },
+
+  getHeight: function() {
+    return this.getDimensions().height;
+  },
+
+  getScrollOffsets: function() {
+    return Element._returnOffset(
+      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
+      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
+  }
+};
+/* Portions of the Selector class are derived from Jack Slocum's DomQuery,
+ * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
+ * license.  Please see http://www.yui-ext.com/ for more information. */
+
+var Selector = Class.create({
+  initialize: function(expression) {
+    this.expression = expression.strip();
+
+    if (this.shouldUseSelectorsAPI()) {
+      this.mode = 'selectorsAPI';
+    } else if (this.shouldUseXPath()) {
+      this.mode = 'xpath';
+      this.compileXPathMatcher();
+    } else {
+      this.mode = "normal";
+      this.compileMatcher();
+    }
+
+  },
+
+  shouldUseXPath: function() {
+    if (!Prototype.BrowserFeatures.XPath) return false;
+
+    var e = this.expression;
+
+    // Safari 3 chokes on :*-of-type and :empty
+    if (Prototype.Browser.WebKit &&
+     (e.include("-of-type") || e.include(":empty")))
+      return false;
+
+    // XPath can't do namespaced attributes, nor can it read
+    // the "checked" property from DOM nodes
+    if ((/(\[[\w-]*?:|:checked)/).test(e))
+      return false;
+
+    return true;
+  },
+
+  shouldUseSelectorsAPI: function() {
+    if (!Prototype.BrowserFeatures.SelectorsAPI) return false;
+
+    if (!Selector._div) Selector._div = new Element('div');
+
+    // Make sure the browser treats the selector as valid. Test on an
+    // isolated element to minimize cost of this check.
+    try {
+      Selector._div.querySelector(this.expression);
+    } catch(e) {
+      return false;
+    }
+
+    return true;
+  },
+
+  compileMatcher: function() {
+    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
+        c = Selector.criteria, le, p, m;
+
+    if (Selector._cache[e]) {
+      this.matcher = Selector._cache[e];
+      return;
+    }
+
+    this.matcher = ["this.matcher = function(root) {",
+                    "var r = root, h = Selector.handlers, c = false, n;"];
+
+    while (e && le != e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        p = ps[i];
+        if (m = e.match(p)) {
+          this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
+            new Template(c[i]).evaluate(m));
+          e = e.replace(m[0], '');
+          break;
+        }
+      }
+    }
+
+    this.matcher.push("return h.unique(n);\n}");
+    eval(this.matcher.join('\n'));
+    Selector._cache[this.expression] = this.matcher;
+  },
+
+  compileXPathMatcher: function() {
+    var e = this.expression, ps = Selector.patterns,
+        x = Selector.xpath, le, m;
+
+    if (Selector._cache[e]) {
+      this.xpath = Selector._cache[e]; return;
+    }
+
+    this.matcher = ['.//*'];
+    while (e && le != e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        if (m = e.match(ps[i])) {
+          this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
+            new Template(x[i]).evaluate(m));
+          e = e.replace(m[0], '');
+          break;
+        }
+      }
+    }
+
+    this.xpath = this.matcher.join('');
+    Selector._cache[this.expression] = this.xpath;
+  },
+
+  findElements: function(root) {
+    root = root || document;
+    var e = this.expression, results;
+
+    switch (this.mode) {
+      case 'selectorsAPI':
+        // querySelectorAll queries document-wide, then filters to descendants
+        // of the context element. That's not what we want.
+        // Add an explicit context to the selector if necessary.
+        if (root !== document) {
+          var oldId = root.id, id = $(root).identify();
+          e = "#" + id + " " + e;
+        }
+
+        results = $A(root.querySelectorAll(e)).map(Element.extend);
+        root.id = oldId;
+
+        return results;
+      case 'xpath':
+        return document._getElementsByXPath(this.xpath, root);
+      default:
+       return this.matcher(root);
+    }
+  },
+
+  match: function(element) {
+    this.tokens = [];
+
+    var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
+    var le, p, m;
+
+    while (e && le !== e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        p = ps[i];
+        if (m = e.match(p)) {
+          // use the Selector.assertions methods unless the selector
+          // is too complex.
+          if (as[i]) {
+            this.tokens.push([i, Object.clone(m)]);
+            e = e.replace(m[0], '');
+          } else {
+            // reluctantly do a document-wide search
+            // and look for a match in the array
+            return this.findElements(document).include(element);
+          }
+        }
+      }
+    }
+
+    var match = true, name, matches;
+    for (var i = 0, token; token = this.tokens[i]; i++) {
+      name = token[0], matches = token[1];
+      if (!Selector.assertions[name](element, matches)) {
+        match = false; break;
+      }
+    }
+
+    return match;
+  },
+
+  toString: function() {
+    return this.expression;
+  },
+
+  inspect: function() {
+    return "#<Selector:" + this.expression.inspect() + ">";
+  }
+});
+
+Object.extend(Selector, {
+  _cache: { },
+
+  xpath: {
+    descendant:   "//*",
+    child:        "/*",
+    adjacent:     "/following-sibling::*[1]",
+    laterSibling: '/following-sibling::*',
+    tagName:      function(m) {
+      if (m[1] == '*') return '';
+      return "[local-name()='" + m[1].toLowerCase() +
+             "' or local-name()='" + m[1].toUpperCase() + "']";
+    },
+    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
+    id:           "[@id='#{1}']",
+    attrPresence: function(m) {
+      m[1] = m[1].toLowerCase();
+      return new Template("[@#{1}]").evaluate(m);
+    },
+    attr: function(m) {
+      m[1] = m[1].toLowerCase();
+      m[3] = m[5] || m[6];
+      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
+    },
+    pseudo: function(m) {
+      var h = Selector.xpath.pseudos[m[1]];
+      if (!h) return '';
+      if (Object.isFunction(h)) return h(m);
+      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
+    },
+    operators: {
+      '=':  "[@#{1}='#{3}']",
+      '!=': "[@#{1}!='#{3}']",
+      '^=': "[starts-with(@#{1}, '#{3}')]",
+      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
+      '*=': "[contains(@#{1}, '#{3}')]",
+      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
+      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
+    },
+    pseudos: {
+      'first-child': '[not(preceding-sibling::*)]',
+      'last-child':  '[not(following-sibling::*)]',
+      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
+      'empty':       "[count(*) = 0 and (count(text()) = 0)]",
+      'checked':     "[@checked]",
+      'disabled':    "[(@disabled) and (@type!='hidden')]",
+      'enabled':     "[not(@disabled) and (@type!='hidden')]",
+      'not': function(m) {
+        var e = m[6], p = Selector.patterns,
+            x = Selector.xpath, le, v;
+
+        var exclusion = [];
+        while (e && le != e && (/\S/).test(e)) {
+          le = e;
+          for (var i in p) {
+            if (m = e.match(p[i])) {
+              v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
+              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
+              e = e.replace(m[0], '');
+              break;
+            }
+          }
+        }
+        return "[not(" + exclusion.join(" and ") + ")]";
+      },
+      'nth-child':      function(m) {
+        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
+      },
+      'nth-last-child': function(m) {
+        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
+      },
+      'nth-of-type':    function(m) {
+        return Selector.xpath.pseudos.nth("position() ", m);
+      },
+      'nth-last-of-type': function(m) {
+        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
+      },
+      'first-of-type':  function(m) {
+        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
+      },
+      'last-of-type':   function(m) {
+        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
+      },
+      'only-of-type':   function(m) {
+        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
+      },
+      nth: function(fragment, m) {
+        var mm, formula = m[6], predicate;
+        if (formula == 'even') formula = '2n+0';
+        if (formula == 'odd')  formula = '2n+1';
+        if (mm = formula.match(/^(\d+)$/)) // digit only
+          return '[' + fragment + "= " + mm[1] + ']';
+        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
+          if (mm[1] == "-") mm[1] = -1;
+          var a = mm[1] ? Number(mm[1]) : 1;
+          var b = mm[2] ? Number(mm[2]) : 0;
+          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
+          "((#{fragment} - #{b}) div #{a} >= 0)]";
+          return new Template(predicate).evaluate({
+            fragment: fragment, a: a, b: b });
+        }
+      }
+    }
+  },
+
+  criteria: {
+    tagName:      'n = h.tagName(n, r, "#{1}", c);      c = false;',
+    className:    'n = h.className(n, r, "#{1}", c);    c = false;',
+    id:           'n = h.id(n, r, "#{1}", c);           c = false;',
+    attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
+    attr: function(m) {
+      m[3] = (m[5] || m[6]);
+      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m);
+    },
+    pseudo: function(m) {
+      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
+      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
+    },
+    descendant:   'c = "descendant";',
+    child:        'c = "child";',
+    adjacent:     'c = "adjacent";',
+    laterSibling: 'c = "laterSibling";'
+  },
+
+  patterns: {
+    // combinators must be listed first
+    // (and descendant needs to be last combinator)
+    laterSibling: /^\s*~\s*/,
+    child:        /^\s*>\s*/,
+    adjacent:     /^\s*\+\s*/,
+    descendant:   /^\s/,
+
+    // selectors follow
+    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
+    id:           /^#([\w\-\*]+)(\b|$)/,
+    className:    /^\.([\w\-\*]+)(\b|$)/,
+    pseudo:
+/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
+    attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/,
+    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
+  },
+
+  // for Selector.match and Element#match
+  assertions: {
+    tagName: function(element, matches) {
+      return matches[1].toUpperCase() == element.tagName.toUpperCase();
+    },
+
+    className: function(element, matches) {
+      return Element.hasClassName(element, matches[1]);
+    },
+
+    id: function(element, matches) {
+      return element.id === matches[1];
+    },
+
+    attrPresence: function(element, matches) {
+      return Element.hasAttribute(element, matches[1]);
+    },
+
+    attr: function(element, matches) {
+      var nodeValue = Element.readAttribute(element, matches[1]);
+      return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]);
+    }
+  },
+
+  handlers: {
+    // UTILITY FUNCTIONS
+    // joins two collections
+    concat: function(a, b) {
+      for (var i = 0, node; node = b[i]; i++)
+        a.push(node);
+      return a;
+    },
+
+    // marks an array of nodes for counting
+    mark: function(nodes) {
+      var _true = Prototype.emptyFunction;
+      for (var i = 0, node; node = nodes[i]; i++)
+        node._countedByPrototype = _true;
+      return nodes;
+    },
+
+    unmark: function(nodes) {
+      for (var i = 0, node; node = nodes[i]; i++)
+        node._countedByPrototype = undefined;
+      return nodes;
+    },
+
+    // mark each child node with its position (for nth calls)
+    // "ofType" flag indicates whether we're indexing for nth-of-type
+    // rather than nth-child
+    index: function(parentNode, reverse, ofType) {
+      parentNode._countedByPrototype = Prototype.emptyFunction;
+      if (reverse) {
+        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
+          var node = nodes[i];
+          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
+        }
+      } else {
+        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
+          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
+      }
+    },
+
+    // filters out duplicates and extends all nodes
+    unique: function(nodes) {
+      if (nodes.length == 0) return nodes;
+      var results = [], n;
+      for (var i = 0, l = nodes.length; i < l; i++)
+        if (!(n = nodes[i])._countedByPrototype) {
+          n._countedByPrototype = Prototype.emptyFunction;
+          results.push(Element.extend(n));
+        }
+      return Selector.handlers.unmark(results);
+    },
+
+    // COMBINATOR FUNCTIONS
+    descendant: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        h.concat(results, node.getElementsByTagName('*'));
+      return results;
+    },
+
+    child: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        for (var j = 0, child; child = node.childNodes[j]; j++)
+          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
+      }
+      return results;
+    },
+
+    adjacent: function(nodes) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        var next = this.nextElementSibling(node);
+        if (next) results.push(next);
+      }
+      return results;
+    },
+
+    laterSibling: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        h.concat(results, Element.nextSiblings(node));
+      return results;
+    },
+
+    nextElementSibling: function(node) {
+      while (node = node.nextSibling)
+        if (node.nodeType == 1) return node;
+      return null;
+    },
+
+    previousElementSibling: function(node) {
+      while (node = node.previousSibling)
+        if (node.nodeType == 1) return node;
+      return null;
+    },
+
+    // TOKEN FUNCTIONS
+    tagName: function(nodes, root, tagName, combinator) {
+      var uTagName = tagName.toUpperCase();
+      var results = [], h = Selector.handlers;
+      if (nodes) {
+        if (combinator) {
+          // fastlane for ordinary descendant combinators
+          if (combinator == "descendant") {
+            for (var i = 0, node; node = nodes[i]; i++)
+              h.concat(results, node.getElementsByTagName(tagName));
+            return results;
+          } else nodes = this[combinator](nodes);
+          if (tagName == "*") return nodes;
+        }
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node.tagName.toUpperCase() === uTagName) results.push(node);
+        return results;
+      } else return root.getElementsByTagName(tagName);
+    },
+
+    id: function(nodes, root, id, combinator) {
+      var targetNode = $(id), h = Selector.handlers;
+      if (!targetNode) return [];
+      if (!nodes && root == document) return [targetNode];
+      if (nodes) {
+        if (combinator) {
+          if (combinator == 'child') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (targetNode.parentNode == node) return [targetNode];
+          } else if (combinator == 'descendant') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (Element.descendantOf(targetNode, node)) return [targetNode];
+          } else if (combinator == 'adjacent') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (Selector.handlers.previousElementSibling(targetNode) == node)
+                return [targetNode];
+          } else nodes = h[combinator](nodes);
+        }
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node == targetNode) return [targetNode];
+        return [];
+      }
+      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
+    },
+
+    className: function(nodes, root, className, combinator) {
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      return Selector.handlers.byClassName(nodes, root, className);
+    },
+
+    byClassName: function(nodes, root, className) {
+      if (!nodes) nodes = Selector.handlers.descendant([root]);
+      var needle = ' ' + className + ' ';
+      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
+        nodeClassName = node.className;
+        if (nodeClassName.length == 0) continue;
+        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
+          results.push(node);
+      }
+      return results;
+    },
+
+    attrPresence: function(nodes, root, attr, combinator) {
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      var results = [];
+      for (var i = 0, node; node = nodes[i]; i++)
+        if (Element.hasAttribute(node, attr)) results.push(node);
+      return results;
+    },
+
+    attr: function(nodes, root, attr, value, operator, combinator) {
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      var handler = Selector.operators[operator], results = [];
+      for (var i = 0, node; node = nodes[i]; i++) {
+        var nodeValue = Element.readAttribute(node, attr);
+        if (nodeValue === null) continue;
+        if (handler(nodeValue, value)) results.push(node);
+      }
+      return results;
+    },
+
+    pseudo: function(nodes, name, value, root, combinator) {
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      return Selector.pseudos[name](nodes, value, root);
+    }
+  },
+
+  pseudos: {
+    'first-child': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        if (Selector.handlers.previousElementSibling(node)) continue;
+          results.push(node);
+      }
+      return results;
+    },
+    'last-child': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        if (Selector.handlers.nextElementSibling(node)) continue;
+          results.push(node);
+      }
+      return results;
+    },
+    'only-child': function(nodes, value, root) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
+          results.push(node);
+      return results;
+    },
+    'nth-child':        function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root);
+    },
+    'nth-last-child':   function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, true);
+    },
+    'nth-of-type':      function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, false, true);
+    },
+    'nth-last-of-type': function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, true, true);
+    },
+    'first-of-type':    function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, "1", root, false, true);
+    },
+    'last-of-type':     function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, "1", root, true, true);
+    },
+    'only-of-type':     function(nodes, formula, root) {
+      var p = Selector.pseudos;
+      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
+    },
+
+    // handles the an+b logic
+    getIndices: function(a, b, total) {
+      if (a == 0) return b > 0 ? [b] : [];
+      return $R(1, total).inject([], function(memo, i) {
+        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
+        return memo;
+      });
+    },
+
+    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
+    nth: function(nodes, formula, root, reverse, ofType) {
+      if (nodes.length == 0) return [];
+      if (formula == 'even') formula = '2n+0';
+      if (formula == 'odd')  formula = '2n+1';
+      var h = Selector.handlers, results = [], indexed = [], m;
+      h.mark(nodes);
+      for (var i = 0, node; node = nodes[i]; i++) {
+        if (!node.parentNode._countedByPrototype) {
+          h.index(node.parentNode, reverse, ofType);
+          indexed.push(node.parentNode);
+        }
+      }
+      if (formula.match(/^\d+$/)) { // just a number
+        formula = Number(formula);
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node.nodeIndex == formula) results.push(node);
+      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
+        if (m[1] == "-") m[1] = -1;
+        var a = m[1] ? Number(m[1]) : 1;
+        var b = m[2] ? Number(m[2]) : 0;
+        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
+        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
+          for (var j = 0; j < l; j++)
+            if (node.nodeIndex == indices[j]) results.push(node);
+        }
+      }
+      h.unmark(nodes);
+      h.unmark(indexed);
+      return results;
+    },
+
+    'empty': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        // IE treats comments as element nodes
+        if (node.tagName == '!' || node.firstChild) continue;
+        results.push(node);
+      }
+      return results;
+    },
+
+    'not': function(nodes, selector, root) {
+      var h = Selector.handlers, selectorType, m;
+      var exclusions = new Selector(selector).findElements(root);
+      h.mark(exclusions);
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!node._countedByPrototype) results.push(node);
+      h.unmark(exclusions);
+      return results;
+    },
+
+    'enabled': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!node.disabled && (!node.type || node.type !== 'hidden'))
+          results.push(node);
+      return results;
+    },
+
+    'disabled': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (node.disabled) results.push(node);
+      return results;
+    },
+
+    'checked': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (node.checked) results.push(node);
+      return results;
+    }
+  },
+
+  operators: {
+    '=':  function(nv, v) { return nv == v; },
+    '!=': function(nv, v) { return nv != v; },
+    '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); },
+    '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); },
+    '*=': function(nv, v) { return nv == v || nv && nv.include(v); },
+    '$=': function(nv, v) { return nv.endsWith(v); },
+    '*=': function(nv, v) { return nv.include(v); },
+    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
+    '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() +
+     '-').include('-' + (v || "").toUpperCase() + '-'); }
+  },
+
+  split: function(expression) {
+    var expressions = [];
+    expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
+      expressions.push(m[1].strip());
+    });
+    return expressions;
+  },
+
+  matchElements: function(elements, expression) {
+    var matches = $$(expression), h = Selector.handlers;
+    h.mark(matches);
+    for (var i = 0, results = [], element; element = elements[i]; i++)
+      if (element._countedByPrototype) results.push(element);
+    h.unmark(matches);
+    return results;
+  },
+
+  findElement: function(elements, expression, index) {
+    if (Object.isNumber(expression)) {
+      index = expression; expression = false;
+    }
+    return Selector.matchElements(elements, expression || '*')[index || 0];
+  },
+
+  findChildElements: function(element, expressions) {
+    expressions = Selector.split(expressions.join(','));
+    var results = [], h = Selector.handlers;
+    for (var i = 0, l = expressions.length, selector; i < l; i++) {
+      selector = new Selector(expressions[i].strip());
+      h.concat(results, selector.findElements(element));
+    }
+    return (l > 1) ? h.unique(results) : results;
+  }
+});
+
+if (Prototype.Browser.IE) {
+  Object.extend(Selector.handlers, {
+    // IE returns comment nodes on getElementsByTagName("*").
+    // Filter them out.
+    concat: function(a, b) {
+      for (var i = 0, node; node = b[i]; i++)
+        if (node.tagName !== "!") a.push(node);
+      return a;
+    },
+
+    // IE improperly serializes _countedByPrototype in (inner|outer)HTML.
+    unmark: function(nodes) {
+      for (var i = 0, node; node = nodes[i]; i++)
+        node.removeAttribute('_countedByPrototype');
+      return nodes;
+    }
+  });
+}
+
+function $$() {
+  return Selector.findChildElements(document, $A(arguments));
+}
+var Form = {
+  reset: function(form) {
+    $(form).reset();
+    return form;
+  },
+
+  serializeElements: function(elements, options) {
+    if (typeof options != 'object') options = { hash: !!options };
+    else if (Object.isUndefined(options.hash)) options.hash = true;
+    var key, value, submitted = false, submit = options.submit;
+
+    var data = elements.inject({ }, function(result, element) {
+      if (!element.disabled && element.name) {
+        key = element.name; value = $(element).getValue();
+        if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
+            submit !== false && (!submit || key == submit) && (submitted = true)))) {
+          if (key in result) {
+            // a key is already present; construct an array of values
+            if (!Object.isArray(result[key])) result[key] = [result[key]];
+            result[key].push(value);
+          }
+          else result[key] = value;
+        }
+      }
+      return result;
+    });
+
+    return options.hash ? data : Object.toQueryString(data);
+  }
+};
+
+Form.Methods = {
+  serialize: function(form, options) {
+    return Form.serializeElements(Form.getElements(form), options);
+  },
+
+  getElements: function(form) {
+    return $A($(form).getElementsByTagName('*')).inject([],
+      function(elements, child) {
+        if (Form.Element.Serializers[child.tagName.toLowerCase()])
+          elements.push(Element.extend(child));
+        return elements;
+      }
+    );
+  },
+
+  getInputs: function(form, typeName, name) {
+    form = $(form);
+    var inputs = form.getElementsByTagName('input');
+
+    if (!typeName && !name) return $A(inputs).map(Element.extend);
+
+    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
+      var input = inputs[i];
+      if ((typeName && input.type != typeName) || (name && input.name != name))
+        continue;
+      matchingInputs.push(Element.extend(input));
+    }
+
+    return matchingInputs;
+  },
+
+  disable: function(form) {
+    form = $(form);
+    Form.getElements(form).invoke('disable');
+    return form;
+  },
+
+  enable: function(form) {
+    form = $(form);
+    Form.getElements(form).invoke('enable');
+    return form;
+  },
+
+  findFirstElement: function(form) {
+    var elements = $(form).getElements().findAll(function(element) {
+      return 'hidden' != element.type && !element.disabled;
+    });
+    var firstByIndex = elements.findAll(function(element) {
+      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
+    }).sortBy(function(element) { return element.tabIndex }).first();
+
+    return firstByIndex ? firstByIndex : elements.find(function(element) {
+      return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+    });
+  },
+
+  focusFirstElement: function(form) {
+    form = $(form);
+    form.findFirstElement().activate();
+    return form;
+  },
+
+  request: function(form, options) {
+    form = $(form), options = Object.clone(options || { });
+
+    var params = options.parameters, action = form.readAttribute('action') || '';
+    if (action.blank()) action = window.location.href;
+    options.parameters = form.serialize(true);
+
+    if (params) {
+      if (Object.isString(params)) params = params.toQueryParams();
+      Object.extend(options.parameters, params);
+    }
+
+    if (form.hasAttribute('method') && !options.method)
+      options.method = form.method;
+
+    return new Ajax.Request(action, options);
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element = {
+  focus: function(element) {
+    $(element).focus();
+    return element;
+  },
+
+  select: function(element) {
+    $(element).select();
+    return element;
+  }
+};
+
+Form.Element.Methods = {
+  serialize: function(element) {
+    element = $(element);
+    if (!element.disabled && element.name) {
+      var value = element.getValue();
+      if (value != undefined) {
+        var pair = { };
+        pair[element.name] = value;
+        return Object.toQueryString(pair);
+      }
+    }
+    return '';
+  },
+
+  getValue: function(element) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    return Form.Element.Serializers[method](element);
+  },
+
+  setValue: function(element, value) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    Form.Element.Serializers[method](element, value);
+    return element;
+  },
+
+  clear: function(element) {
+    $(element).value = '';
+    return element;
+  },
+
+  present: function(element) {
+    return $(element).value != '';
+  },
+
+  activate: function(element) {
+    element = $(element);
+    try {
+      element.focus();
+      if (element.select && (element.tagName.toLowerCase() != 'input' ||
+          !['button', 'reset', 'submit'].include(element.type)))
+        element.select();
+    } catch (e) { }
+    return element;
+  },
+
+  disable: function(element) {
+    element = $(element);
+    element.disabled = true;
+    return element;
+  },
+
+  enable: function(element) {
+    element = $(element);
+    element.disabled = false;
+    return element;
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Field = Form.Element;
+var $F = Form.Element.Methods.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element.Serializers = {
+  input: function(element, value) {
+    switch (element.type.toLowerCase()) {
+      case 'checkbox':
+      case 'radio':
+        return Form.Element.Serializers.inputSelector(element, value);
+      default:
+        return Form.Element.Serializers.textarea(element, value);
+    }
+  },
+
+  inputSelector: function(element, value) {
+    if (Object.isUndefined(value)) return element.checked ? element.value : null;
+    else element.checked = !!value;
+  },
+
+  textarea: function(element, value) {
+    if (Object.isUndefined(value)) return element.value;
+    else element.value = value;
+  },
+
+  select: function(element, value) {
+    if (Object.isUndefined(value))
+      return this[element.type == 'select-one' ?
+        'selectOne' : 'selectMany'](element);
+    else {
+      var opt, currentValue, single = !Object.isArray(value);
+      for (var i = 0, length = element.length; i < length; i++) {
+        opt = element.options[i];
+        currentValue = this.optionValue(opt);
+        if (single) {
+          if (currentValue == value) {
+            opt.selected = true;
+            return;
+          }
+        }
+        else opt.selected = value.include(currentValue);
+      }
+    }
+  },
+
+  selectOne: function(element) {
+    var index = element.selectedIndex;
+    return index >= 0 ? this.optionValue(element.options[index]) : null;
+  },
+
+  selectMany: function(element) {
+    var values, length = element.length;
+    if (!length) return null;
+
+    for (var i = 0, values = []; i < length; i++) {
+      var opt = element.options[i];
+      if (opt.selected) values.push(this.optionValue(opt));
+    }
+    return values;
+  },
+
+  optionValue: function(opt) {
+    // extend element because hasAttribute may not be native
+    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
+  initialize: function($super, element, frequency, callback) {
+    $super(callback, frequency);
+    this.element   = $(element);
+    this.lastValue = this.getValue();
+  },
+
+  execute: function() {
+    var value = this.getValue();
+    if (Object.isString(this.lastValue) && Object.isString(value) ?
+        this.lastValue != value : String(this.lastValue) != String(value)) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+});
+
+Form.Element.Observer = Class.create(Abstract.TimedObserver, {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create(Abstract.TimedObserver, {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = Class.create({
+  initialize: function(element, callback) {
+    this.element  = $(element);
+    this.callback = callback;
+
+    this.lastValue = this.getValue();
+    if (this.element.tagName.toLowerCase() == 'form')
+      this.registerFormCallbacks();
+    else
+      this.registerCallback(this.element);
+  },
+
+  onElementEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  },
+
+  registerFormCallbacks: function() {
+    Form.getElements(this.element).each(this.registerCallback, this);
+  },
+
+  registerCallback: function(element) {
+    if (element.type) {
+      switch (element.type.toLowerCase()) {
+        case 'checkbox':
+        case 'radio':
+          Event.observe(element, 'click', this.onElementEvent.bind(this));
+          break;
+        default:
+          Event.observe(element, 'change', this.onElementEvent.bind(this));
+          break;
+      }
+    }
+  }
+});
+
+Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.EventObserver = Class.create(Abstract.EventObserver, {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+if (!window.Event) var Event = { };
+
+Object.extend(Event, {
+  KEY_BACKSPACE: 8,
+  KEY_TAB:       9,
+  KEY_RETURN:   13,
+  KEY_ESC:      27,
+  KEY_LEFT:     37,
+  KEY_UP:       38,
+  KEY_RIGHT:    39,
+  KEY_DOWN:     40,
+  KEY_DELETE:   46,
+  KEY_HOME:     36,
+  KEY_END:      35,
+  KEY_PAGEUP:   33,
+  KEY_PAGEDOWN: 34,
+  KEY_INSERT:   45,
+
+  cache: { },
+
+  relatedTarget: function(event) {
+    var element;
+    switch(event.type) {
+      case 'mouseover': element = event.fromElement; break;
+      case 'mouseout':  element = event.toElement;   break;
+      default: return null;
+    }
+    return Element.extend(element);
+  }
+});
+
+Event.Methods = (function() {
+  var isButton;
+
+  if (Prototype.Browser.IE) {
+    var buttonMap = { 0: 1, 1: 4, 2: 2 };
+    isButton = function(event, code) {
+      return event.button == buttonMap[code];
+    };
+
+  } else if (Prototype.Browser.WebKit) {
+    isButton = function(event, code) {
+      switch (code) {
+        case 0: return event.which == 1 && !event.metaKey;
+        case 1: return event.which == 1 && event.metaKey;
+        default: return false;
+      }
+    };
+
+  } else {
+    isButton = function(event, code) {
+      return event.which ? (event.which === code + 1) : (event.button === code);
+    };
+  }
+
+  return {
+    isLeftClick:   function(event) { return isButton(event, 0) },
+    isMiddleClick: function(event) { return isButton(event, 1) },
+    isRightClick:  function(event) { return isButton(event, 2) },
+
+    element: function(event) {
+      event = Event.extend(event);
+
+      var node          = event.target,
+          type          = event.type,
+          currentTarget = event.currentTarget;
+
+      if (currentTarget && currentTarget.tagName) {
+        // Firefox screws up the "click" event when moving between radio buttons
+        // via arrow keys. It also screws up the "load" and "error" events on images,
+        // reporting the document as the target instead of the original image.
+        if (type === 'load' || type === 'error' ||
+          (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
+            && currentTarget.type === 'radio'))
+              node = currentTarget;
+      }
+      if (node.nodeType == Node.TEXT_NODE) node = node.parentNode;
+      return Element.extend(node);
+    },
+
+    findElement: function(event, expression) {
+      var element = Event.element(event);
+      if (!expression) return element;
+      var elements = [element].concat(element.ancestors());
+      return Selector.findElement(elements, expression, 0);
+    },
+
+    pointer: function(event) {
+      var docElement = document.documentElement,
+      body = document.body || { scrollLeft: 0, scrollTop: 0 };
+      return {
+        x: event.pageX || (event.clientX +
+          (docElement.scrollLeft || body.scrollLeft) -
+          (docElement.clientLeft || 0)),
+        y: event.pageY || (event.clientY +
+          (docElement.scrollTop || body.scrollTop) -
+          (docElement.clientTop || 0))
+      };
+    },
+
+    pointerX: function(event) { return Event.pointer(event).x },
+    pointerY: function(event) { return Event.pointer(event).y },
+
+    stop: function(event) {
+      Event.extend(event);
+      event.preventDefault();
+      event.stopPropagation();
+      event.stopped = true;
+    }
+  };
+})();
+
+Event.extend = (function() {
+  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
+    m[name] = Event.Methods[name].methodize();
+    return m;
+  });
+
+  if (Prototype.Browser.IE) {
+    Object.extend(methods, {
+      stopPropagation: function() { this.cancelBubble = true },
+      preventDefault:  function() { this.returnValue = false },
+      inspect: function() { return "[object Event]" }
+    });
+
+    return function(event) {
+      if (!event) return false;
+      if (event._extendedByPrototype) return event;
+
+      event._extendedByPrototype = Prototype.emptyFunction;
+      var pointer = Event.pointer(event);
+      Object.extend(event, {
+        target: event.srcElement,
+        relatedTarget: Event.relatedTarget(event),
+        pageX:  pointer.x,
+        pageY:  pointer.y
+      });
+      return Object.extend(event, methods);
+    };
+
+  } else {
+    Event.prototype = Event.prototype || document.createEvent("HTMLEvents")['__proto__'];
+    Object.extend(Event.prototype, methods);
+    return Prototype.K;
+  }
+})();
+
+Object.extend(Event, (function() {
+  var cache = Event.cache;
+
+  function getEventID(element) {
+    if (element._prototypeEventID) return element._prototypeEventID[0];
+    arguments.callee.id = arguments.callee.id || 1;
+    return element._prototypeEventID = [++arguments.callee.id];
+  }
+
+  function getDOMEventName(eventName) {
+    if (eventName && eventName.include(':')) return "dataavailable";
+    return eventName;
+  }
+
+  function getCacheForID(id) {
+    return cache[id] = cache[id] || { };
+  }
+
+  function getWrappersForEventName(id, eventName) {
+    var c = getCacheForID(id);
+    return c[eventName] = c[eventName] || [];
+  }
+
+  function createWrapper(element, eventName, handler) {
+    var id = getEventID(element);
+    var c = getWrappersForEventName(id, eventName);
+    if (c.pluck("handler").include(handler)) return false;
+
+    var wrapper = function(event) {
+      if (!Event || !Event.extend ||
+        (event.eventName && event.eventName != eventName))
+          return false;
+
+      Event.extend(event);
+      handler.call(element, event);
+    };
+
+    wrapper.handler = handler;
+    c.push(wrapper);
+    return wrapper;
+  }
+
+  function findWrapper(id, eventName, handler) {
+    var c = getWrappersForEventName(id, eventName);
+    return c.find(function(wrapper) { return wrapper.handler == handler });
+  }
+
+  function destroyWrapper(id, eventName, handler) {
+    var c = getCacheForID(id);
+    if (!c[eventName]) return false;
+    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
+  }
+
+  function destroyCache() {
+    for (var id in cache)
+      for (var eventName in cache[id])
+        cache[id][eventName] = null;
+  }
+
+
+  // Internet Explorer needs to remove event handlers on page unload
+  // in order to avoid memory leaks.
+  if (window.attachEvent) {
+    window.attachEvent("onunload", destroyCache);
+  }
+
+  // Safari has a dummy event handler on page unload so that it won't
+  // use its bfcache. Safari <= 3.1 has an issue with restoring the "document"
+  // object when page is returned to via the back button using its bfcache.
+  if (Prototype.Browser.WebKit) {
+    window.addEventListener('unload', Prototype.emptyFunction, false);
+  }
+
+  return {
+    observe: function(element, eventName, handler) {
+      element = $(element);
+      var name = getDOMEventName(eventName);
+
+      var wrapper = createWrapper(element, eventName, handler);
+      if (!wrapper) return element;
+
+      if (element.addEventListener) {
+        element.addEventListener(name, wrapper, false);
+      } else {
+        element.attachEvent("on" + name, wrapper);
+      }
+
+      return element;
+    },
+
+    stopObserving: function(element, eventName, handler) {
+      element = $(element);
+      var id = getEventID(element), name = getDOMEventName(eventName);
+
+      if (!handler && eventName) {
+        getWrappersForEventName(id, eventName).each(function(wrapper) {
+          element.stopObserving(eventName, wrapper.handler);
+        });
+        return element;
+
+      } else if (!eventName) {
+        Object.keys(getCacheForID(id)).each(function(eventName) {
+          element.stopObserving(eventName);
+        });
+        return element;
+      }
+
+      var wrapper = findWrapper(id, eventName, handler);
+      if (!wrapper) return element;
+
+      if (element.removeEventListener) {
+        element.removeEventListener(name, wrapper, false);
+      } else {
+        element.detachEvent("on" + name, wrapper);
+      }
+
+      destroyWrapper(id, eventName, handler);
+
+      return element;
+    },
+
+    fire: function(element, eventName, memo) {
+      element = $(element);
+      if (element == document && document.createEvent && !element.dispatchEvent)
+        element = document.documentElement;
+
+      var event;
+      if (document.createEvent) {
+        event = document.createEvent("HTMLEvents");
+        event.initEvent("dataavailable", true, true);
+      } else {
+        event = document.createEventObject();
+        event.eventType = "ondataavailable";
+      }
+
+      event.eventName = eventName;
+      event.memo = memo || { };
+
+      if (document.createEvent) {
+        element.dispatchEvent(event);
+      } else {
+        element.fireEvent(event.eventType, event);
+      }
+
+      return Event.extend(event);
+    }
+  };
+})());
+
+Object.extend(Event, Event.Methods);
+
+Element.addMethods({
+  fire:          Event.fire,
+  observe:       Event.observe,
+  stopObserving: Event.stopObserving
+});
+
+Object.extend(document, {
+  fire:          Element.Methods.fire.methodize(),
+  observe:       Element.Methods.observe.methodize(),
+  stopObserving: Element.Methods.stopObserving.methodize(),
+  loaded:        false
+});
+
+(function() {
+  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
+     Matthias Miller, Dean Edwards and John Resig. */
+
+  var timer;
+
+  function fireContentLoadedEvent() {
+    if (document.loaded) return;
+    if (timer) window.clearInterval(timer);
+    document.fire("dom:loaded");
+    document.loaded = true;
+  }
+
+  if (document.addEventListener) {
+    if (Prototype.Browser.WebKit) {
+      timer = window.setInterval(function() {
+        if (/loaded|complete/.test(document.readyState))
+          fireContentLoadedEvent();
+      }, 0);
+
+      Event.observe(window, "load", fireContentLoadedEvent);
+
+    } else {
+      document.addEventListener("DOMContentLoaded",
+        fireContentLoadedEvent, false);
+    }
+
+  } else {
+    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
+    $("__onDOMContentLoaded").onreadystatechange = function() {
+      if (this.readyState == "complete") {
+        this.onreadystatechange = null;
+        fireContentLoadedEvent();
+      }
+    };
+  }
+})();
+/*------------------------------- DEPRECATED -------------------------------*/
+
+Hash.toQueryString = Object.toQueryString;
+
+var Toggle = { display: Element.toggle };
+
+Element.Methods.childOf = Element.Methods.descendantOf;
+
+var Insertion = {
+  Before: function(element, content) {
+    return Element.insert(element, {before:content});
+  },
+
+  Top: function(element, content) {
+    return Element.insert(element, {top:content});
+  },
+
+  Bottom: function(element, content) {
+    return Element.insert(element, {bottom:content});
+  },
+
+  After: function(element, content) {
+    return Element.insert(element, {after:content});
+  }
+};
+
+var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
+
+// This should be moved to script.aculo.us; notice the deprecated methods
+// further below, that map to the newer Element methods.
+var Position = {
+  // set to true if needed, warning: firefox performance problems
+  // NOT neeeded for page scrolling, only if draggable contained in
+  // scrollable elements
+  includeScrollOffsets: false,
+
+  // must be called before calling withinIncludingScrolloffset, every time the
+  // page is scrolled
+  prepare: function() {
+    this.deltaX =  window.pageXOffset
+                || document.documentElement.scrollLeft
+                || document.body.scrollLeft
+                || 0;
+    this.deltaY =  window.pageYOffset
+                || document.documentElement.scrollTop
+                || document.body.scrollTop
+                || 0;
+  },
+
+  // caches x/y coordinate pair to use with overlap
+  within: function(element, x, y) {
+    if (this.includeScrollOffsets)
+      return this.withinIncludingScrolloffsets(element, x, y);
+    this.xcomp = x;
+    this.ycomp = y;
+    this.offset = Element.cumulativeOffset(element);
+
+    return (y >= this.offset[1] &&
+            y <  this.offset[1] + element.offsetHeight &&
+            x >= this.offset[0] &&
+            x <  this.offset[0] + element.offsetWidth);
+  },
+
+  withinIncludingScrolloffsets: function(element, x, y) {
+    var offsetcache = Element.cumulativeScrollOffset(element);
+
+    this.xcomp = x + offsetcache[0] - this.deltaX;
+    this.ycomp = y + offsetcache[1] - this.deltaY;
+    this.offset = Element.cumulativeOffset(element);
+
+    return (this.ycomp >= this.offset[1] &&
+            this.ycomp <  this.offset[1] + element.offsetHeight &&
+            this.xcomp >= this.offset[0] &&
+            this.xcomp <  this.offset[0] + element.offsetWidth);
+  },
+
+  // within must be called directly before
+  overlap: function(mode, element) {
+    if (!mode) return 0;
+    if (mode == 'vertical')
+      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+        element.offsetHeight;
+    if (mode == 'horizontal')
+      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+        element.offsetWidth;
+  },
+
+  // Deprecation layer -- use newer Element methods now (1.5.2).
+
+  cumulativeOffset: Element.Methods.cumulativeOffset,
+
+  positionedOffset: Element.Methods.positionedOffset,
+
+  absolutize: function(element) {
+    Position.prepare();
+    return Element.absolutize(element);
+  },
+
+  relativize: function(element) {
+    Position.prepare();
+    return Element.relativize(element);
+  },
+
+  realOffset: Element.Methods.cumulativeScrollOffset,
+
+  offsetParent: Element.Methods.getOffsetParent,
+
+  page: Element.Methods.viewportOffset,
+
+  clone: function(source, target, options) {
+    options = options || { };
+    return Element.clonePosition(target, source, options);
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
+  function iter(name) {
+    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
+  }
+
+  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
+  function(element, className) {
+    className = className.toString().strip();
+    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
+    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
+  } : function(element, className) {
+    className = className.toString().strip();
+    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
+    if (!classNames && !className) return elements;
+
+    var nodes = $(element).getElementsByTagName('*');
+    className = ' ' + className + ' ';
+
+    for (var i = 0, child, cn; child = nodes[i]; i++) {
+      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
+          (classNames && classNames.all(function(name) {
+            return !name.toString().blank() && cn.include(' ' + name + ' ');
+          }))))
+        elements.push(Element.extend(child));
+    }
+    return elements;
+  };
+
+  return function(className, parentElement) {
+    return $(parentElement || document.body).getElementsByClassName(className);
+  };
+}(Element.Methods);
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+  initialize: function(element) {
+    this.element = $(element);
+  },
+
+  _each: function(iterator) {
+    this.element.className.split(/\s+/).select(function(name) {
+      return name.length > 0;
+    })._each(iterator);
+  },
+
+  set: function(className) {
+    this.element.className = className;
+  },
+
+  add: function(classNameToAdd) {
+    if (this.include(classNameToAdd)) return;
+    this.set($A(this).concat(classNameToAdd).join(' '));
+  },
+
+  remove: function(classNameToRemove) {
+    if (!this.include(classNameToRemove)) return;
+    this.set($A(this).without(classNameToRemove).join(' '));
+  },
+
+  toString: function() {
+    return $A(this).join(' ');
+  }
+};
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+
+/*--------------------------------------------------------------------------*/
+
+Element.addMethods();
Index: /ether_2012/web/cathy/visu_cathy-script.jsp
===================================================================
--- /ether_2012/web/cathy/visu_cathy-script.jsp	(revision 319)
+++ /ether_2012/web/cathy/visu_cathy-script.jsp	(revision 319)
@@ -0,0 +1,98 @@
+<script type="text/javascript">
+    var InterfaceC = Class.create( {
+
+        initialize: function()
+        {
+            // Container
+            this.generalContainerResults = $( "containerResults" );
+            this.generalContainerResult = $( "containerResult" );
+            this.containerSelect = $( 'containerSelect' );
+            this.containerCalendar = $( "containerCalendar" );
+            this.containerRadio = $( 'containerRadio' );
+
+            /** *********** LOADING *********** **/
+            // Create loading object for plateforms
+            var param = new Object();
+            param.id = "loadingForContent";
+            param.parent = this.generalContainerResults;
+            this.loadingPlateforms = new Loading( param );
+            this.loadingPlateforms.hide();
+
+            /** *********** CREATE *********** **/
+            this.createSelect();
+            this.createRadio();
+            this.createCalendar();
+
+            /** *********** BUTTON *********** **/
+            this.addPlotButton = new Button( {value:"Download", parent:this.generalContainerResults, id:"button_download", onClick:this.onClickDownload.bind( this )} );
+            this.addPlotButton.enable();
+        },
+
+        // DISPLAYS ********************************************************
+        createSelect: function()
+        {
+            var paramSelect = new Object();
+            paramSelect.id = "selectStations";
+            paramSelect.parent = this.containerSelect;
+            this.selectStations = new Select( paramSelect );
+            this.selectStations.add( "0", "station 0", this.onClickSelect.bind( this ) );
+            this.selectStations.add( "1", "station 1", this.onClickSelect.bind( this ) );
+            this.selectStations.add( "2", "station 2", this.onClickSelect.bind( this ) );
+            this.selectStations.selectFirst();
+        },
+
+        createRadio: function()
+        {
+            var paramRadio = new Object();
+            paramRadio.id = "radios";
+            paramRadio.parent = this.containerRadio;
+            this.radio = new Radio( paramRadio );
+            this.radio.add( "P", "Profil", this.onClicKRadio.bind( this ) );
+            this.radio.add( "C", "Column", this.onClicKRadio.bind( this ) );
+        },
+
+        createCalendar: function()
+        {
+            this.calendarFormat = "%Y-%m-%d %H:%i";
+            this.calendarConverter = new AnyTime.Converter( { format: this.calendarFormat } );
+
+            AnyTime.picker( "beginDate", { format: this.calendarFormat, firstDOW: 1,
+                labelTitle: "Select a date", labelYear: "Select a year", labelMonth: "Select a month", labelDayOfMonth: "Select a day",
+                labelHour: "Select an hour", labelMinute: "Select a minute",
+                methodToCall: this.onClickDate.bindAsEventListener( this )
+            } );
+
+            this.clearCalendarButton = new Button( {value:"Clear", parent:this.containerCalendar, id:"button_clear_calendar", className:"small", onClick:this.onClickClear.bind( this )} );
+        },
+
+        // EVENTS ********************************************************
+        onClickSelect: function()
+        {
+            this.generalContainerResult.innerHTML += this.selectStations.getName();
+        },
+
+        onClickDate: function()
+        {
+            this.beginDate = this.calendarConverter.parse( $( "beginDate" ).value ).getTime();
+            this.generalContainerResult.innerHTML += this.beginDate;
+            this.generalContainerResult.innerHTML += $( "beginDate" ).value;
+        },
+
+        onClickClear: function()
+        {
+            $( "beginDate" ).value = "";
+            this.beginDate = false;
+        },
+
+        onClicKRadio: function()
+        {
+            this.generalContainerResult.innerHTML += this.radio.getName();
+        },
+
+        onClickDownload: function()
+        {
+            this.loadingPlateforms.display();
+        }
+    } );
+
+</script>
Index: /ether_2012/web/cathy/visu_cathy.jsp
===================================================================
--- /ether_2012/web/cathy/visu_cathy.jsp	(revision 319)
+++ /ether_2012/web/cathy/visu_cathy.jsp	(revision 319)
@@ -0,0 +1,55 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+<HTML>
+<HEAD>
+
+    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+    <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
+
+    <title>Page Cathy</title>
+
+    <link rel="stylesheet" type="text/css" href="css/ether.css"/>
+    <link rel="stylesheet" type="text/css" href="css/select.css"/>
+    <link rel="stylesheet" type="text/css" href="css/button.css"/>
+    <link rel="stylesheet" type="text/css" href="css/radio.css"/>
+    <link rel="stylesheet" type="text/css" href="css/blueprint-css/blueprint/src/grid.css"/>
+    <link rel="stylesheet" type="text/css" href="css/anytime.css"/>
+
+    <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
+    <script type="text/javascript" src="js/prototype.js"></script>
+    <script type="text/javascript" src="js/Select.js"></script>
+    <script type="text/javascript" src="js/Button.js"></script>
+    <script type="text/javascript" src="js/Radio.js"></script>
+    <script type="text/javascript" src="js/Loading.js"></script>
+    <script type="text/javascript" src="js/anytime.js"></script>
+
+    <jsp:include page="visu_cathy-script.jsp"/>
+</HEAD>
+
+<BODY>
+
+
+<div id="containerMenu" class="span-10 border"> Menu
+    <br/><br/>
+
+    <div id="containerSelect" class="containerSelect span-9"></div>
+
+    <div id="containerCalendar" class="containerCalendar span-9">
+        <input type="text" id="beginDate" size="15"/>
+    </div>
+
+    <div id="containerRadio" class="containerRadio span-9"></div>
+</div>
+
+<div id="containerResults" class="span-10"> RÃ©sultat
+    <br/><br/>
+
+    <div id="containerResult" class="containerResult"></div>
+</div>
+
+<script type="text/javascript">
+    var interface = new InterfaceC();
+</script>
+
+</BODY>
+</HTML>
Index: /ether_2012/web/index.jsp
===================================================================
--- /ether_2012/web/index.jsp	(revision 319)
+++ /ether_2012/web/index.jsp	(revision 319)
@@ -0,0 +1,2 @@
+<%--This redirect is used to allow messages sources in the index page--%>
+<jsp:forward page="visualization?methodName=home"/>
Index: /ether_2012/web/init.jsp
===================================================================
--- /ether_2012/web/init.jsp	(revision 319)
+++ /ether_2012/web/init.jsp	(revision 319)
@@ -0,0 +1,78 @@
+<%@ page import="com.ether.Context" %>
+<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+<html>
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+    <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
+
+    <script src="resources/js/autocomplete/javascript/prototype.js" type="text/javascript"></script>
+    <script src="resources/js/autocomplete/javascript/effects.js" type="text/javascript"></script>
+    <script src="resources/js/autocomplete/javascript/controls.js" type="text/javascript"></script>
+    <link rel="stylesheet" href="resources/css/autocomplete/style.css" type="text/css"/>
+
+
+    <title>Project source</title>
+</head>
+
+<body>
+
+
+<%=Context.getLocale( request )%>
+
+<spring:message code="label.language" htmlEscape="true"/> : <spring:message code="language" htmlEscape="true"/>
+
+<br/><br/>
+
+<spring:message code="text.change.language" htmlEscape="true"/>
+<br/>
+<spring:message code="label.language" htmlEscape="true"/> : <a
+        href="visualization?methodName=home&language=en"><spring:message code="label.language.en"
+                                                                         htmlEscape="true"/></a>
+| <a href="visualization?methodName=home&language=fr"><spring:message code="label.language.fr" htmlEscape="true"/></a>
+
+<hr>
+<h3><spring:message code="titre.init" htmlEscape="true"/></h3>
+<hr>
+
+<table width="100%">
+    <tr>
+        <td>
+            <a href="visualization?methodName=view"><spring:message code="text.visu.href" htmlEscape="true"/></a>
+        </td>
+        <td><spring:message code="text.visu" htmlEscape="true"/></td>
+    </tr>
+
+    <tr>
+        <td>
+            <a href="visualization?methodName=viewAllPlateforms"><spring:message code="text.visu.pf.href"
+                                                                                 htmlEscape="true"/></a>
+        </td>
+        <td><spring:message code="text.visu.pf" htmlEscape="true"/></td>
+    </tr>
+
+</table>
+
+<BR/><BR/>
+<hr>
+<h3>Auto-completion</h3>
+<hr>
+
+<div id="container">
+    <form method="get" action="">
+        <label for="testinput">Search for a country name</label><br/>
+        <input type="text" id="search" name="search" autocomplete="off" class="input" value=""/><br/>
+
+        <div id="update" style="display: none; position:relative;"></div>
+        <input type="image" name="register" class="submit-btn" src="http://www.roscripts.com/images/btn.gif"
+               alt="submit" title="submit"/>
+    </form>
+
+    <script type="text/javascript">
+        new Ajax.Autocompleter( 'search', 'update', 'response.php', { tokens: ','} );
+    </script>
+</div>
+
+</body>
+</html>
Index: /ether_2012/web/log4j.log
===================================================================
--- /ether_2012/web/log4j.log	(revision 319)
+++ /ether_2012/web/log4j.log	(revision 319)
@@ -0,0 +1,666 @@
+LOG4J WARN 2011-06-10 22:15:30,826 - AbstractFacesInitializer - No mappings of FacesServlet found. Abort initializing MyFaces.
+LOG4J INFO 2011-06-10 22:15:31,184 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J INFO 2011-06-10 22:15:31,184 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J DEBUG 2011-06-10 22:15:31,339 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@794322d1 [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:15:31,339 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@794322d1 [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:15:31,358 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@5a1cfb56 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:15:31,358 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@5a1cfb56 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:15:32,574 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:15:32,574 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:15:32,615 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:15:32,615 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:15:32,699 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:15:32,699 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:15:32,699 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:15:32,699 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:15:32,798 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:15:32,798 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:15:32,798 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:15:32,798 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:15:32,819 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:15:32,819 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:15:32,819 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:15:32,819 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:15:32,821 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:15:32,821 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:15:32,821 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:15:32,821 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:15:32,821 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:15:32,821 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:15:32,821 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:15:32,821 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:15:32,821 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:15:32,821 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:15:32,821 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:15:32,821 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:15:32,822 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:15:32,822 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:15:32,822 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:15:32,822 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J WARN 2011-06-10 22:16:10,154 - AbstractFacesInitializer - No mappings of FacesServlet found. Abort initializing MyFaces.
+LOG4J INFO 2011-06-10 22:16:10,487 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J INFO 2011-06-10 22:16:10,487 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J DEBUG 2011-06-10 22:16:10,655 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@37b24706 [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:16:10,655 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@37b24706 [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:16:10,671 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@398f1ef8 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:16:10,671 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@398f1ef8 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:16:11,759 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:16:11,759 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:16:11,797 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:16:11,797 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:16:11,843 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:16:11,843 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:16:11,843 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:16:11,843 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:16:11,950 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:16:11,950 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:16:11,950 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:16:11,950 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:16:11,970 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:16:11,970 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:16:11,970 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:16:11,970 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:16:11,972 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:16:11,972 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:16:11,972 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:16:11,972 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:16:11,972 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:16:11,972 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:16:11,972 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:16:11,972 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:16:11,972 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:16:11,972 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:16:11,972 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:16:11,972 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:16:11,973 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:16:11,973 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:16:11,973 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:16:11,973 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J WARN 2011-06-10 22:17:46,635 - AbstractFacesInitializer - No mappings of FacesServlet found. Abort initializing MyFaces.
+LOG4J INFO 2011-06-10 22:17:47,078 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J INFO 2011-06-10 22:17:47,078 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J DEBUG 2011-06-10 22:17:47,250 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@4810f0a0 [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:17:47,250 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@4810f0a0 [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:17:47,280 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@314585 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:17:47,280 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@314585 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:17:48,523 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:17:48,523 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:17:48,561 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:17:48,561 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:17:48,621 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:17:48,621 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:17:48,622 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:17:48,622 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:17:48,730 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:17:48,730 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:17:48,730 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:17:48,730 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:17:48,754 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:17:48,754 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:17:48,754 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:17:48,754 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:17:48,756 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:17:48,756 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:17:48,757 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:17:48,757 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:17:48,757 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:17:48,757 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:17:48,757 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:17:48,757 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:17:48,757 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:17:48,757 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:17:48,757 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:17:48,757 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:17:48,758 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:17:48,758 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:17:48,758 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:17:48,758 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J ERROR 2011-06-10 22:17:48,977 - ContextLoader - Context initialization failed
+org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'refPlateformDAO' defined in class path resource [dao-context.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [hibernate.cfg.xml]: Invocation of init method failed; nested exception is org.hibernate.PropertyAccessException: Exception occurred inside getter of com.ether.Plateform.id
+	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
+	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1305)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
+	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
+	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)
+	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)
+	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
+	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
+	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
+	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
+	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
+	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
+	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
+	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
+	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
+	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
+	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
+	at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+	at java.lang.reflect.Method.invoke(Method.java:597)
+	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
+	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
+Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [hibernate.cfg.xml]: Invocation of init method failed; nested exception is org.hibernate.PropertyAccessException: Exception occurred inside getter of com.ether.Plateform.id
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1401)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
+	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
+	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
+	... 30 more
+Caused by: org.hibernate.PropertyAccessException: Exception occurred inside getter of com.ether.Plateform.id
+	at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:172)
+	at org.hibernate.engine.UnsavedValueFactory.getUnsavedIdentifierValue(UnsavedValueFactory.java:67)
+	at org.hibernate.tuple.PropertyFactory.buildIdentifierProperty(PropertyFactory.java:67)
+	at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:136)
+	at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:456)
+	at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:131)
+	at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)
+	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:267)
+	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)
+	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:855)
+	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:774)
+	at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1460)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1398)
+	... 37 more
+Caused by: java.lang.reflect.InvocationTargetException
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+	at java.lang.reflect.Method.invoke(Method.java:597)
+	at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:169)
+	... 50 more
+Caused by: java.lang.IllegalStateException: @NotNull method com/ether/Plateform.getId must not return null
+	at com.ether.Plateform.getId(Plateform.java:16)
+	... 55 more
+LOG4J WARN 2011-06-10 22:19:48,175 - AbstractFacesInitializer - No mappings of FacesServlet found. Abort initializing MyFaces.
+LOG4J INFO 2011-06-10 22:19:48,646 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J INFO 2011-06-10 22:19:48,646 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J DEBUG 2011-06-10 22:19:48,813 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@4950b45a [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:19:48,813 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@4950b45a [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:19:48,840 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@4a6f19d5 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:19:48,840 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@4a6f19d5 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:19:50,092 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:19:50,092 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:19:50,133 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:19:50,133 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:19:50,195 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:19:50,195 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:19:50,196 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:19:50,196 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:19:50,308 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:19:50,308 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:19:50,308 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:19:50,308 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:19:50,329 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:19:50,329 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:19:50,329 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:19:50,329 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:19:50,332 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:19:50,332 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:19:50,332 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:19:50,332 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:19:50,332 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:19:50,332 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:19:50,332 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:19:50,332 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:19:50,332 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:19:50,332 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:19:50,332 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:19:50,332 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:19:50,334 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:19:50,334 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:19:50,334 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:19:50,334 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J ERROR 2011-06-10 22:19:50,557 - ContextLoader - Context initialization failed
+org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'refPlateformDAO' defined in class path resource [dao-context.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [hibernate.cfg.xml]: Invocation of init method failed; nested exception is org.hibernate.PropertyAccessException: Exception occurred inside getter of com.ether.Plateform.id
+	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
+	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1305)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
+	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
+	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)
+	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)
+	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
+	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
+	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
+	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
+	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
+	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
+	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
+	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
+	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
+	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
+	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
+	at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+	at java.lang.reflect.Method.invoke(Method.java:597)
+	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
+	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
+Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [hibernate.cfg.xml]: Invocation of init method failed; nested exception is org.hibernate.PropertyAccessException: Exception occurred inside getter of com.ether.Plateform.id
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1401)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
+	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
+	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
+	... 30 more
+Caused by: org.hibernate.PropertyAccessException: Exception occurred inside getter of com.ether.Plateform.id
+	at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:172)
+	at org.hibernate.engine.UnsavedValueFactory.getUnsavedIdentifierValue(UnsavedValueFactory.java:67)
+	at org.hibernate.tuple.PropertyFactory.buildIdentifierProperty(PropertyFactory.java:67)
+	at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:136)
+	at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:456)
+	at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:131)
+	at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)
+	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:267)
+	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)
+	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:855)
+	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:774)
+	at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1460)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1398)
+	... 37 more
+Caused by: java.lang.reflect.InvocationTargetException
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+	at java.lang.reflect.Method.invoke(Method.java:597)
+	at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:169)
+	... 50 more
+Caused by: java.lang.IllegalStateException: @NotNull method com/ether/Plateform.getId must not return null
+	at com.ether.Plateform.getId(Plateform.java:16)
+	... 55 more
+LOG4J WARN 2011-06-10 22:23:04,873 - AbstractFacesInitializer - No mappings of FacesServlet found. Abort initializing MyFaces.
+LOG4J INFO 2011-06-10 22:23:05,362 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J INFO 2011-06-10 22:23:05,362 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J DEBUG 2011-06-10 22:23:05,537 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@396ab2e8 [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:23:05,537 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@396ab2e8 [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:23:05,568 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@24ec42e0 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:23:05,568 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@24ec42e0 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:23:06,807 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:23:06,807 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:23:06,850 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:23:06,850 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:23:06,909 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:23:06,909 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:23:06,909 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:23:06,909 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:23:07,017 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:23:07,017 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:23:07,017 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:23:07,017 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:23:07,038 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:23:07,038 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:23:07,038 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:23:07,038 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:23:07,041 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:23:07,041 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:23:07,041 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:23:07,041 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:23:07,041 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:23:07,041 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:23:07,041 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:23:07,041 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:23:07,041 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:23:07,041 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:23:07,041 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:23:07,041 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:23:07,043 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:23:07,043 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:23:07,043 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:23:07,043 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J ERROR 2011-06-10 22:23:07,266 - ContextLoader - Context initialization failed
+org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'refPlateformDAO' defined in class path resource [dao-context.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [hibernate.cfg.xml]: Invocation of init method failed; nested exception is org.hibernate.PropertyAccessException: Exception occurred inside getter of com.ether.Plateform.id
+	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
+	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1305)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
+	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
+	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)
+	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)
+	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
+	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
+	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
+	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
+	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
+	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
+	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
+	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
+	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
+	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
+	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
+	at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+	at java.lang.reflect.Method.invoke(Method.java:597)
+	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
+	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
+Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [hibernate.cfg.xml]: Invocation of init method failed; nested exception is org.hibernate.PropertyAccessException: Exception occurred inside getter of com.ether.Plateform.id
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1401)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
+	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
+	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
+	... 30 more
+Caused by: org.hibernate.PropertyAccessException: Exception occurred inside getter of com.ether.Plateform.id
+	at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:172)
+	at org.hibernate.engine.UnsavedValueFactory.getUnsavedIdentifierValue(UnsavedValueFactory.java:67)
+	at org.hibernate.tuple.PropertyFactory.buildIdentifierProperty(PropertyFactory.java:67)
+	at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:136)
+	at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:456)
+	at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:131)
+	at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)
+	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:267)
+	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)
+	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:855)
+	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:774)
+	at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1460)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1398)
+	... 37 more
+Caused by: java.lang.reflect.InvocationTargetException
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+	at java.lang.reflect.Method.invoke(Method.java:597)
+	at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:169)
+	... 50 more
+Caused by: java.lang.IllegalStateException: @NotNull method com/ether/Plateform.getId must not return null
+	at com.ether.Plateform.getId(Plateform.java:16)
+	... 55 more
+LOG4J WARN 2011-06-10 22:26:07,922 - AbstractFacesInitializer - No mappings of FacesServlet found. Abort initializing MyFaces.
+LOG4J INFO 2011-06-10 22:26:08,384 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J INFO 2011-06-10 22:26:08,384 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J DEBUG 2011-06-10 22:26:08,558 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@203c9616 [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:26:08,558 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@203c9616 [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:26:08,589 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@20773d03 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:26:08,589 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@20773d03 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:26:09,822 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:26:09,822 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:26:09,856 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:26:09,856 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:26:09,912 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:26:09,912 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:26:09,912 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:26:09,912 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:26:10,016 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:26:10,016 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:26:10,017 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:26:10,017 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:26:10,036 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:26:10,036 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:26:10,036 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:26:10,036 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:26:10,039 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:26:10,039 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:26:10,039 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:26:10,039 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:26:10,039 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:26:10,039 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:26:10,039 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:26:10,039 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:26:10,039 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:26:10,039 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:26:10,039 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:26:10,039 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:26:10,041 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:26:10,041 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:26:10,041 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:26:10,041 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J WARN 2011-06-10 22:26:50,390 - AbstractFacesInitializer - No mappings of FacesServlet found. Abort initializing MyFaces.
+LOG4J INFO 2011-06-10 22:26:50,851 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J INFO 2011-06-10 22:26:50,851 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J DEBUG 2011-06-10 22:26:51,024 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@4950b45a [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:26:51,024 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@4950b45a [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:26:51,053 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@4a6f19d5 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:26:51,053 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@4a6f19d5 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:26:52,144 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:26:52,144 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:26:52,179 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:26:52,179 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:26:52,239 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:26:52,239 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:26:52,239 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:26:52,239 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:26:52,346 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:26:52,346 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:26:52,346 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:26:52,346 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:26:52,366 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:26:52,366 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:26:52,366 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:26:52,366 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:26:52,369 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:26:52,369 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:26:52,369 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:26:52,369 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:26:52,369 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:26:52,369 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:26:52,369 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:26:52,369 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:26:52,369 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:26:52,369 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:26:52,369 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:26:52,369 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:26:52,371 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:26:52,371 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:26:52,371 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:26:52,371 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J ERROR 2011-06-10 22:26:52,600 - ContextLoader - Context initialization failed
+org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'refPlateformDAO' defined in class path resource [dao-context.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [hibernate.cfg.xml]: Invocation of init method failed; nested exception is org.hibernate.PropertyAccessException: Exception occurred inside getter of com.ether.Plateform.id
+	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
+	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1305)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
+	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
+	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)
+	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)
+	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
+	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
+	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
+	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
+	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
+	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
+	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
+	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
+	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
+	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
+	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
+	at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+	at java.lang.reflect.Method.invoke(Method.java:597)
+	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
+	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
+Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [hibernate.cfg.xml]: Invocation of init method failed; nested exception is org.hibernate.PropertyAccessException: Exception occurred inside getter of com.ether.Plateform.id
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1401)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
+	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
+	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
+	... 30 more
+Caused by: org.hibernate.PropertyAccessException: Exception occurred inside getter of com.ether.Plateform.id
+	at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:172)
+	at org.hibernate.engine.UnsavedValueFactory.getUnsavedIdentifierValue(UnsavedValueFactory.java:67)
+	at org.hibernate.tuple.PropertyFactory.buildIdentifierProperty(PropertyFactory.java:67)
+	at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:136)
+	at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:456)
+	at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:131)
+	at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)
+	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:267)
+	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)
+	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:855)
+	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:774)
+	at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1460)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1398)
+	... 37 more
+Caused by: java.lang.reflect.InvocationTargetException
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+	at java.lang.reflect.Method.invoke(Method.java:597)
+	at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:169)
+	... 50 more
+Caused by: java.lang.IllegalStateException: @NotNull method com/ether/Plateform.getId must not return null
+	at com.ether.Plateform.getId(Plateform.java:16)
+	... 55 more
+LOG4J WARN 2011-06-10 22:27:22,673 - AbstractFacesInitializer - No mappings of FacesServlet found. Abort initializing MyFaces.
+LOG4J INFO 2011-06-10 22:27:23,111 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J INFO 2011-06-10 22:27:23,111 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J DEBUG 2011-06-10 22:27:23,290 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@396ab2e8 [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:27:23,290 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@396ab2e8 [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:27:23,321 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@24ec42e0 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:27:23,321 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@24ec42e0 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:27:24,556 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:27:24,556 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:27:24,594 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:27:24,594 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:27:24,656 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:27:24,656 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:27:24,657 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:27:24,657 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:27:24,765 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:27:24,765 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:27:24,765 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:27:24,765 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:27:24,785 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:27:24,785 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:27:24,785 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:27:24,785 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:27:24,788 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:27:24,788 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:27:24,788 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:27:24,788 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:27:24,788 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:27:24,788 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:27:24,788 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:27:24,788 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:27:24,788 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:27:24,788 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:27:24,788 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:27:24,788 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:27:24,790 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:27:24,790 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:27:24,790 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:27:24,790 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J WARN 2011-06-10 22:29:48,016 - AbstractFacesInitializer - No mappings of FacesServlet found. Abort initializing MyFaces.
+LOG4J INFO 2011-06-10 22:29:48,463 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J INFO 2011-06-10 22:29:48,463 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J DEBUG 2011-06-10 22:29:48,634 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@2a47b35d [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:29:48,634 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@2a47b35d [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:29:48,663 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@77bdbf9d [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:29:48,663 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@77bdbf9d [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:29:49,761 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:29:49,761 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:29:49,796 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:29:49,796 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:29:49,855 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:29:49,855 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:29:49,856 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:29:49,856 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:29:49,964 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:29:49,964 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:29:49,964 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:29:49,964 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:29:49,985 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:29:49,985 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:29:49,985 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:29:49,985 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:29:49,988 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:29:49,988 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:29:49,988 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:29:49,988 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:29:49,988 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:29:49,988 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:29:49,988 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:29:49,988 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:29:49,988 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:29:49,988 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:29:49,988 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:29:49,988 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:29:49,989 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:29:49,989 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:29:49,990 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:29:49,990 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J WARN 2011-06-10 22:37:29,821 - AbstractFacesInitializer - No mappings of FacesServlet found. Abort initializing MyFaces.
+LOG4J INFO 2011-06-10 22:37:30,322 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J INFO 2011-06-10 22:37:30,322 - Version - Hibernate Annotations 3.2.0.GA
+LOG4J DEBUG 2011-06-10 22:37:30,491 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@6dabcd9b [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:37:30,491 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@6dabcd9b [Attribute: name resource value "com/ether/dao/Plateform.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:37:30,518 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@48da5bc0 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:37:30,518 - AnnotationConfiguration - null<-org.dom4j.tree.DefaultAttribute@48da5bc0 [Attribute: name resource value "com/ether/dao/Parameter.hbm.xml"]
+LOG4J DEBUG 2011-06-10 22:37:32,305 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:37:32,305 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:37:32,341 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:37:32,341 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:37:32,402 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:37:32,402 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:37:32,402 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:37:32,402 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:37:32,509 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:37:32,509 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:37:32,509 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:37:32,509 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:37:32,529 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:37:32,529 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:37:32,529 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:37:32,529 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:37:32,532 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:37:32,532 - AnnotationConfiguration - Execute first pass mapping processing
+LOG4J DEBUG 2011-06-10 22:37:32,532 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:37:32,532 - AnnotationConfiguration - Process hbm files
+LOG4J DEBUG 2011-06-10 22:37:32,532 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:37:32,532 - AnnotationConfiguration - Process annotated classes
+LOG4J DEBUG 2011-06-10 22:37:32,532 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J DEBUG 2011-06-10 22:37:32,532 - AnnotationConfiguration - processing manytoone fk mappings
+LOG4J TRACE 2011-06-10 22:37:32,532 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:37:32,532 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:37:32,532 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:37:32,532 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J TRACE 2011-06-10 22:37:32,534 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J TRACE 2011-06-10 22:37:32,534 - ClassValidator - ResourceBundle ValidatorMessages not found in thread context classloader
+LOG4J DEBUG 2011-06-10 22:37:32,534 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
+LOG4J DEBUG 2011-06-10 22:37:32,534 - ClassValidator - ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to org.hibernate.validator.resources.DefaultValidatorMessages
Index: /ether_2012/web/resources/css/autocomplete/style.css
===================================================================
--- /ether_2012/web/resources/css/autocomplete/style.css	(revision 319)
+++ /ether_2012/web/resources/css/autocomplete/style.css	(revision 319)
@@ -0,0 +1,104 @@
+label
+{
+	font-size: 0.7em;
+	font-family:arial;
+	float:left;
+}
+.input {
+	border: 1px solid #99b3b4;
+	width: 300px;
+	background: #e4ebeb;
+	font: 11px verdana, sans-serif;
+	color:#443;
+	padding:3px;
+	margin-bottom:4px;
+	outline:none;
+}
+.input:focus {
+	border:1px solid #567475;
+	background: #e4ebeb;
+}
+.submit-btn {
+	width: 54px;
+	height: 20px;
+	background: #743 url(http://www.roscripts.com/images/submit.gif) no-repeat;
+	outline: none;
+	float:right;
+}
+.submit-btn:hover {
+	background: #069 url(http://www.roscripts.com/images/submit.gif) no-repeat 0 -20px;
+}
+div#container {
+	border:1px solid #99b3b4;
+	padding:15px;
+	margin:50px auto;
+	width:300px;
+}
+.entry ul {
+	list-style:none;
+	margin:0px;
+	padding:0px;
+	display:block;
+}
+.entry li {
+	display:block;
+	margin:0px;
+}
+.entry li a {
+	outline: none;
+	background-color: #fbfbf9;
+	text-decoration:none;
+	display:block;
+	padding:10px 0 10px 15px;
+	border-bottom:1px solid #f2f2f2;
+	font:bold 75% arial,helvetica,sans-serif;
+	color:#999;
+}
+.entry li a:hover {
+	background:url(../images/go_partner.gif) 645px 25px no-repeat #fff;
+	border-bottom:1px solid #ccc;
+	color:#336699;		
+}
+.entry ul a em {
+	display:block;
+	color:#808080;
+	font-size:90%;
+	padding-right:30px;
+	font-style:normal;
+	font-weight:normal;
+}
+.entry span {
+	display:block;
+	color:#a8a8a8;
+	font-size:0.8em;
+	font-style:normal;
+	font-weight:normal;
+	padding-right:10px;
+}
+.entry a:hover span {
+	color:#800;
+}
+
+div#update {
+      position:absolute;
+      width:250px;
+      background-color:white;
+      color: black;
+      border:1px solid #888;
+      margin:0px;
+      padding:0px;
+}
+div#update ul {
+      list-style-type:none;
+      margin:0px;
+      padding:0px;
+}
+div#update ul li.selected { background-color: #ffb;}
+div#update ul li {
+      list-style-type:none;
+      display:block;
+      margin:0;
+      padding:2px;
+      height:22px;
+      cursor:pointer;
+}
Index: /ether_2012/web/resources/css/blueprint-css/.gitignore
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/.gitignore	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/.gitignore	(revision 319)
@@ -0,0 +1,5 @@
+*.swp
+*.svn
+*.DS_Store
+tmp/*
+lib/settings.yml
Index: /ether_2012/web/resources/css/blueprint-css/AUTHORS.textile
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/AUTHORS.textile	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/AUTHORS.textile	(revision 319)
@@ -0,0 +1,43 @@
+h1. Blueprint CSS Framework Authors and Contributors
+
+Blueprint is based on the work of many talented people. It is
+through their good intentions we are allowed to use many of the
+techniques found in the framework.
+
+h2. Current Team
+
+Blueprint was realized and maintained through version 0.7.1 by
+"Olav Bjorkoy":http://bjorkoy.com who has sinced passed the torch
+to the current team. They are:
+
+Admins:
+* "Christian Montoya":http://christianmontoya.net
+* "Josh Clayton":http://jdclayton.com
+
+Contributors:
+* "Franz Josef Kaiser":http://github.com/franz-josef-kaiser
+* "Glenn Rempe":http://www.rempe.us/
+* "Chris Eppstein":http://chriseppstein.github.com/
+* "Sean K. Stewart":http://seankstewart.com/
+
+h2. Original CSS authors
+
+The first iteration of Blueprint was built upon many conventions
+and ideas that were developed by true CSS experts.
+
+The grid and typography is based on work by:
+* "Jeff Croft":http://jeffcroft.com
+* "Nathan Borror":http://nathanborror.com/
+* "Christian Metts":http://mintchaos.com
+* "Wilson Miner":http://www.wilsonminer.com
+
+The CSS reset is based on work by:
+* "Eric Meyer":http://www.meyerweb.com/eric
+
+The Fancy Type plugin is based on work by:
+* "Mark Boulton":http://www.markboulton.co.uk
+* "Typogrify":http://typogrify.googlecode.com
+
+(However, remember that these people are not involved with the
+framework, so please don't waste their time or yours by asking 
+them for support.)
Index: /ether_2012/web/resources/css/blueprint-css/CHANGELOG
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/CHANGELOG	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/CHANGELOG	(revision 319)
@@ -0,0 +1,168 @@
+Blueprint CSS Framework Change Log
+----------------------------------------------------------------
+
+Version 1.0 - Date September 29, 2010
+--
+  New features:
+    * Added detailed explanations to core uncompressed CSS files [CMM]
+    * Added .info and .alert classes to forms.css [CMM]
+    * Fixed numerous bugs in forms, including the fieldset padding bug in IE6-8 [CMM]
+    * Fixed specificity problems in typography.css and grid.css [CMM]
+    * See Lighthouse for more bug fixes 
+
+Version 0.9 - Date May 29, 2009
+--
+  New features:
+    * Changed all conditional comments to [if lt IE 8] for IE 8 compatibility [CMM]
+    * Updated forms code to align inline form elements, with additions for IE 6 [CMM]
+      * Use <form class="inline"> for inline forms
+      * Use classes "text", "button", "radio" and "checkbox" on inputs for IE 6 compatibility
+
+
+Version 0.8 - Date November 11, 2008
+--
+  New features:
+    * Much of the flexibility of 0.6 has been pushed back into the core [CMM]
+    * Plugins from 0.6 are now back in the core [CMM]
+
+  Bug fixes:
+    * Lots. See http://blueprintcss.lighthouseapp.com/projects/15318-blueprint-css
+
+
+Version 0.7.1 - Date February 21, 2008
+--
+  New features:
+    * Rubydoc for compressor [JC]
+
+  Bug fixes:
+    * Fixed bug in the compressor related to Rubygems. [JC]
+    * <tt> should be inline, not block. [OFB]
+
+
+Version 0.7 - February 19, 2008
+--
+  New features:
+    * New directory structure. [OFB]
+    * New compressor script. [JC]
+      * Ability to set custom namespace for BP classes. [JC]
+      * Optional custom column count and widths. [JC]
+      * Ability to add your own CSS files. [JC]
+      * Custom output paths. [JC]
+      * Support for multiple projects. [JC]
+      * Semantic class naming from CSS rules. [JC]
+      * Automatic compression for plugins. [JC]
+    * Compressed version of ie.css. [OFB]
+    * Alternating table row colors. [OFB]
+    * Added class .showgrid to see the grid of any column or container. [OFB]
+    * No need for .column! You now have to use divs for columns,
+      but you can still use span/prepend/append for other elements as well.
+      In other words, div.span-x now implies that the element is a .column. [OFB]
+
+  Bug fixes:
+    * Sidebar alignment in tests/sample.html. [OFB]
+    * Line-height on sub/sup. [OFB]
+    * Clearfix not properly applied to container. [OFB]
+    * Misc validation errors in tests. [OFB]
+    * Proper margin on address. [OFB]
+    * Unwanted bottom margin on nested lists. [OFB]
+    * Form labels with unwanted fancy-type indentation. [OFB]
+    * Proper margin on all form elements. [OFB]
+    * No margins for images in headings. [OFB]
+    * Push-x bottom margin. [OFB]
+    * Vertical align set to middle on tables. [OFB]
+    * Improved .notice, .error and .success color contrast. [OFB]
+    * Size of input[text]. [OFB]
+    * Baseline alignment of <h4>. [OFB]
+
+  Misc:
+    * Improved structure in print.css. [OFB]
+    * Dual-licensed under MIT and GPL licenses. [OFB]
+    * Changed name of .clear to .clearfix, and added .clear (clear:both;). [OFB]
+
+
+Version 0.6 - September 21, 2007
+--
+  * Created a new plugin, "iepngfix", that adds support for PNG transparency in IE5.5+ [OFB]
+  * Added an IE stylesheet, updated the test files and the readme accordingly [OFB]
+  * Re-added improved support for em units [OFB]
+  * Lots of minor changes to typography.css and reset.css, provided by Christian Montoya [OFB]
+  * Extracted the fancy typography section in typography.css to a new plugin [OFB]
+  * Extracted the support for CSS buttons into a new plugin. [OFB]
+  * Added new plugin structure. [OFB]
+  * Changed some default fonts so that BP works better with ClearType in XP [OFB]
+  * Re-added the hack for clearing floats without extra markup. [OFB]
+  * Added Changelog.txt to track changes in each release. [GR]
+  * Cleaned up and rationalized SVN dir structure. [GR, OFB]
+  * print.css : removed reference to 'baseline.png' as it no longer exists. [GR]
+  * grid.css : removed reference to '.first' css class as it no longer exists. [GR]
+  * Added append-13 to append-23 and prepend-13 to prepend-23 to allow pushing elements
+    to both extreme sides of the grid. Added test cases to tests/grid.css [GR]
+  * Moved test sample files to blueprint/tests sub-directory so tests stay with the code. [GR]
+  * Consolidated all references to release version number to screen.css [OFB]
+  * Added ruby script (generate_compressed_css.rb) to scripts dir, and 'csstidy' binary (OS X Universal)
+    for generating tidied version of Blueprint (lib/compressed.css).
+  * Consolidated test pages into one single page (test.html).  Uses compressed stylesheet by default.  This ensures test of
+    the chain of generation.  (todo) Intention is to delete other test files if single file works well. (todo) ensure singular
+    test file contains latest changes to other test files.   [GR]
+  * Moved the blueprint framework to its own folder in the package, so that the tests, script,
+    license and readme don't clutter up our BP folder. [OFB]
+  * Re-saved grid.png with Photoshop to remove Fireworks data which was bloating it.
+    Now its about 3KB instead of 40+KB. Resolves Issue 22. [GR]
+  * Moved compressed files to new compressed dir [OFB]
+  * print.css is now also being generated by the compressor ruby script and is available for use.
+  * Added new script 'validate_css.rb' which will validate all css files and present a report with
+    a local java binary of the W3C validator.
+  * Created an experimental CSS classes plugin, by popular demand. [OFB]
+  * Improved handling of multi-line headings. [OFB]
+  * Improved styling of <table>s, you may now use .span classes on <th>s to create tables that follow the grid. [OFB]
+  * Added support for indented paragraphs to the Fancy-type plugin. [OFB]
+  * Added a new plugin: link-icons. [OFB]
+  * Seperated the plugins tests into their own file. [OFB]
+  * Re-structured some of the tests.html sections. [OFB]
+  * Added class ".colborder" to grid.css. [OFB]
+  * Added .error, .notice and .success classes to typography.css. [OFB]
+  * Added tests for more elements which gets reset in reset.css [OFB, GR]
+  * Added forms.css, awaiting implementation. Moved form styling from typography.css [OFB]
+  * Updated compressor script to include forms.css [OFB]
+  * Improved forms.html tests for upcoming forms.css implementation. This will change based on the
+    markup that forms.css will use. [OFB]
+  * Fixed clearing image in button element bug in buttons.css [OFB]
+  * Fixed bug where IE6 clips pushed/pulled elements. [OFB]
+  * Fixed typo in grid.css formula. [OFB]
+  * Fixed varying formatting across core files. [OFB]
+  * Fixed legend element in IE6. [OFB]
+  * Fixed indentation in test files. [OFB]
+  * Removed tests for plugins not bundled with the next release. [OFB]
+  * Improved styling of <h3>. [OFB]
+  * Fixed indentation bug in ul/ol, removed some redundant styling. [OFB]
+  * Fixed validation errors in tests. [OFB]
+  * Changed IE stylesheet condition comment to include all versions of IE. [OFB]
+  * Started on a new approach for the PNG plugin. Will not be included in this release. [OFB]
+  * Fixed incorrect rendering of ol in IE6/7. [OFB]
+  * Created a new, spiffier sample page. [OFB]
+
+
+Version 0.5 - August 28, 2007
+--
+  * Changed grid width from 14 to 24 columns [OFB]
+  * Removed 'first' CSS class and the need to apply it to the first column in a row of columns. [OFB]
+  * Reverted to using pixels instead of em units to specify vertical spacing due to baseline issues with
+    all browsers except Firefox. [OFB]
+  * New set of default fonts. (Experimental) [OFB]
+  * Added test files [OFB]
+
+
+Version 0.4 - August 11, 2007
+--
+  * All font sizes and vertical margins are now elastic, through the use of em units.
+    Resizing works great in every tested browser. [OFB]
+  * Comes with a new, compressed version of BP, which reduces the size of the core files by 60 percent. [OFB]
+  * Support for incremental leading, contributed by Mark Boulton. [OFB]
+  * Adds perfected CSS buttons, by Kevin Hale of Particletree fame. [OFB]
+  * Fixes all known IE bugs. [OFB]
+  * Loads of minor fixes and additions. [OFB]
+
+
+Version 0.3 - March 8, 2007
+--
+  * Initial release of Blueprint (versions 0.1 and 0.2 were internal only).
Index: /ether_2012/web/resources/css/blueprint-css/LICENSE
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/LICENSE	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/LICENSE	(revision 319)
@@ -0,0 +1,22 @@
+Copyright (c) 2007 - 2010 blueprintcss.org
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
Index: /ether_2012/web/resources/css/blueprint-css/README.textile
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/README.textile	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/README.textile	(revision 319)
@@ -0,0 +1,83 @@
+h1. Blueprint CSS Framework Readme
+
+Welcome to Blueprint! This is a CSS framework designed to cut down on your CSS development time. It gives you a solid foundation to build your own CSS on. Here are some of the features BP provides out-of-the-box:
+
+* An easily customizable grid
+* Sensible default typography
+* A typographic baseline
+* Perfected browser CSS reset
+* A stylesheet for printing
+* Powerful scripts for customization
+* Absolutely no bloat!
+
+h2. Project Info
+
+* *Web*: "http://blueprintcss.org":http://blueprintcss.org
+* *Source*: "http://github.com/joshuaclayton/blueprint-css":http://github.com/joshuaclayton/blueprint-css
+* *Wiki*: "http://github.com/joshuaclayton/blueprint-css/wikis/home":http://github.com/joshuaclayton/blueprint-css/wikis/home
+* *Bug/Feature Tracking*: "http://blueprintcss.lighthouseapp.com":http://blueprintcss.lighthouseapp.com
+
+h2. Setup Instructions
+
+Here's how you set up Blueprint on your site.
+
+# Upload the "blueprint" folder in this folder to your server, and place it in whatever folder you'd like. A good choice would be your CSS folder.
+# Add the following three lines to every @<head/>@ of your site. Make sure the three @href@ paths are correct (here, BP is in my CSS folder): <pre><code>
+<link rel="stylesheet" href="css/blueprint/screen.css" type="text/css" media="screen, projection">
+<link rel="stylesheet" href="css/blueprint/print.css" type="text/css" media="print">
+<!--[if lt IE 8]>
+  <link rel="stylesheet" href="css/blueprint/ie.css" type="text/css" media="screen, projection">
+<![endif]--></code></pre>
+Remember to include trailing slashes (" />") in these lines if you're using XHTML.
+# For development, add the .showgrid class to any container or column to see the underlying grid. Check out the @plugins@ directory for more advanced functionality.
+
+
+h2. Tutorials
+
+* "How to customize BP with the compressor script":http://jdclayton.com/blueprints_compress_a_walkthrough.html
+* "How to use a grid in a layout":http://subtraction.com/2007/03/18/oh-yeeaahh
+* "How to use a baseline in your typography":http://alistapart.com/articles/settingtypeontheweb
+
+h2. Files in Blueprint
+
+The framework has a few files you should check out. Every file in the @src@ directory contains lots of (hopefully) clarifying comments.
+
+Compressed files (these go in the HTML):
+
+* @blueprint/screen.css@
+* @blueprint/print.css@
+* @blueprint/ie.css@
+
+Source files:
+* @blueprint/src/reset.css@<br/>
+This file resets CSS values that browsers tend to set for you.
+* @blueprint/src/grid.css@<br/>
+This file sets up the grid (it's true). It has a lot of classes you apply to @<div/>@ elements to set up any sort of column-based grid.
+* @blueprint/lib/blueprint/grid.css.erb@<br/>
+This file is used by the compressor (see below) when generating grids. All changes to grid.css are mirrored in this file, manually. 
+* @blueprint/src/typography.css@<br/>
+This file sets some default typography. It also has a few methods for some really fancy stuff to do with your text.
+* @blueprint/src/forms.css@<br/>
+Includes some minimal styling of forms.
+* @blueprint/src/print.css@<br/>
+This file sets some default print rules, so that printed versions of your site looks better than they usually would. It should be included on every page.
+* @blueprint/src/ie.css@<br/>
+Includes every hack for our beloved IE6 and 7.
+
+Scripts:
+* @lib/compress.rb@<br/>
+A Ruby script for compressing and customizing your CSS. Set a custom namespace, column count, widths, output paths, multiple projects, and semantic class names. See commenting in @compress.rb@ or run @$ruby compress.rb -h@ for more information.
+* @lib/validate.rb@<br/>
+Validates the Blueprint core files with the W3C CSS validator.
+
+Other:
+* @blueprint/plugins/@<br/>
+Contains additional functionality in the form of simple plugins for Blueprint. See individual readme files in the directory of each plugin for further instructions.
+* @tests/@<br/>
+Contains html files which tests most aspects of Blueprint. Open @tests/index.html@ for further instructions.
+
+h2. Extra Information
+
+* For credits and origins, see AUTHORS.
+* For license instructions, see LICENSE.
+* For the latest updates, see CHANGELOG.
Index: /ether_2012/web/resources/css/blueprint-css/TUTORIAL.textile
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/TUTORIAL.textile	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/TUTORIAL.textile	(revision 319)
@@ -0,0 +1,206 @@
+h1. Blueprint CSS Framework Tutorial
+
+Welcome to this tutorial on Blueprint. It will give you a thorough intro to what you can do with the framework, and a few notes on what you shouldn't do with it. Let's get started.
+
+h2. About Blueprint
+  
+Blueprint is a CSS framework, designed to cut down on your development time. It gives you a solid foundation to build your CSS on top of, including some sensible default typography, a customizable grid, a print stylesheet and much more.
+
+However, BP is not a silver bullet, and it's best suited for websites where each page may require its own design. Take a look at existing BP pages before deciding if the framework is right for you. You may also check out the test files in the @tests@ directory, which demonstrates most of the features in Blueprint.
+
+The word "framework" may be a bit misleading in this context, since BP does not make suggestions on how you should organize or write your CSS. It's more like a "css toolbox" with helpful bits and pieces, from which you may pick and choose based on your needs. 
+
+h2. Structural Overview
+		
+From the bottom up, here are the CSS layers in Blueprint:
+
+#	*CSS reset*: Removes any default CSS rules set by each browser.
+#	*Typography*: Gives you some nice default typography and colors.
+#	*Grid*: Provides a set of CSS classes for making grid layouts.
+
+The second part of Blueprint are the scripts, which let you customize most
+aspects of the framework, from column count and widths, to output paths and
+CSS class namespaces. We have two scripts:
+
+# *Compressor*: For compressing and customizing the source files.
+# *Validator*: 	For validating the Blueprint core files.
+
+That's the quick overview, so now we can finally get into the details. First, we'll take 
+a look at the CSS in Blueprint. We'll then move on to the scripts, where I'll show you 
+how to customize the framework.
+
+h2. Setting Up Blueprint
+
+To use Blueprint, you must include three files in your HTML:
+
+* @blueprint/screen.css@:	All CSS for screen, projection viewing.
+* @blueprint/print.css@: A basic stylesheet for printing.
+* @blueprint/ie.css@:	A few needed corrections for Internet Explorer
+
+To include them, use the following HTML (make sure the href paths are correct):
+<pre><code>
+  <link rel="stylesheet" href="css/blueprint/screen.css" type="text/css" media="screen, projection">
+  <link rel="stylesheet" href="css/blueprint/print.css" type="text/css" media="print"> 
+  <!--[if lt IE 8]>
+    <link rel="stylesheet" href="css/blueprint/ie.css" type="text/css" media="screen, projection">
+  <![endif]-->
+</code></pre>
+Remember to add trailing slashes if you're using XHTML (" />"). 
+
+h2. Using the CSS in Blueprint
+
+As mentioned before, there's basically three layers of CSS in Blueprint. The first two layers, the browser CSS reset and the default typography, apply themselves by changing the CSS of standard HTML elements. In other words, you don't need to change anything in these files. If you, for instance, want to change the font size, do this in your own stylesheet, so that it's easy to upgrade Blueprint when new versions arrive.
+
+h3. Classes for Typography
+	
+While the typography of Blueprint mainly applies itself, there's a few classes
+provided. Here's a list of their names and what they do:
+
+<dl>
+  <dt>@.small@</dt><dd>Makes the text of this element smaller.</dd>
+  <dt>@.large@</dt><dd>Makes the text of this element larger.</dd>
+  <dt>@.hide@</dt><dd>Hides an element.</dd>
+  <dt>@.quiet@</dt><dd>Tones down the font color for this element.</dd>
+  <dt>@.loud@</dt><dd>Makes this elements text black.</dd>
+  <dt>@.highlight@</dt><dd>Adds a yellow background to the text.</dd>
+  <dt>@.added@</dt><dd>Adds green background to the text.</dd>
+  <dt>@.removed@</dt><dd>Adds red background to the text.</dd>
+  <dt>@.first@</dt><dd>Removes any left sided margin/padding from the element.</dd>
+  <dt>@.last@</dt><dd>Removes any right sided margin/padding from the element.</dd>
+  <dt>@.top@</dt><dd>Removes any top margin/padding from the element.</dd>
+  <dt>@.bottom@</dt><dd>Removes any bottom margin/padding from the element.</dd>
+</dl>
+
+h3. Styling Forms
+				
+To make Blueprint style your input elements, each text input element should
+have the class @.text@, or @.title@, where @.text@ is the normal size,
+and @.title@ gives you an input field with larger text.
+
+There's also a few classes you may use for success and error messages:
+
+<dl>
+	<dt>@div.error@</dt><dd>Creates an error box (red).</dd>
+	<dt>@div.notice@</dt><dd>Creates a box for notices (yellow).</dd>
+	<dt>@div.success@</dt><dd>Creates a box for success messages (green).</dd>
+</dl>				
+
+h3. Creating a Grid
+
+The third layer is the grid CSS classes, which is the tool Blueprint gives you to create almost any kind of grid layout for your site. Keep in mind that most of the CSS behind the grid can be customized (explained below). In this section however, I'm using the default settings.
+
+The default grid is made up of 24 columns, each spanning 30px, with a 10px margin between each column. The total width comes to 950px, which is a good width for 1024x768 resolution displays. If you're interested in a narrower design, see the section on customizing the grid, below.
+
+So how do you set up a grid? By using classes provided by Blueprint. To create a column, make a new @<div/>@, and apply one of the @.span-x@ classes to it. For instance, if you want a 3-column setup, with two narrow and one wide column, a header and a footer here's how you do it:
+
+<pre>			
+  <div class="container">
+  	<div class="span-24">
+  		The header
+  	</div>
+
+  	<div class="span-4">
+  		The first column
+  	</div>
+  	<div class="span-16">
+  		The center column
+  	</div>
+  	<div class="span-4 last">
+  		The last column
+  	</div>
+	
+  	<div class="span-24">
+  		The footer
+  	</div>
+  </div>
+</pre>
+  			
+In addition to the spans, there are two important classes you need to know about. First of all, every Blueprint site needs to be wrapped in a div with the class @.container@, which is usually placed right after the body tag. 
+
+Second, the last column in a row (which by default has 24 columns), needs the class @.last@ to remove its left hand margin. Note, however, that each @.span-24@ don't need the @.last@ class, since these always span the entire width of the page.
+
+To create basic grids, this is all you need to know. The grid CSS however, provides many more classes for more intricate designs. To see some of them in action, check out the files in @tests/parts/@. These files demonstrate what's possible with the grid in Blueprint.
+
+Here's a quick overview of the other classes you can use in to make your grid:
+
+<dl>
+  <dt>@.append-x@</dt><dd>Appends x number of empty columns after a column.</dd>
+  <dt>@.prepend-x@</dt><dd>Preppends x number of empty columns before a column.</dd>
+  <dt>@.push-x@</dt><dd>Pushes a column x columns to the left. Can be used to swap columns.</dd>
+  <dt>@.pull-x@</dt><dd>Pulls a column x columns to the right. Can be used to swap columns.</dd>
+  <dt>@.border@</dt><dd>Applies a border to the right side of the column.</dd>
+  <dt>@.colborder@</dt><dd>Appends one empty column, with a border down the middle.</dd>
+  <dt>@.clear@</dt><dd>Makes a column drop below a row, regardless of space.</dd>
+	<dt>@.showgrid@</dt><dd>Add to container or column to see the grid and baseline.</dd>
+</dl>
+
+In this list, @x@ is a number from 1 through 23 for append/prepend and 1 through 24 for push/pull. These numbers will of course change if you set a new number of columns in the settings file. 
+
+Here's another example where we have four columns of equal width, with a border between the two first and the two last columns, as well as a four column gap in the middle:
+
+<pre>				
+	<div class="container">
+		<div class="span-5 border">
+			The first column
+		</div>
+		<div class="span-5 append-4">
+			The second column
+		</div>
+		<div class="span-5 border">
+			The third column
+		</div>
+		<div class="span-5 last">
+			The fourth (last) column
+		</div>
+	</div>
+</pre>				
+
+You may also nest columns to achieve the desired layout. Here's a setup where we want four rectangles with two on top and two below on the first half of the page, and one single column spanning the second half of the page:
+
+<pre>				
+	<div class="container">
+		<div class="span-12">
+			<div class="span-6">
+				Top left
+			</div>
+			<div class="span-6 last">
+				Top right
+			</div>
+			<div class="span-6">
+				Bottom left
+			</div>
+			<div class="span-6 last">
+				Bottom right
+			</div>
+		</div>
+		<div class="span-12 last">
+			Second half of page
+		</div>
+	</div>
+</pre>
+
+Try this code in your browser it it's difficult to understand what it would look like. To see more examples on how to use these classes, check out @/tests/parts/grid.html@.
+
+h2. The Scripts
+	
+Blueprint comes with two scripts: one for compressing and customizing the CSS, and one for validating the core CSS files, which is handy if you're making changes to these files.
+
+h3. The Validator
+				
+The validator has a fairly simple job - validate the CSS in the core BP files.  The script uses a bundled version of the W3C CSS validator to accomplish this.  To run it, you'll need to have Ruby installed on your machine. You can then run the script like so: @$ ruby validate.rb@.
+
+Note that there are a few validation errors shipping with Blueprint. These are known, and comes from a few CSS hacks needed to ensure consistent rendering across the vast browser field.
+		
+h3. The Compressor
+		
+As the files you'll include in your HTML are the compressed versions of the core CSS files, you'll have to recompress the core if you've made any changes.  This is what the compressor script is for.
+
+In addition this is where you customize the grid. To customize the grid, a special settings file is used, and the new CSS is generated once you run the compressor. The new compressed files will then reflect your settings file.
+
+To recompress, you just have to run the script. This will parse the core CSS files and output new compressed files in the blueprint folder. As with the validator, Ruby has to be installed to use this script. In the @lib@ directory, run: @$ruby compress.rb@
+
+Calling this file by itself will pull files from @blueprint/src@ and concatenate them into three files; @ie.css@, @print.css@, and @screen.css@. However, argument variables can be set to change how this works. Calling @$ruby compress.rb -h@ will reveal basic arguments you can pass to the script.
+		
+h3. Custom Settings
+
+To learn how to use custom settings, read through the documentation within @lib/compress.rb@
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/ie.css
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/ie.css	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/ie.css	(revision 319)
@@ -0,0 +1,36 @@
+/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0
+ http://blueprintcss.org
+
+   * Copyright (c) 2007-Present. See LICENSE for more info.
+   * See README for instructions on how to use Blueprint.
+   * For credits and origins, see AUTHORS.
+   * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */
+
+/* ie.css */
+body {text-align:center;}
+.container {text-align:left;}
+* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 {display:inline;overflow-x:hidden;}
+* html legend {margin:0px -8px 16px 0;padding:0;}
+sup {vertical-align:text-top;}
+sub {vertical-align:text-bottom;}
+html>body p code {*white-space:normal;}
+hr {margin:-8px auto 11px;}
+img {-ms-interpolation-mode:bicubic;}
+.clearfix, .container {display:inline-block;}
+* html .clearfix, * html .container {height:1%;}
+fieldset {padding-top:0;}
+legend {margin-top:-0.2em;margin-bottom:1em;margin-left:-0.5em;}
+textarea {overflow:auto;}
+label {vertical-align:middle;position:relative;top:-0.25em;}
+input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;}
+input.text:focus, input.title:focus {border-color:#666;}
+input.text, input.title, textarea, select {margin:0.5em 0;}
+input.checkbox, input.radio {position:relative;top:.25em;}
+form.inline div, form.inline p {vertical-align:middle;}
+form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;}
+button, input.button {position:relative;top:0.25em;}
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/buttons/readme.txt
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/buttons/readme.txt	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/buttons/readme.txt	(revision 319)
@@ -0,0 +1,32 @@
+Buttons
+
+* Gives you great looking CSS buttons, for both <a> and <button>.
+* Demo: particletree.com/features/rediscovering-the-button-element
+
+
+Credits
+----------------------------------------------------------------
+
+* Created by Kevin Hale [particletree.com]
+* Adapted for Blueprint by Olav Bjorkoy [bjorkoy.com]
+
+
+Usage
+----------------------------------------------------------------
+
+1) Add this plugin to lib/settings.yml.
+   See compress.rb for instructions.
+
+2) Use the following HTML code to place the buttons on your site:
+
+  <button type="submit" class="button positive">
+    <img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/> Save
+  </button>
+
+  <a class="button" href="/password/reset/">
+    <img src="css/blueprint/plugins/buttons/icons/key.png" alt=""/> Change Password
+  </a>
+
+  <a href="#" class="button negative">
+    <img src="css/blueprint/plugins/buttons/icons/cross.png" alt=""/> Cancel
+  </a>
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/buttons/screen.css
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/buttons/screen.css	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/buttons/screen.css	(revision 319)
@@ -0,0 +1,97 @@
+/* -------------------------------------------------------------- 
+  
+   buttons.css
+   * Gives you some great CSS-only buttons.
+   
+   Created by Kevin Hale [particletree.com]
+   * particletree.com/features/rediscovering-the-button-element
+
+   See Readme.txt in this folder for instructions.
+
+-------------------------------------------------------------- */
+
+a.button, button {
+  display:block;
+  float:left;
+  margin: 0.7em 0.5em 0.7em 0;
+  padding:5px 10px 5px 7px;   /* Links */
+  
+  border:1px solid #dedede;
+  border-top:1px solid #eee;
+  border-left:1px solid #eee;
+
+  background-color:#f5f5f5;
+  font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;
+  font-size:100%;
+  line-height:130%;
+  text-decoration:none;
+  font-weight:bold;
+  color:#565656;
+  cursor:pointer;
+}
+button {
+  width:auto;
+  overflow:visible;
+  padding:4px 10px 3px 7px;   /* IE6 */
+}
+button[type] {
+  padding:4px 10px 4px 7px;   /* Firefox */
+  line-height:17px;           /* Safari */
+}
+*:first-child+html button[type] {
+  padding:4px 10px 3px 7px;   /* IE7 */
+}
+button img, a.button img{
+  margin:0 3px -3px 0 !important;
+  padding:0;
+  border:none;
+  width:16px;
+  height:16px;
+  float:none;
+}
+
+
+/* Button colors
+-------------------------------------------------------------- */
+
+/* Standard */
+button:hover, a.button:hover{
+  background-color:#dff4ff;
+  border:1px solid #c2e1ef;
+  color:#336699;
+}
+a.button:active{
+  background-color:#6299c5;
+  border:1px solid #6299c5;
+  color:#fff;
+}
+
+/* Positive */
+body .positive {
+  color:#529214;
+}
+a.positive:hover, button.positive:hover {
+  background-color:#E6EFC2;
+  border:1px solid #C6D880;
+  color:#529214;
+}
+a.positive:active {
+  background-color:#529214;
+  border:1px solid #529214;
+  color:#fff;
+}
+
+/* Negative */
+body .negative {
+  color:#d12f19;
+}
+a.negative:hover, button.negative:hover {
+  background-color:#fbe3e4;
+  border:1px solid #fbc2c4;
+  color:#d12f19;
+}
+a.negative:active {
+  background-color:#d12f19;
+  border:1px solid #d12f19;
+  color:#fff;
+}
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/fancy-type/readme.txt
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/fancy-type/readme.txt	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/fancy-type/readme.txt	(revision 319)
@@ -0,0 +1,14 @@
+Fancy Type
+
+* Gives you classes to use if you'd like some 
+  extra fancy typography. 
+
+Credits and instructions are specified above each class
+in the fancy-type.css file in this directory.
+
+
+Usage
+----------------------------------------------------------------
+
+1) Add this plugin to lib/settings.yml.
+   See compress.rb for instructions.
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/fancy-type/screen.css
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/fancy-type/screen.css	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/fancy-type/screen.css	(revision 319)
@@ -0,0 +1,71 @@
+/* --------------------------------------------------------------
+
+   fancy-type.css
+   * Lots of pretty advanced classes for manipulating text.
+
+   See the Readme file in this folder for additional instructions.
+
+-------------------------------------------------------------- */
+
+/* Indentation instead of line shifts for sibling paragraphs. */
+   p + p { text-indent:2em; margin-top:-1.5em; }
+   form p + p  { text-indent: 0; } /* Don't want this in forms. */
+
+
+/* For great looking type, use this code instead of asdf:
+   <span class="alt">asdf</span>
+   Best used on prepositions and ampersands. */
+
+.alt {
+  color: #666;
+  font-family: "Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif;
+  font-style: italic;
+  font-weight: normal;
+}
+
+
+/* For great looking quote marks in titles, replace "asdf" with:
+   <span class="dquo">&#8220;</span>asdf&#8221;
+   (That is, when the title starts with a quote mark).
+   (You may have to change this value depending on your font size). */
+
+.dquo { margin-left: -.5em; }
+
+
+/* Reduced size type with incremental leading
+   (http://www.markboulton.co.uk/journal/comments/incremental_leading/)
+
+   This could be used for side notes. For smaller type, you don't necessarily want to
+   follow the 1.5x vertical rhythm -- the line-height is too much.
+
+   Using this class, it reduces your font size and line-height so that for
+   every four lines of normal sized type, there is five lines of the sidenote. eg:
+
+   New type size in em's:
+     10px (wanted side note size) / 12px (existing base size) = 0.8333 (new type size in ems)
+
+   New line-height value:
+     12px x 1.5 = 18px (old line-height)
+     18px x 4 = 72px
+     72px / 5 = 14.4px (new line height)
+     14.4px / 10px = 1.44 (new line height in em's) */
+
+p.incr, .incr p {
+  font-size: 10px;
+  line-height: 1.44em;
+  margin-bottom: 1.5em;
+}
+
+
+/* Surround uppercase words and abbreviations with this class.
+   Based on work by JÃžrgen Arnor GÃ¥rdsÃž Lom [http://twistedintellect.com/] */
+
+.caps {
+  font-variant: small-caps;
+  letter-spacing: 1px;
+  text-transform: lowercase;
+  font-size:1.2em;
+  line-height:1%;
+  font-weight:bold;
+  padding:0 2px;
+}
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/link-icons/readme.txt
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/link-icons/readme.txt	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/link-icons/readme.txt	(revision 319)
@@ -0,0 +1,18 @@
+Link Icons
+* Icons for links based on protocol or file type.
+
+This is not supported in IE versions < 7.
+
+
+Credits
+----------------------------------------------------------------
+
+* Marc Morgan
+* Olav Bjorkoy  [bjorkoy.com]
+
+
+Usage
+----------------------------------------------------------------
+
+1) Add this line to your HTML:
+  <link rel="stylesheet" href="css/blueprint/plugins/link-icons/screen.css" type="text/css" media="screen, projection">
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/link-icons/screen.css
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/link-icons/screen.css	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/link-icons/screen.css	(revision 319)
@@ -0,0 +1,40 @@
+/* --------------------------------------------------------------
+
+   link-icons.css
+   * Icons for links based on protocol or file type.
+
+   See the Readme file in this folder for additional instructions.
+
+-------------------------------------------------------------- */
+
+/* Use this class if a link gets an icon when it shouldn't. */
+body a.noicon {
+  background:transparent none !important;
+  padding:0 !important;
+  margin:0 !important;
+}
+
+/* Make sure the icons are not cut */
+a[href^="http:"], a[href^="mailto:"], a[href^="http:"]:visited,
+a[href$=".pdf"], a[href$=".doc"], a[href$=".xls"], a[href$=".rss"],
+a[href$=".rdf"], a[href^="aim:"] {
+  padding:2px 22px 2px 0;
+  margin:-2px 0;
+  background-repeat: no-repeat;
+  background-position: right center;
+}
+
+/* External links */
+a[href^="http:"]          { background-image: url(icons/external.png); }
+a[href^="mailto:"]        { background-image: url(icons/email.png); }
+a[href^="http:"]:visited  { background-image: url(icons/visited.png); }
+
+/* Files */
+a[href$=".pdf"]   { background-image: url(icons/pdf.png); }
+a[href$=".doc"]   { background-image: url(icons/doc.png); }
+a[href$=".xls"]   { background-image: url(icons/xls.png); }
+
+/* Misc */
+a[href$=".rss"],
+a[href$=".rdf"]   { background-image: url(icons/feed.png); }
+a[href^="aim:"]   { background-image: url(icons/im.png); }
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/rtl/readme.txt
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/rtl/readme.txt	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/rtl/readme.txt	(revision 319)
@@ -0,0 +1,10 @@
+RTL
+* Mirrors Blueprint, so it can be used with Right-to-Left languages.
+
+By Ran Yaniv Hartstein, ranh.co.il
+
+Usage
+----------------------------------------------------------------
+
+1) Add this line to your HTML:
+   <link rel="stylesheet" href="css/blueprint/plugins/rtl/screen.css" type="text/css" media="screen, projection">
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/rtl/screen.css
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/rtl/screen.css	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/plugins/rtl/screen.css	(revision 319)
@@ -0,0 +1,110 @@
+/* --------------------------------------------------------------
+
+   rtl.css
+   * Mirrors Blueprint for left-to-right languages
+
+   By Ran Yaniv Hartstein [ranh.co.il]
+
+-------------------------------------------------------------- */
+
+body .container { direction: rtl; }
+body .column, body .span-1, body .span-2, body .span-3, body .span-4, body .span-5, body .span-6, body .span-7, body .span-8, body .span-9, body .span-10, body .span-11, body .span-12, body .span-13, body .span-14, body .span-15, body .span-16, body .span-17, body .span-18, body .span-19, body .span-20, body .span-21, body .span-22, body .span-23, body .span-24 {
+  float: right;
+  margin-right: 0;
+  margin-left: 10px;
+  text-align:right;
+}
+
+body div.last { margin-left: 0; }
+body table .last { padding-left: 0; }
+
+body .append-1   { padding-right: 0; padding-left: 40px; }
+body .append-2   { padding-right: 0; padding-left: 80px; }
+body .append-3   { padding-right: 0; padding-left: 120px; }
+body .append-4   { padding-right: 0; padding-left: 160px; }
+body .append-5   { padding-right: 0; padding-left: 200px; }
+body .append-6   { padding-right: 0; padding-left: 240px; }
+body .append-7   { padding-right: 0; padding-left: 280px; }
+body .append-8   { padding-right: 0; padding-left: 320px; }
+body .append-9   { padding-right: 0; padding-left: 360px; }
+body .append-10  { padding-right: 0; padding-left: 400px; }
+body .append-11  { padding-right: 0; padding-left: 440px; }
+body .append-12  { padding-right: 0; padding-left: 480px; }
+body .append-13  { padding-right: 0; padding-left: 520px; }
+body .append-14  { padding-right: 0; padding-left: 560px; }
+body .append-15  { padding-right: 0; padding-left: 600px; }
+body .append-16  { padding-right: 0; padding-left: 640px; }
+body .append-17  { padding-right: 0; padding-left: 680px; }
+body .append-18  { padding-right: 0; padding-left: 720px; }
+body .append-19  { padding-right: 0; padding-left: 760px; }
+body .append-20  { padding-right: 0; padding-left: 800px; }
+body .append-21  { padding-right: 0; padding-left: 840px; }
+body .append-22  { padding-right: 0; padding-left: 880px; }
+body .append-23  { padding-right: 0; padding-left: 920px; }
+
+body .prepend-1   { padding-left: 0; padding-right: 40px; }
+body .prepend-2   { padding-left: 0; padding-right: 80px; }
+body .prepend-3   { padding-left: 0; padding-right: 120px; }
+body .prepend-4   { padding-left: 0; padding-right: 160px; }
+body .prepend-5   { padding-left: 0; padding-right: 200px; }
+body .prepend-6   { padding-left: 0; padding-right: 240px; }
+body .prepend-7   { padding-left: 0; padding-right: 280px; }
+body .prepend-8   { padding-left: 0; padding-right: 320px; }
+body .prepend-9   { padding-left: 0; padding-right: 360px; }
+body .prepend-10  { padding-left: 0; padding-right: 400px; }
+body .prepend-11  { padding-left: 0; padding-right: 440px; }
+body .prepend-12  { padding-left: 0; padding-right: 480px; }
+body .prepend-13  { padding-left: 0; padding-right: 520px; }
+body .prepend-14  { padding-left: 0; padding-right: 560px; }
+body .prepend-15  { padding-left: 0; padding-right: 600px; }
+body .prepend-16  { padding-left: 0; padding-right: 640px; }
+body .prepend-17  { padding-left: 0; padding-right: 680px; }
+body .prepend-18  { padding-left: 0; padding-right: 720px; }
+body .prepend-19  { padding-left: 0; padding-right: 760px; }
+body .prepend-20  { padding-left: 0; padding-right: 800px; }
+body .prepend-21  { padding-left: 0; padding-right: 840px; }
+body .prepend-22  { padding-left: 0; padding-right: 880px; }
+body .prepend-23  { padding-left: 0; padding-right: 920px; }
+
+body .border {
+  padding-right: 0;
+  padding-left: 4px;
+  margin-right: 0;
+  margin-left: 5px;
+  border-right: none;
+  border-left: 1px solid #eee;
+}
+
+body .colborder {
+  padding-right: 0;
+  padding-left: 24px;
+  margin-right: 0;
+  margin-left: 25px;
+  border-right: none;
+  border-left: 1px solid #eee;
+}
+
+body .pull-1  { margin-left: 0; margin-right: -40px; }
+body .pull-2  { margin-left: 0; margin-right: -80px; }
+body .pull-3  { margin-left: 0; margin-right: -120px; }
+body .pull-4  { margin-left: 0; margin-right: -160px; }
+
+body .push-0  { margin: 0 18px 0 0; }
+body .push-1  { margin: 0 18px 0 -40px; }
+body .push-2  { margin: 0 18px 0 -80px; }
+body .push-3  { margin: 0 18px 0 -120px; }
+body .push-4  { margin: 0 18px 0 -160px; }
+body .push-0, body .push-1, body .push-2,
+body .push-3, body .push-4 { float: left; }
+
+
+/* Typography with RTL support */
+body h1,body h2,body h3,
+body h4,body h5,body h6 { font-family: Arial, sans-serif; }
+html body { font-family: Arial, sans-serif;  }
+body pre,body code,body tt { font-family: monospace; }
+
+/* Mirror floats and margins on typographic elements */
+body p img { float: right; margin: 1.5em 0 1.5em 1.5em; }
+body dd, body ul, body ol { margin-left: 0; margin-right: 1.5em;}
+body td, body th { text-align:right; }
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/print.css
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/print.css	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/print.css	(revision 319)
@@ -0,0 +1,29 @@
+/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0
+ http://blueprintcss.org
+
+   * Copyright (c) 2007-Present. See LICENSE for more info.
+   * See README for instructions on how to use Blueprint.
+   * For credits and origins, see AUTHORS.
+   * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */
+
+/* print.css */
+body {line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#000;background:none;font-size:10pt;}
+.container {background:none;}
+hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;}
+hr.space {background:#fff;color:#fff;visibility:hidden;}
+h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;}
+code {font:.9em "Courier New", Monaco, Courier, monospace;}
+a img {border:none;}
+p img.top {margin-top:0;}
+blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;}
+.small {font-size:.9em;}
+.large {font-size:1.1em;}
+.quiet {color:#999;}
+.hide {display:none;}
+a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;}
+#a:link:after, a:visited:after {content:" (" attr(href) ")";font-size:90%;}
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/screen.css
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/screen.css	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/screen.css	(revision 319)
@@ -0,0 +1,265 @@
+/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0
+ http://blueprintcss.org
+
+   * Copyright (c) 2007-Present. See LICENSE for more info.
+   * See README for instructions on how to use Blueprint.
+   * For credits and origins, see AUTHORS.
+   * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */
+
+/* reset.css */
+html {margin:0;padding:0;border:0;}
+body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}
+article, aside, dialog, figure, footer, header, hgroup, nav, section {display:block;}
+body {line-height:1.5;background:white;}
+table {border-collapse:separate;border-spacing:0;}
+caption, th, td {text-align:left;font-weight:normal;float:none !important;}
+table, th, td {vertical-align:middle;}
+blockquote:before, blockquote:after, q:before, q:after {content:'';}
+blockquote, q {quotes:"" "";}
+a img {border:none;}
+:focus {outline:0;}
+
+/* typography.css */
+html {font-size:100.01%;}
+body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;}
+h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;}
+h1 {font-size:3em;line-height:1;margin-bottom:0.5em;}
+h2 {font-size:2em;margin-bottom:0.75em;}
+h3 {font-size:1.5em;line-height:1;margin-bottom:1em;}
+h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;}
+h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;}
+h6 {font-size:1em;font-weight:bold;}
+h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;}
+p {margin:0 0 1.5em;}
+.left {float:left !important;}
+p .left {margin:1.5em 1.5em 1.5em 0;padding:0;}
+.right {float:right !important;}
+p .right {margin:1.5em 0 1.5em 1.5em;padding:0;}
+a:focus, a:hover {color:#09f;}
+a {color:#06c;text-decoration:underline;}
+blockquote {margin:1.5em;color:#666;font-style:italic;}
+strong, dfn {font-weight:bold;}
+em, dfn {font-style:italic;}
+sup, sub {line-height:0;}
+abbr, acronym {border-bottom:1px dotted #666;}
+address {margin:0 0 1.5em;font-style:italic;}
+del {color:#666;}
+pre {margin:1.5em 0;white-space:pre;}
+pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;}
+li ul, li ol {margin:0;}
+ul, ol {margin:0 1.5em 1.5em 0;padding-left:1.5em;}
+ul {list-style-type:disc;}
+ol {list-style-type:decimal;}
+dl {margin:0 0 1.5em 0;}
+dl dt {font-weight:bold;}
+dd {margin-left:1.5em;}
+table {margin-bottom:1.4em;width:100%;}
+th {font-weight:bold;}
+thead th {background:#c3d9ff;}
+th, td, caption {padding:4px 10px 4px 5px;}
+tbody tr:nth-child(even) td, tbody tr.even td {background:#e5ecf9;}
+tfoot {font-style:italic;}
+caption {background:#eee;}
+.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;}
+.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;}
+.hide {display:none;}
+.quiet {color:#666;}
+.loud {color:#000;}
+.highlight {background:#ff0;}
+.added {background:#060;color:#fff;}
+.removed {background:#900;color:#fff;}
+.first {margin-left:0;padding-left:0;}
+.last {margin-right:0;padding-right:0;}
+.top {margin-top:0;padding-top:0;}
+.bottom {margin-bottom:0;padding-bottom:0;}
+
+/* forms.css */
+label {font-weight:bold;}
+fieldset {padding:0 1.4em 1.4em 1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;}
+legend {font-weight:bold;font-size:1.2em;margin-top:-0.2em;margin-bottom:1em;}
+fieldset, #IE8#HACK {padding-top:1.4em;}
+legend, #IE8#HACK {margin-top:0;margin-bottom:0;}
+input[type=text], input[type=password], input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;}
+input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus {border-color:#666;}
+select {background-color:#fff;border-width:1px;border-style:solid;}
+input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;}
+input.text, input.title {width:300px;padding:5px;}
+input.title {font-size:1.5em;}
+textarea {width:390px;height:250px;padding:5px;}
+form.inline {line-height:3;}
+form.inline p {margin-bottom:0;}
+.error, .alert, .notice, .success, .info {padding:0.8em;margin-bottom:1em;border:2px solid #ddd;}
+.error, .alert {background:#fbe3e4;color:#8a1f11;border-color:#fbc2c4;}
+.notice {background:#fff6bf;color:#514721;border-color:#ffd324;}
+.success {background:#e6efc2;color:#264409;border-color:#c6d880;}
+.info {background:#d5edf8;color:#205791;border-color:#92cae4;}
+.error a, .alert a {color:#8a1f11;}
+.notice a {color:#514721;}
+.success a {color:#264409;}
+.info a {color:#205791;}
+
+/* grid.css */
+.container {width:950px;margin:0 auto;}
+.showgrid {background:url(src/grid.png);}
+.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {float:left;margin-right:10px;}
+.last {margin-right:0;}
+.span-1 {width:30px;}
+.span-2 {width:70px;}
+.span-3 {width:110px;}
+.span-4 {width:150px;}
+.span-5 {width:190px;}
+.span-6 {width:230px;}
+.span-7 {width:270px;}
+.span-8 {width:310px;}
+.span-9 {width:350px;}
+.span-10 {width:390px;}
+.span-11 {width:430px;}
+.span-12 {width:470px;}
+.span-13 {width:510px;}
+.span-14 {width:550px;}
+.span-15 {width:590px;}
+.span-16 {width:630px;}
+.span-17 {width:670px;}
+.span-18 {width:710px;}
+.span-19 {width:750px;}
+.span-20 {width:790px;}
+.span-21 {width:830px;}
+.span-22 {width:870px;}
+.span-23 {width:910px;}
+.span-24 {width:950px;margin-right:0;}
+input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {border-left-width:1px;border-right-width:1px;padding-left:5px;padding-right:5px;}
+input.span-1, textarea.span-1 {width:18px;}
+input.span-2, textarea.span-2 {width:58px;}
+input.span-3, textarea.span-3 {width:98px;}
+input.span-4, textarea.span-4 {width:138px;}
+input.span-5, textarea.span-5 {width:178px;}
+input.span-6, textarea.span-6 {width:218px;}
+input.span-7, textarea.span-7 {width:258px;}
+input.span-8, textarea.span-8 {width:298px;}
+input.span-9, textarea.span-9 {width:338px;}
+input.span-10, textarea.span-10 {width:378px;}
+input.span-11, textarea.span-11 {width:418px;}
+input.span-12, textarea.span-12 {width:458px;}
+input.span-13, textarea.span-13 {width:498px;}
+input.span-14, textarea.span-14 {width:538px;}
+input.span-15, textarea.span-15 {width:578px;}
+input.span-16, textarea.span-16 {width:618px;}
+input.span-17, textarea.span-17 {width:658px;}
+input.span-18, textarea.span-18 {width:698px;}
+input.span-19, textarea.span-19 {width:738px;}
+input.span-20, textarea.span-20 {width:778px;}
+input.span-21, textarea.span-21 {width:818px;}
+input.span-22, textarea.span-22 {width:858px;}
+input.span-23, textarea.span-23 {width:898px;}
+input.span-24, textarea.span-24 {width:938px;}
+.append-1 {padding-right:40px;}
+.append-2 {padding-right:80px;}
+.append-3 {padding-right:120px;}
+.append-4 {padding-right:160px;}
+.append-5 {padding-right:200px;}
+.append-6 {padding-right:240px;}
+.append-7 {padding-right:280px;}
+.append-8 {padding-right:320px;}
+.append-9 {padding-right:360px;}
+.append-10 {padding-right:400px;}
+.append-11 {padding-right:440px;}
+.append-12 {padding-right:480px;}
+.append-13 {padding-right:520px;}
+.append-14 {padding-right:560px;}
+.append-15 {padding-right:600px;}
+.append-16 {padding-right:640px;}
+.append-17 {padding-right:680px;}
+.append-18 {padding-right:720px;}
+.append-19 {padding-right:760px;}
+.append-20 {padding-right:800px;}
+.append-21 {padding-right:840px;}
+.append-22 {padding-right:880px;}
+.append-23 {padding-right:920px;}
+.prepend-1 {padding-left:40px;}
+.prepend-2 {padding-left:80px;}
+.prepend-3 {padding-left:120px;}
+.prepend-4 {padding-left:160px;}
+.prepend-5 {padding-left:200px;}
+.prepend-6 {padding-left:240px;}
+.prepend-7 {padding-left:280px;}
+.prepend-8 {padding-left:320px;}
+.prepend-9 {padding-left:360px;}
+.prepend-10 {padding-left:400px;}
+.prepend-11 {padding-left:440px;}
+.prepend-12 {padding-left:480px;}
+.prepend-13 {padding-left:520px;}
+.prepend-14 {padding-left:560px;}
+.prepend-15 {padding-left:600px;}
+.prepend-16 {padding-left:640px;}
+.prepend-17 {padding-left:680px;}
+.prepend-18 {padding-left:720px;}
+.prepend-19 {padding-left:760px;}
+.prepend-20 {padding-left:800px;}
+.prepend-21 {padding-left:840px;}
+.prepend-22 {padding-left:880px;}
+.prepend-23 {padding-left:920px;}
+.border {padding-right:4px;margin-right:5px;border-right:1px solid #ddd;}
+.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #ddd;}
+.pull-1 {margin-left:-40px;}
+.pull-2 {margin-left:-80px;}
+.pull-3 {margin-left:-120px;}
+.pull-4 {margin-left:-160px;}
+.pull-5 {margin-left:-200px;}
+.pull-6 {margin-left:-240px;}
+.pull-7 {margin-left:-280px;}
+.pull-8 {margin-left:-320px;}
+.pull-9 {margin-left:-360px;}
+.pull-10 {margin-left:-400px;}
+.pull-11 {margin-left:-440px;}
+.pull-12 {margin-left:-480px;}
+.pull-13 {margin-left:-520px;}
+.pull-14 {margin-left:-560px;}
+.pull-15 {margin-left:-600px;}
+.pull-16 {margin-left:-640px;}
+.pull-17 {margin-left:-680px;}
+.pull-18 {margin-left:-720px;}
+.pull-19 {margin-left:-760px;}
+.pull-20 {margin-left:-800px;}
+.pull-21 {margin-left:-840px;}
+.pull-22 {margin-left:-880px;}
+.pull-23 {margin-left:-920px;}
+.pull-24 {margin-left:-960px;}
+.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;}
+.push-1 {margin:0 -40px 1.5em 40px;}
+.push-2 {margin:0 -80px 1.5em 80px;}
+.push-3 {margin:0 -120px 1.5em 120px;}
+.push-4 {margin:0 -160px 1.5em 160px;}
+.push-5 {margin:0 -200px 1.5em 200px;}
+.push-6 {margin:0 -240px 1.5em 240px;}
+.push-7 {margin:0 -280px 1.5em 280px;}
+.push-8 {margin:0 -320px 1.5em 320px;}
+.push-9 {margin:0 -360px 1.5em 360px;}
+.push-10 {margin:0 -400px 1.5em 400px;}
+.push-11 {margin:0 -440px 1.5em 440px;}
+.push-12 {margin:0 -480px 1.5em 480px;}
+.push-13 {margin:0 -520px 1.5em 520px;}
+.push-14 {margin:0 -560px 1.5em 560px;}
+.push-15 {margin:0 -600px 1.5em 600px;}
+.push-16 {margin:0 -640px 1.5em 640px;}
+.push-17 {margin:0 -680px 1.5em 680px;}
+.push-18 {margin:0 -720px 1.5em 720px;}
+.push-19 {margin:0 -760px 1.5em 760px;}
+.push-20 {margin:0 -800px 1.5em 800px;}
+.push-21 {margin:0 -840px 1.5em 840px;}
+.push-22 {margin:0 -880px 1.5em 880px;}
+.push-23 {margin:0 -920px 1.5em 920px;}
+.push-24 {margin:0 -960px 1.5em 960px;}
+.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:left;position:relative;}
+div.prepend-top, .prepend-top {margin-top:1.5em;}
+div.append-bottom, .append-bottom {margin-bottom:1.5em;}
+.box {padding:1.5em;margin-bottom:1.5em;background:#e5eCf9;}
+hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:1px;margin:0 0 1.45em;border:none;}
+hr.space {background:#fff;color:#fff;visibility:hidden;}
+.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;}
+.clearfix, .container {display:block;}
+.clear {clear:both;}
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/src/forms.css
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/src/forms.css	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/src/forms.css	(revision 319)
@@ -0,0 +1,81 @@
+/* --------------------------------------------------------------
+
+   forms.css
+   * Sets up some default styling for forms
+   * Gives you classes to enhance your forms
+
+   Usage:
+   * For text fields, use class .title or .text
+   * For inline forms, use .inline (even when using columns)
+
+-------------------------------------------------------------- */
+
+/* 
+	A special hack is included for IE8 since it does not apply padding 
+	correctly on fieldsets
+ */ 
+label       { font-weight: bold; }
+fieldset    { padding:0 1.4em 1.4em 1.4em; margin: 0 0 1.5em 0; border: 1px solid #ccc; }
+legend      { font-weight: bold; font-size:1.2em; margin-top:-0.2em; margin-bottom:1em; }
+
+fieldset, #IE8#HACK { padding-top:1.4em; } 
+legend, #IE8#HACK { margin-top:0; margin-bottom:0; }
+
+/* Form fields
+-------------------------------------------------------------- */
+
+/* 
+  Attribute selectors are used to differentiate the different types 
+  of input elements, but to support old browsers, you will have to 
+  add classes for each one. ".title" simply creates a large text  
+  field, this is purely for looks.
+ */
+input[type=text], input[type=password],
+input.text, input.title,
+textarea {
+  background-color:#fff;
+  border:1px solid #bbb;
+}
+input[type=text]:focus, input[type=password]:focus,
+input.text:focus, input.title:focus,
+textarea:focus {
+  border-color:#666;
+}
+select { background-color:#fff; border-width:1px; border-style:solid; }
+
+input[type=text], input[type=password],
+input.text, input.title,
+textarea, select {
+  margin:0.5em 0;
+}
+
+input.text,
+input.title   { width: 300px; padding:5px; }
+input.title   { font-size:1.5em; }
+textarea      { width: 390px; height: 250px; padding:5px; }
+
+/* 
+  This is to be used on forms where a variety of elements are 
+  placed side-by-side. Use the p tag to denote a line. 
+ */
+form.inline { line-height:3; }
+form.inline p { margin-bottom:0; }
+
+
+/* Success, info, notice and error/alert boxes
+-------------------------------------------------------------- */
+
+.error,
+.alert, 
+.notice,
+.success, 
+.info 			{ padding: 0.8em; margin-bottom: 1em; border: 2px solid #ddd; }
+
+.error, .alert { background: #fbe3e4; color: #8a1f11; border-color: #fbc2c4; }
+.notice     { background: #fff6bf; color: #514721; border-color: #ffd324; }
+.success    { background: #e6efc2; color: #264409; border-color: #c6d880; }
+.info 			{ background: #d5edf8; color: #205791; border-color: #92cae4; }
+.error a, .alert a { color: #8a1f11; }
+.notice a   { color: #514721; }
+.success a  { color: #264409; }
+.info a			{ color: #205791; }
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/src/grid.css
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/src/grid.css	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/src/grid.css	(revision 319)
@@ -0,0 +1,281 @@
+/* --------------------------------------------------------------
+
+   grid.css
+   * Sets up an easy-to-use grid of 24 columns.
+
+   By default, the grid is 950px wide, with 24 columns
+   spanning 30px, and a 10px margin between columns.
+
+   If you need fewer or more columns, namespaces or semantic
+   element names, use the compressor script (lib/compress.rb)
+
+-------------------------------------------------------------- */
+
+/* A container should group all your columns. */
+.container {
+  width: 950px;
+  margin: 0 auto;
+}
+
+/* Use this class on any .span / container to see the grid. */
+.showgrid {
+  background: url(src/grid.png);
+}
+
+
+/* Columns
+-------------------------------------------------------------- */
+
+/* Sets up basic grid floating and margin. */
+.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {
+  float: left;
+  margin-right: 10px;
+}
+
+/* The last column in a row needs this class. */
+.last { margin-right: 0; }
+
+/* Use these classes to set the width of a column. */
+.span-1 {width: 30px;}
+
+.span-2 {width: 70px;}
+.span-3 {width: 110px;}
+.span-4 {width: 150px;}
+.span-5 {width: 190px;}
+.span-6 {width: 230px;}
+.span-7 {width: 270px;}
+.span-8 {width: 310px;}
+.span-9 {width: 350px;}
+.span-10 {width: 390px;}
+.span-11 {width: 430px;}
+.span-12 {width: 470px;}
+.span-13 {width: 510px;}
+.span-14 {width: 550px;}
+.span-15 {width: 590px;}
+.span-16 {width: 630px;}
+.span-17 {width: 670px;}
+.span-18 {width: 710px;}
+.span-19 {width: 750px;}
+.span-20 {width: 790px;}
+.span-21 {width: 830px;}
+.span-22 {width: 870px;}
+.span-23 {width: 910px;}
+.span-24 {width:950px; margin-right:0;}
+
+/* Use these classes to set the width of an input. */
+input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {
+  border-left-width: 1px;
+  border-right-width: 1px;
+  padding-left: 5px;
+  padding-right: 5px;
+}
+
+input.span-1, textarea.span-1 { width: 18px; }
+input.span-2, textarea.span-2 { width: 58px; }
+input.span-3, textarea.span-3 { width: 98px; }
+input.span-4, textarea.span-4 { width: 138px; }
+input.span-5, textarea.span-5 { width: 178px; }
+input.span-6, textarea.span-6 { width: 218px; }
+input.span-7, textarea.span-7 { width: 258px; }
+input.span-8, textarea.span-8 { width: 298px; }
+input.span-9, textarea.span-9 { width: 338px; }
+input.span-10, textarea.span-10 { width: 378px; }
+input.span-11, textarea.span-11 { width: 418px; }
+input.span-12, textarea.span-12 { width: 458px; }
+input.span-13, textarea.span-13 { width: 498px; }
+input.span-14, textarea.span-14 { width: 538px; }
+input.span-15, textarea.span-15 { width: 578px; }
+input.span-16, textarea.span-16 { width: 618px; }
+input.span-17, textarea.span-17 { width: 658px; }
+input.span-18, textarea.span-18 { width: 698px; }
+input.span-19, textarea.span-19 { width: 738px; }
+input.span-20, textarea.span-20 { width: 778px; }
+input.span-21, textarea.span-21 { width: 818px; }
+input.span-22, textarea.span-22 { width: 858px; }
+input.span-23, textarea.span-23 { width: 898px; }
+input.span-24, textarea.span-24 { width: 938px; }
+
+/* Add these to a column to append empty cols. */
+
+.append-1 { padding-right: 40px;}
+.append-2 { padding-right: 80px;}
+.append-3 { padding-right: 120px;}
+.append-4 { padding-right: 160px;}
+.append-5 { padding-right: 200px;}
+.append-6 { padding-right: 240px;}
+.append-7 { padding-right: 280px;}
+.append-8 { padding-right: 320px;}
+.append-9 { padding-right: 360px;}
+.append-10 { padding-right: 400px;}
+.append-11 { padding-right: 440px;}
+.append-12 { padding-right: 480px;}
+.append-13 { padding-right: 520px;}
+.append-14 { padding-right: 560px;}
+.append-15 { padding-right: 600px;}
+.append-16 { padding-right: 640px;}
+.append-17 { padding-right: 680px;}
+.append-18 { padding-right: 720px;}
+.append-19 { padding-right: 760px;}
+.append-20 { padding-right: 800px;}
+.append-21 { padding-right: 840px;}
+.append-22 { padding-right: 880px;}
+.append-23 { padding-right: 920px;}
+
+/* Add these to a column to prepend empty cols. */
+
+.prepend-1 { padding-left: 40px;}
+.prepend-2 { padding-left: 80px;}
+.prepend-3 { padding-left: 120px;}
+.prepend-4 { padding-left: 160px;}
+.prepend-5 { padding-left: 200px;}
+.prepend-6 { padding-left: 240px;}
+.prepend-7 { padding-left: 280px;}
+.prepend-8 { padding-left: 320px;}
+.prepend-9 { padding-left: 360px;}
+.prepend-10 { padding-left: 400px;}
+.prepend-11 { padding-left: 440px;}
+.prepend-12 { padding-left: 480px;}
+.prepend-13 { padding-left: 520px;}
+.prepend-14 { padding-left: 560px;}
+.prepend-15 { padding-left: 600px;}
+.prepend-16 { padding-left: 640px;}
+.prepend-17 { padding-left: 680px;}
+.prepend-18 { padding-left: 720px;}
+.prepend-19 { padding-left: 760px;}
+.prepend-20 { padding-left: 800px;}
+.prepend-21 { padding-left: 840px;}
+.prepend-22 { padding-left: 880px;}
+.prepend-23 { padding-left: 920px;}
+
+
+/* Border on right hand side of a column. */
+.border {
+  padding-right: 4px;
+  margin-right: 5px;
+  border-right: 1px solid #ddd;
+}
+
+/* Border with more whitespace, spans one column. */
+.colborder {
+#  padding-right: 24px;
+  margin-right: 25px;
+  border-right: 1px solid #ddd;
+  min-height: 28em;
+}
+
+
+/* Use these classes on an element to push it into the
+next column, or to pull it into the previous column.  */
+
+
+.pull-1 { margin-left: -40px; }
+.pull-2 { margin-left: -80px; }
+.pull-3 { margin-left: -120px; }
+.pull-4 { margin-left: -160px; }
+.pull-5 { margin-left: -200px; }
+.pull-6 { margin-left: -240px; }
+.pull-7 { margin-left: -280px; }
+.pull-8 { margin-left: -320px; }
+.pull-9 { margin-left: -360px; }
+.pull-10 { margin-left: -400px; }
+.pull-11 { margin-left: -440px; }
+.pull-12 { margin-left: -480px; }
+.pull-13 { margin-left: -520px; }
+.pull-14 { margin-left: -560px; }
+.pull-15 { margin-left: -600px; }
+.pull-16 { margin-left: -640px; }
+.pull-17 { margin-left: -680px; }
+.pull-18 { margin-left: -720px; }
+.pull-19 { margin-left: -760px; }
+.pull-20 { margin-left: -800px; }
+.pull-21 { margin-left: -840px; }
+.pull-22 { margin-left: -880px; }
+.pull-23 { margin-left: -920px; }
+.pull-24 { margin-left: -960px; }
+
+.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float: left; position:relative;}
+
+
+.push-1 { margin: 0 -40px 1.5em 40px; }
+.push-2 { margin: 0 -80px 1.5em 80px; }
+.push-3 { margin: 0 -120px 1.5em 120px; }
+.push-4 { margin: 0 -160px 1.5em 160px; }
+.push-5 { margin: 0 -200px 1.5em 200px; }
+.push-6 { margin: 0 -240px 1.5em 240px; }
+.push-7 { margin: 0 -280px 1.5em 280px; }
+.push-8 { margin: 0 -320px 1.5em 320px; }
+.push-9 { margin: 0 -360px 1.5em 360px; }
+.push-10 { margin: 0 -400px 1.5em 400px; }
+.push-11 { margin: 0 -440px 1.5em 440px; }
+.push-12 { margin: 0 -480px 1.5em 480px; }
+.push-13 { margin: 0 -520px 1.5em 520px; }
+.push-14 { margin: 0 -560px 1.5em 560px; }
+.push-15 { margin: 0 -600px 1.5em 600px; }
+.push-16 { margin: 0 -640px 1.5em 640px; }
+.push-17 { margin: 0 -680px 1.5em 680px; }
+.push-18 { margin: 0 -720px 1.5em 720px; }
+.push-19 { margin: 0 -760px 1.5em 760px; }
+.push-20 { margin: 0 -800px 1.5em 800px; }
+.push-21 { margin: 0 -840px 1.5em 840px; }
+.push-22 { margin: 0 -880px 1.5em 880px; }
+.push-23 { margin: 0 -920px 1.5em 920px; }
+.push-24 { margin: 0 -960px 1.5em 960px; }
+
+.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float: left; position:relative;}
+
+
+/* Misc classes and elements
+-------------------------------------------------------------- */
+
+/* In case you need to add a gutter above/below an element */
+div.prepend-top, .prepend-top {
+  margin-top:1.5em;
+}
+div.append-bottom, .append-bottom {
+  margin-bottom:1.5em;
+}
+
+/* Use a .box to create a padded box inside a column.  */
+.box {
+  padding: 1.5em;
+  margin-bottom: 1.5em;
+  background: #e5eCf9;
+}
+
+/* Use this to create a horizontal ruler across a column. */
+hr {
+  background: #ddd;
+  color: #ddd;
+  clear: both;
+  float: none;
+  width: 100%;
+  height: 1px;
+  margin: 0 0 1.45em;
+  border: none;
+}
+
+hr.space {
+  background: #fff;
+  color: #fff;
+  visibility: hidden;
+}
+
+
+/* Clearing floats without extra markup
+   Based on How To Clear Floats Without Structural Markup by PiE
+   [http://www.positioniseverything.net/easyclearing.html] */
+
+.clearfix:after, .container:after {
+  content: "\0020";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+  overflow:hidden;
+}
+.clearfix, .container {display: block;}
+
+/* Regular clearing
+   apply to column that should drop below previous ones. */
+
+.clear { clear:both; }
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/src/ie.css
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/src/ie.css	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/src/ie.css	(revision 319)
@@ -0,0 +1,79 @@
+/* --------------------------------------------------------------
+
+   ie.css
+
+   Contains every hack for Internet Explorer,
+   so that our core files stay sweet and nimble.
+
+-------------------------------------------------------------- */
+
+/* Make sure the layout is centered in IE5 */
+body { text-align: center; }
+.container { text-align: left; }
+
+/* Fixes IE margin bugs */
+* html .column, * html .span-1, * html .span-2,
+* html .span-3, * html .span-4, * html .span-5,
+* html .span-6, * html .span-7, * html .span-8,
+* html .span-9, * html .span-10, * html .span-11,
+* html .span-12, * html .span-13, * html .span-14,
+* html .span-15, * html .span-16, * html .span-17,
+* html .span-18, * html .span-19, * html .span-20,
+* html .span-21, * html .span-22, * html .span-23,
+* html .span-24 { display:inline; overflow-x: hidden; }
+
+
+/* Elements
+-------------------------------------------------------------- */
+
+/* Fixes incorrect styling of legend in IE6. */
+* html legend { margin:0px -8px 16px 0; padding:0; }
+
+/* Fixes wrong line-height on sup/sub in IE. */
+sup { vertical-align:text-top; }
+sub { vertical-align:text-bottom; }
+
+/* Fixes IE7 missing wrapping of code elements. */
+html>body p code { *white-space: normal; }
+
+/* IE 6&7 has problems with setting proper <hr> margins. */
+hr  { margin:-8px auto 11px; }
+
+/* Explicitly set interpolation, allowing dynamically resized images to not look horrible */
+img { -ms-interpolation-mode:bicubic; }
+
+/* Clearing
+-------------------------------------------------------------- */
+
+/* Makes clearfix actually work in IE */
+.clearfix, .container { display:inline-block; }
+* html .clearfix,
+* html .container { height:1%; }
+
+
+/* Forms
+-------------------------------------------------------------- */
+
+/* Fixes padding on fieldset */
+fieldset { padding-top:0; }
+legend { margin-top:-0.2em; margin-bottom:1em; margin-left:-0.5em; }
+
+/* Makes classic textareas in IE 6 resemble other browsers */
+textarea { overflow:auto; }
+
+/* Makes labels behave correctly in IE 6 and 7 */
+label { vertical-align:middle; position:relative; top:-0.25em; }
+
+/* Fixes rule that IE 6 ignores */
+input.text, input.title, textarea { background-color:#fff; border:1px solid #bbb; }
+input.text:focus, input.title:focus { border-color:#666; }
+input.text, input.title, textarea, select { margin:0.5em 0; }
+input.checkbox, input.radio { position:relative; top:.25em; }
+
+/* Fixes alignment of inline form elements */
+form.inline div, form.inline p { vertical-align:middle; }
+form.inline input.checkbox, form.inline input.radio,
+form.inline input.button, form.inline button {
+  margin:0.5em 0;
+}
+button, input.button { position:relative;top:0.25em; }
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/src/print.css
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/src/print.css	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/src/print.css	(revision 319)
@@ -0,0 +1,92 @@
+/* --------------------------------------------------------------
+
+   print.css
+   * Gives you some sensible styles for printing pages.
+   * See Readme file in this directory for further instructions.
+
+   Some additions you'll want to make, customized to your markup:
+   #header, #footer, #navigation { display:none; }
+
+-------------------------------------------------------------- */
+
+body {
+  line-height: 1.5;
+  font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
+  color:#000;
+  background: none;
+  font-size: 10pt;
+}
+
+
+/* Layout
+-------------------------------------------------------------- */
+
+.container {
+  background: none;
+}
+
+hr {
+  background:#ccc;
+  color:#ccc;
+  width:100%;
+  height:2px;
+  margin:2em 0;
+  padding:0;
+  border:none;
+}
+hr.space {
+  background: #fff;
+  color: #fff;
+  visibility: hidden;
+}
+
+
+/* Text
+-------------------------------------------------------------- */
+
+h1,h2,h3,h4,h5,h6 { font-family: "Helvetica Neue", Arial, "Lucida Grande", sans-serif; }
+code { font:.9em "Courier New", Monaco, Courier, monospace; }
+
+a img { border:none; }
+p img.top { margin-top: 0; }
+
+blockquote {
+  margin:1.5em;
+  padding:1em;
+  font-style:italic;
+  font-size:.9em;
+}
+
+.small  { font-size: .9em; }
+.large  { font-size: 1.1em; }
+.quiet  { color: #999; }
+.hide   { display:none; }
+
+
+/* Links
+-------------------------------------------------------------- */
+
+a:link, a:visited {
+  background: transparent;
+  font-weight:700;
+  text-decoration: underline;
+}
+
+/* 
+	This has been the source of many questions in the past. This 
+	snippet of CSS appends the URL of each link within the text. 
+	The idea is that users printing your webpage will want to know 
+	the URLs they go to. If you want to remove this functionality, 
+	comment out this snippet and make sure to re-compress your files.
+ */
+a:link:after, a:visited:after {
+  content: " (" attr(href) ")";
+  font-size: 90%;
+}
+
+/* If you're having trouble printing relative links, uncomment and customize this:
+   (note: This is valid CSS3, but it still won't go through the W3C CSS Validator) */
+
+/* a[href^="/"]:after {
+  content: " (http://www.yourdomain.com" attr(href) ") ";
+} */
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/src/reset.css
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/src/reset.css	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/src/reset.css	(revision 319)
@@ -0,0 +1,67 @@
+/* --------------------------------------------------------------
+
+   reset.css
+   * Resets default browser CSS.
+
+-------------------------------------------------------------- */
+
+html { 
+	margin:0; 
+	padding:0; 
+	border:0; 
+}
+
+body, div, span, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, code,
+del, dfn, em, img, q, dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, dialog, figure, footer, header,
+hgroup, nav, section {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+/* This helps to make newer HTML5 elements behave like DIVs in older browers */ 
+article, aside, dialog, figure, footer, header,
+hgroup, nav, section {
+    display:block;
+}
+
+/* Line-height should always be unitless! */
+body {
+  line-height: 1.5;
+  background: white; 
+}
+
+/* Tables still need 'cellspacing="0"' in the markup. */
+table { 
+	border-collapse: separate; 
+	border-spacing: 0; 
+}
+/* float:none prevents the span-x classes from breaking table-cell display */
+caption, th, td { 
+	text-align: left; 
+	font-weight: normal; 
+	float:none !important; 
+}
+table, th, td { 
+	vertical-align: middle; 
+}
+
+/* Remove possible quote marks (") from <q>, <blockquote>. */
+blockquote:before, blockquote:after, q:before, q:after { content: ''; }
+blockquote, q { quotes: "" ""; }
+
+/* Remove annoying border on linked images. */
+a img { border: none; }
+
+/* Remember to define your own focus styles! */
+:focus { outline: 0; }
Index: /ether_2012/web/resources/css/blueprint-css/blueprint/src/typography.css
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/blueprint/src/typography.css	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/blueprint/src/typography.css	(revision 319)
@@ -0,0 +1,123 @@
+/* --------------------------------------------------------------
+
+   typography.css
+   * Sets up some sensible default typography.
+
+-------------------------------------------------------------- */
+
+/* Default font settings.
+   The font-size percentage is of 16px. (0.75 * 16px = 12px) */
+html { font-size:100.01%; }
+body {
+  font-size: 75%;
+  color: #222;
+  background: #fff;
+  font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
+}
+
+
+/* Headings
+-------------------------------------------------------------- */
+
+h1,h2,h3,h4,h5,h6 { font-weight: normal; color: #111; }
+
+h1 { font-size: 3em; line-height: 1; margin-bottom: 0.5em; }
+h2 { font-size: 2em; margin-bottom: 0.75em; }
+h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1em; }
+h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; }
+h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.5em; }
+h6 { font-size: 1em; font-weight: bold; }
+
+h1 img, h2 img, h3 img,
+h4 img, h5 img, h6 img {
+  margin: 0;
+}
+
+
+/* Text elements
+-------------------------------------------------------------- */
+
+p           { margin: 0 0 1.5em; }
+/* 
+	These can be used to pull an image at the start of a paragraph, so 
+	that the text flows around it (usage: <p><img class="left">Text</p>) 
+ */
+.left  			{ float: left !important; }
+p .left			{ margin: 1.5em 1.5em 1.5em 0; padding: 0; }
+.right 			{ float: right !important; }
+p .right 		{ margin: 1.5em 0 1.5em 1.5em; padding: 0; }
+
+a:focus,
+a:hover     { color: #09f; }
+a           { color: #06c; text-decoration: underline; }
+
+blockquote  { margin: 1.5em; color: #666; font-style: italic; }
+strong,dfn	{ font-weight: bold; }
+em,dfn      { font-style: italic; }
+sup, sub    { line-height: 0; }
+
+abbr,
+acronym     { border-bottom: 1px dotted #666; }
+address     { margin: 0 0 1.5em; font-style: italic; }
+del         { color:#666; }
+
+pre         { margin: 1.5em 0; white-space: pre; }
+pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height: 1.5; }
+
+
+/* Lists
+-------------------------------------------------------------- */
+
+li ul,
+li ol       { margin: 0; }
+ul, ol      { margin: 0 1.5em 1.5em 0; padding-left: 1.5em; }
+
+ul          { list-style-type: disc; }
+ol          { list-style-type: decimal; }
+
+dl          { margin: 0 0 1.5em 0; }
+dl dt       { font-weight: bold; }
+dd          { margin-left: 1.5em;}
+
+
+/* Tables
+-------------------------------------------------------------- */
+
+/* 
+	Because of the need for padding on TH and TD, the vertical rhythm 
+	on table cells has to be 27px, instead of the standard 18px or 36px 
+	of other elements. 
+ */ 
+table       { margin-bottom: 1.4em; width:100%; }
+th          { font-weight: bold; }
+thead th    { background: #c3d9ff; }
+th,td,caption { padding: 4px 10px 4px 5px; }
+/*
+	You can zebra-stripe your tables in outdated browsers by adding 
+	the class "even" to every other table row. 
+ */
+tbody tr:nth-child(even) td, 
+tbody tr.even td  { 
+	background: #e5ecf9; 
+}
+tfoot       { font-style: italic; }
+caption     { background: #eee; }
+
+
+/* Misc classes
+-------------------------------------------------------------- */
+
+.small      { font-size: .8em; margin-bottom: 1.875em; line-height: 1.875em; }
+.large      { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; }
+.hide       { display: none; }
+
+.quiet      { color: #666; }
+.loud       { color: #000; }
+.highlight  { background:#ff0; }
+.added      { background:#060; color: #fff; }
+.removed    { background:#900; color: #fff; }
+
+.first      { margin-left:0; padding-left:0; }
+.last       { margin-right:0; padding-right:0; }
+.top        { margin-top:0; padding-top:0; }
+.bottom     { margin-bottom:0; padding-bottom:0; }
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/blueprint.rb
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/blueprint.rb	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/blueprint.rb	(revision 319)
@@ -0,0 +1,39 @@
+require 'fileutils'
+module Blueprint
+  # path to the root Blueprint directory
+  ROOT_PATH =             File.join(File.expand_path(File.dirname(__FILE__)), "../../")
+  # path to where the Blueprint CSS files are stored
+  BLUEPRINT_ROOT_PATH =   File.join(Blueprint::ROOT_PATH, "blueprint")
+  # path to where the Blueprint CSS raw CSS files are stored
+  SOURCE_PATH =           File.join(Blueprint::BLUEPRINT_ROOT_PATH, "src")
+  # path to where the Blueprint CSS generated test files are stored
+  TEST_PATH =             File.join(Blueprint::ROOT_PATH, "tests")
+  # path to the root of the Blueprint scripts
+  LIB_PATH =              File.join(Blueprint::ROOT_PATH, "lib", "blueprint")
+  # path to where Blueprint plugins are stored
+  PLUGINS_PATH =          File.join(Blueprint::BLUEPRINT_ROOT_PATH, "plugins")
+  # settings YAML file where custom user settings are saved
+  SETTINGS_FILE =         File.join(Blueprint::ROOT_PATH, "lib", "settings.yml")
+  # path to validator jar file to validate generated CSS files
+  VALIDATOR_FILE =        File.join(Blueprint::LIB_PATH, "validate", "css-validator.jar")
+  # hash of compressed and source CSS files
+  CSS_FILES = {
+    "screen.css"   => ["reset.css", "typography.css", "forms.css", "grid.css"],
+    "print.css"    => ["print.css"],
+    "ie.css"       => ["ie.css"]
+  }
+
+  # default number of columns for Blueprint layout
+  COLUMN_COUNT =          24
+  # default column width (in pixels) for Blueprint layout
+  COLUMN_WIDTH =          30
+  # default gutter width (in pixels) for Blueprint layout
+  GUTTER_WIDTH =          10
+  
+  INPUT_PADDING =         5
+  INPUT_BORDER =          1
+end
+
+Dir["#{File.join(Blueprint::LIB_PATH)}/*"].each do |file|
+  require file if file =~ /\.rb$/ && file !~ /blueprint\.rb/
+end
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/compressor.rb
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/compressor.rb	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/compressor.rb	(revision 319)
@@ -0,0 +1,290 @@
+require "yaml"
+require "optparse"
+module Blueprint
+  class Compressor
+    TEST_FILES = ["index.html",
+                  "parts/elements.html",
+                  "parts/forms.html",
+                  "parts/grid.html",
+                  "parts/sample.html"]
+
+    attr_accessor :namespace, :custom_css, :custom_layout, :semantic_classes, :project_name, :plugins
+    attr_reader   :custom_path, :loaded_from_settings, :destination_path, :script_name
+
+    # overridden setter method for destination_path
+    # also sets custom_path flag on Blueprint::Compressor instance
+    def destination_path=(path)
+      @destination_path = path
+      @custom_path = @destination_path != Blueprint::BLUEPRINT_ROOT_PATH
+    end
+
+    # constructor
+    def initialize
+      # set up defaults
+      @script_name = File.basename($0)
+      @loaded_from_settings = false
+      @settings_file = Blueprint::SETTINGS_FILE
+      self.namespace = ""
+      self.destination_path = Blueprint::BLUEPRINT_ROOT_PATH
+      self.custom_layout = CustomLayout.new
+      self.project_name = nil
+      self.custom_css = {}
+      self.semantic_classes = {}
+      self.plugins = []
+
+      self.options.parse!(ARGV)
+      initialize_project_from_yaml(self.project_name)
+    end
+
+    # generates output CSS based on any args passed in
+    # overwrites any existing CSS, as well as grid.png and tests
+    def generate!
+      output_header       # information to the user (in the console) describing custom settings
+      generate_css_files  # loops through Blueprint::CSS_FILES to generate output CSS
+      generate_tests      # updates HTML with custom namespaces in order to test the generated library.  TODO: have tests kick out to custom location
+      output_footer       # informs the user that the CSS generation process is complete
+    end
+
+    def options #:nodoc:#
+      OptionParser.new do |o|
+        o.set_summary_indent("  ")
+        o.banner =    "Usage: #{@script_name} [options]"
+        o.define_head "Blueprint Compressor"
+        o.separator ""
+        o.separator "options"
+        o.on( "-fSETTINGS_FILE", "--settings_file=SETTINGS_FILE", String,
+              "Specify a non-default settings file path.") { |file| @settings_file = file }
+        o.on( "-oOUTPUT_PATH", "--output_path=OUTPUT_PATH", String,
+              "Define a different path to output generated CSS files to.") { |path| self.destination_path = path }
+        o.on( "-nBP_NAMESPACE", "--namespace=BP_NAMESPACE", String,
+              "Define a namespace prepended to all Blueprint classes (e.g. .your-ns-span-24)") { |ns| self.namespace = ns }
+        o.on( "-pPROJECT_NAME", "--project=PROJECT_NAME", String,
+              "If using the settings.yml file, PROJECT_NAME is the project name you want to export") {|project| @project_name = project }
+        o.on( "--column_width=COLUMN_WIDTH", Integer,
+              "Set a new column width (in pixels) for the output grid") {|cw| self.custom_layout.column_width = cw }
+        o.on( "--gutter_width=GUTTER_WIDTH", Integer,
+              "Set a new gutter width (in pixels) for the output grid") {|gw| self.custom_layout.gutter_width = gw }
+        o.on( "--column_count=COLUMN_COUNT", Integer,
+              "Set a new column count for the output grid") {|cc| self.custom_layout.column_count = cc }
+        #o.on("-v", "--verbose", "Turn on verbose output.") { |$verbose| }
+        o.on("-h", "--help", "Show this help message.") { puts o; exit }
+      end
+    end
+
+    private
+
+    # attempts to load output settings from settings.yml
+    def initialize_project_from_yaml(project_name = nil)
+      # ensures project_name is set and settings.yml is present
+      return unless (project_name && File.exist?(@settings_file))
+
+      # loads yaml into hash
+      projects = YAML::load(File.path_to_string(@settings_file))
+
+      if (project = projects[project_name]) # checks to see if project info is present
+        self.destination_path = if self.destination_path == Blueprint::BLUEPRINT_ROOT_PATH
+                                  project["path"]
+                                else
+                                  self.destination_path
+                                end
+        self.destination_path   ||= Blueprint::BLUEPRINT_ROOT_PATH
+        self.namespace =        project["namespace"]        || ""
+        self.custom_css =       project["custom_css"]       || {}
+        self.semantic_classes = project["semantic_classes"] || {}
+        self.plugins =          project["plugins"]          || []
+
+        if (layout = project["custom_layout"])
+          self.custom_layout = CustomLayout.new(:column_count =>  layout["column_count"],
+                                                :column_width =>  layout["column_width"],
+                                                :gutter_width =>  layout["gutter_width"],
+                                                :input_padding => layout["input_padding"],
+                                                :input_border =>  layout["input_border"])
+        end
+        @loaded_from_settings = true
+      end
+    end
+
+    def generate_css_files
+      Blueprint::CSS_FILES.each do |output_file_name, css_source_file_names|
+        css_output_path = File.join(destination_path, output_file_name)
+        puts "\n    Assembling to #{custom_path ? css_output_path : "default blueprint path"}"
+
+        # CSS file generation
+        css_output = css_file_header # header included on all three Blueprint-generated files
+        css_output += "\n\n"
+
+        # Iterate through src/ .css files and compile to individual core compressed file
+        css_source_file_names.each do |css_source_file|
+          puts "      + src/#{css_source_file}"
+          css_output += "/* #{css_source_file} */\n" if css_source_file_names.any?
+
+          source_options = if self.custom_layout && css_source_file == "grid.css"
+            self.custom_layout.generate_grid_css
+          else
+            File.path_to_string File.join(Blueprint::SOURCE_PATH, css_source_file)
+          end
+
+          css_output += Blueprint::CSSParser.new(source_options,
+                                                 :namespace => namespace).to_s
+          css_output += "\n"
+        end
+
+        #append CSS from plugins
+        css_output = append_plugin_css(css_output, output_file_name)
+
+        # append CSS from custom files
+        css_output = append_custom_css(css_output, output_file_name)
+
+        #save CSS to correct path, stripping out any extra whitespace at the end of the file
+        File.string_to_file(css_output.rstrip, css_output_path)
+      end
+
+      # append semantic class names if set
+      append_semantic_classes
+
+      #attempt to generate a grid.png file
+      if (grid_builder = GridBuilder.new(:column_width => self.custom_layout.column_width,
+                                         :gutter_width => self.custom_layout.gutter_width,
+                                         :output_path => File.join(self.destination_path, "src")))
+        grid_builder.generate!
+      end
+    end
+
+    def append_custom_css(css, current_file_name)
+      # check to see if a custom (non-default) location was used for output files
+      # if custom path is used, handle custom CSS, if any
+      return css unless self.custom_path and self.custom_css[current_file_name]
+
+      self.custom_css[current_file_name].each do |custom_css|
+        overwrite_base = custom_css || "my-#{current_file_name}"
+        overwrite_path = File.join(destination_path, overwrite_base)
+        overwrite_css = if File.exists?(overwrite_path)
+                          File.path_to_string(overwrite_path)
+                        else
+                          ""
+                        end
+
+        # if there's CSS present, add it to the CSS output
+        unless overwrite_css.blank?
+          puts "      + custom styles (#{custom_css})\n"
+          css += "/* #{overwrite_base} */\n"
+          css += CSSParser.new(overwrite_css).to_s + "\n"
+        end
+      end
+
+      css
+    end
+
+    def append_plugin_css(css, current_file_name)
+      return css unless self.plugins.any?
+
+      plugin_css = ""
+
+      self.plugins.each do |plugin|
+        plugin_file_specific  = File.join(Blueprint::PLUGINS_PATH, plugin, current_file_name)
+        plugin_file_generic   = File.join(Blueprint::PLUGINS_PATH, plugin, "#{plugin}.css")
+
+        file = if File.exists?(plugin_file_specific)
+          plugin_file_specific
+        elsif File.exists?(plugin_file_generic) && current_file_name =~ /^screen|print/
+          plugin_file_generic
+        end
+
+        if file
+          puts "      + #{plugin} plugin\n"
+          plugin_css += "/* #{plugin} */\n"
+          plugin_css += CSSParser.new(File.path_to_string(file)).to_s + "\n"
+
+          Dir.glob(File.join(File.dirname(file), "**", "**")).each do |cp|
+            short_path = cp.gsub(/#{File.dirname(file)}./ , "")
+            # make directory if it doesn't exist
+            directory = File.dirname(short_path)
+            if directory != "."
+              FileUtils.mkdir_p(File.join(destination_path, directory))
+            end
+
+            unless File.directory?(File.join(File.dirname(file), short_path)) || cp == file
+              FileUtils.cp(cp, File.join(destination_path, short_path))
+            end
+          end
+        end
+      end
+
+      css += plugin_css
+    end
+
+    def append_semantic_classes
+      screen_output_path = File.join(self.destination_path, "screen.css")
+      semantic_classes = SemanticClassNames.new(:namespace => self.namespace,
+                                                :source_file => screen_output_path)
+      semantic_styles = semantic_classes.css_from_assignments(self.semantic_classes)
+      return if semantic_styles.blank?
+
+      css = File.path_to_string(screen_output_path)
+      css += "\n\n/* semantic class names */\n"
+      css += semantic_styles
+      File.string_to_file(css.rstrip, screen_output_path)
+    end
+
+    def generate_tests
+      puts "\n    Updating namespace to \"#{namespace}\" in test files:"
+      test_files = Compressor::TEST_FILES.map do |file|
+        File.join(Blueprint::TEST_PATH, *file.split(/\//))
+      end
+
+      test_files.each do |file|
+        puts "      + #{file}"
+        Namespace.new(file, namespace)
+      end
+    end
+
+    def output_header
+      puts "\n"
+      puts "  #{"*" * 100}"
+      puts "  **"
+      puts "  **   Blueprint CSS Compressor"
+      puts "  **"
+      puts "  **   Builds compressed files from the source directory."
+      puts "  **"
+      puts "  **   Loaded from settings.yml" if loaded_from_settings
+      puts "  **   Namespace: '#{namespace}'" unless namespace.blank?
+      puts "  **   Output to: #{destination_path}"
+      puts "  **   Grid Settings:"
+      puts "  **     - Column Count: #{self.custom_layout.column_count}"
+      puts "  **     - Column Width: #{self.custom_layout.column_width}px"
+      puts "  **     - Gutter Width: #{self.custom_layout.gutter_width}px"
+      puts "  **     - Total Width : #{self.custom_layout.page_width}px"
+      puts "  **"
+      puts "  #{"*" * 100}"
+    end
+
+    def output_footer
+      puts "\n\n"
+      puts "  #{"*" * 100}"
+      puts "  **"
+      puts "  **   Done!"
+      puts "  **   Your compressed files and test files are now up-to-date."
+      puts "  **"
+      puts "  #{"*" * 100}\n\n"
+    end
+
+    def css_file_header
+%(/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0
+ http://blueprintcss.org
+
+   * Copyright (c) 2007-Present. See LICENSE for more info.
+   * See README for instructions on how to use Blueprint.
+   * For credits and origins, see AUTHORS.
+   * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */)
+    end
+
+    def putsv(str)
+      puts str if $verbose
+    end
+  end
+end
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/core_ext.rb
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/core_ext.rb	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/core_ext.rb	(revision 319)
@@ -0,0 +1,39 @@
+class String
+  # see if string has any content
+  def blank?; self.length.zero?; end
+
+  # strip space after :, remove newlines, replace multiple spaces with only one space, remove comments
+  def strip_space!
+    replace self.gsub(/:\s*/, ":").gsub(/\n/, "").gsub(/\s+/, " ").gsub(/(\/\*).*?(\*\/)/, "")
+  end
+
+  # remove newlines, insert space after comma, replace two spaces with one space after comma
+  def strip_selector_space!
+    replace self.gsub(/\n/, "").gsub(",", ", ").gsub(",  ", ", ")
+  end
+
+  # remove leading whitespace, remove end whitespace
+  def strip_side_space!
+    replace self.gsub(/^\s+/, "").gsub(/\s+$/, $/)
+  end
+end
+
+class NilClass
+  def blank?
+    true
+  end
+end
+
+class File
+  # string output from file
+  def self.path_to_string(path)
+    File.new(path).read
+  end
+
+  # saves a string to a specified file path
+  def self.string_to_file(string, path)
+    directory = File.dirname(path)
+    FileUtils.mkdir_p directory unless File.directory?(directory)
+    File.open(path, "w") { |f| f << string }
+  end
+end
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/css_parser.rb
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/css_parser.rb	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/css_parser.rb	(revision 319)
@@ -0,0 +1,72 @@
+module Blueprint
+  # Strips out most whitespace and can return a hash or string of parsed data
+  class CSSParser
+    attr_accessor :namespace
+    attr_reader   :css_output, :raw_data
+
+    # ==== Options
+    # * <tt>css_string</tt> String of CSS data
+    # * <tt>options</tt>
+    #   * <tt>:namespace</tt> -- Namespace to use when generating output
+    def initialize(css_string = "", options = {})
+      @raw_data     = css_string
+      @namespace    = options[:namespace] || ""
+      compress(@raw_data)
+    end
+
+    # returns string of CSS which can be saved to a file or otherwise
+    def to_s
+      @css_output
+    end
+
+    # returns a hash of all CSS data passed
+    #
+    # ==== Options
+    # * <tt>data</tt> -- CSS string; defaults to string passed into the constructor
+    def parse(data = nil)
+      data ||= @raw_data
+
+      # wrapper array holding hashes of css tags/rules
+      css_out = []
+      # clear initial spaces
+      data.strip_side_space!.strip_space!
+
+      # split on end of assignments
+      data.split('}').each_with_index do |assignments, index|
+        # split again to separate tags from rules
+        tags, styles = assignments.split('{').map{|a| a.strip_side_space!}
+        unless styles.blank?
+          # clean up tags and apply namespaces as needed
+          tags.strip_selector_space!
+          tags.gsub!(/\./, ".#{namespace}") unless namespace.blank?
+
+          # split on semicolon to iterate through each rule
+          rules = []
+          styles.split(";").each do |key_val_pair|
+            unless key_val_pair.nil?
+              # split by property/val and append to rules array with correct declaration
+              property, value = key_val_pair.split(":", 2).map {|kv| kv.strip_side_space! }
+              break unless property && value
+              rules << "#{property}:#{value};"
+            end
+          end
+          # now keeps track of index as hashes don't keep track of position
+          # (which will be fixed in Ruby 1.9)
+          unless tags.blank? || rules.to_s.blank?
+            css_out << {:tags => tags, :rules => rules.join, :idx => index}
+          end
+        end
+      end
+      css_out
+    end
+
+    private
+
+    def compress(data)
+      @css_output = ""
+      parse(data).flatten.sort_by {|i| i[:idx]}.each do |line|
+        @css_output += "#{line[:tags]} {#{line[:rules]}}\n"
+      end
+    end
+  end
+end
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/custom_layout.rb
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/custom_layout.rb	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/custom_layout.rb	(revision 319)
@@ -0,0 +1,72 @@
+require 'erb'
+module Blueprint
+  # Generates a custom grid file, using ERB to evaluate custom settings
+  class CustomLayout
+    # path to ERB file used for CSS template
+    CSS_ERB_FILE = File.join(Blueprint::LIB_PATH, 'grid.css.erb')
+
+    attr_writer :column_count, :column_width, :gutter_width, :input_padding,
+                :input_border
+
+    # Column count of generated CSS.  Returns itself or Blueprint's default
+    def column_count
+      (@column_count || Blueprint::COLUMN_COUNT).to_i
+    end
+
+    # Column width (in pixels) of generated CSS.  Returns itself or Blueprint's default
+    def column_width
+      (@column_width || Blueprint::COLUMN_WIDTH).to_i
+    end
+
+    # Gutter width (in pixels) of generated CSS.  Returns itself or Blueprint's default
+    def gutter_width
+      (@gutter_width || Blueprint::GUTTER_WIDTH).to_i
+    end
+
+    def input_padding
+      (@input_padding || Blueprint::INPUT_PADDING).to_i
+    end
+
+    def input_border
+      (@input_border || Blueprint::INPUT_BORDER).to_i
+    end
+
+    # Returns page width (in pixels)
+    def page_width
+      column_count * (column_width + gutter_width) - gutter_width
+    end
+
+    # ==== Options
+    # * <tt>options</tt>
+    #   * <tt>:column_count</tt> -- Sets the column count of generated CSS
+    #   * <tt>:column_width</tt> -- Sets the column width (in pixels) of generated CSS
+    #   * <tt>:gutter_width</tt> -- Sets the gutter width (in pixels) of generated CSS
+    #   * <tt>:input_padding</tt> -- Sets the input padding width (in pixels) of generated CSS
+    #   * <tt>:input_border</tt> -- Sets the border width (in pixels) of generated CSS
+    def initialize(options = {})
+      @column_count   = options[:column_count]
+      @column_width   = options[:column_width]
+      @gutter_width   = options[:gutter_width]
+      @input_padding  = options[:input_padding]
+      @input_border   = options[:input_border]
+    end
+
+    # Boolean value if current settings are Blueprint's defaults
+    def default?
+      self.column_width == Blueprint::COLUMN_WIDTH &&
+      self.column_count == Blueprint::COLUMN_COUNT &&
+      self.gutter_width == Blueprint::GUTTER_WIDTH &&
+      self.input_padding == Blueprint::INPUT_PADDING &&
+      self.input_border == Blueprint::INPUT_BORDER
+    end
+
+    # Loads grid.css.erb file, binds it to current instance, and returns output
+    def generate_grid_css
+      # loads up erb template to evaluate custom widths
+      css = ERB::new(File.path_to_string(CustomLayout::CSS_ERB_FILE))
+
+      # bind it to this instance
+      css.result(binding)
+    end
+  end
+end
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/grid.css.erb
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/grid.css.erb	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/grid.css.erb	(revision 319)
@@ -0,0 +1,146 @@
+/* --------------------------------------------------------------
+
+   grid.css
+   * Sets up an easy-to-use grid of 24 columns.
+
+   By default, the grid is 950px wide, with 24 columns
+   spanning 30px, and a 10px margin between columns.
+
+   If you need fewer or more columns, namespaces or semantic
+   element names, use the compressor script (lib/compress.rb)
+
+-------------------------------------------------------------- */
+
+/* A container should group all your columns. */
+.container {
+  width: <%= page_width %>px;
+  margin: 0 auto;
+}
+
+/* Use this class on any .span-# / .container to see the grid. */
+.showgrid {
+  background: url(src/grid.png);
+}
+
+
+/* Columns
+-------------------------------------------------------------- */
+
+/* Sets up basic grid floating and margin. */
+.column, <%= (1..column_count).map {|c| ".span-#{c}" }.join(", ") %> {
+  float: left;
+  margin-right: <%= gutter_width %>px;
+}
+
+/* The last column in a row needs this class. */
+.last { margin-right: 0; }
+
+/* Use these classes to set the width of a column. */
+.span-1 {width: <%= column_width %>px;}
+<% (2..column_count-1).each do |column| %>
+.span-<%= column %> {width: <%= (column_width + ((column - 1) * (column_width + gutter_width))).to_i %>px;<%= "margin-right: 0;" if column == column_count %>}<% end %>
+.span-<%= column_count %> {width:<%= page_width %>px; margin-right:0;}
+
+/* Use these classes to set the width of an input. */
+<%= (1..column_count).map {|column| "input.span-#{column}, textarea.span-#{column}"}.join(", ") %> {
+  border-left-width: <%= input_border %>px;
+  border-right-width: <%= input_border %>px;
+  padding-left: <%= input_padding %>px;
+  padding-right: <%= input_padding %>px;
+}
+<% (1..column_count).each do |column| %>
+input.span-<%= column %>, textarea.span-<%= column %> { width: <%= ((column_width + gutter_width) * (column - 1) + column_width - 2*(input_padding + input_border))%>px; }<% end %>
+
+/* Add these to a column to append empty cols. */
+<% (1..(column_count-1)).each do |column| %>
+.append-<%= column %> { padding-right: <%= (column * (column_width + gutter_width)).to_i %>px;}<% end %>
+
+/* Add these to a column to prepend empty cols. */
+<% (1..(column_count-1)).each do |column| %>
+.prepend-<%= column %> { padding-left: <%= (column * (column_width + gutter_width)).to_i %>px;}<% end %>
+
+
+/* Border on right hand side of a column. */
+.border {
+  padding-right: <%= (gutter_width * 0.5 - 1).to_i %>px;
+  margin-right: <%= (gutter_width * 0.5).to_i %>px;
+  border-right: 1px solid #ddd;
+}
+
+/* Border with more whitespace, spans one column. */
+.colborder {
+  padding-right: <%= (column_width + 2*gutter_width - 1)/2.to_i %>px;
+  margin-right: <%= (column_width + 2 * gutter_width)/2.to_i %>px;
+  border-right: 1px solid #ddd;
+}
+
+
+/* Use these classes on an element to push it into the
+next column, or to pull it into the previous column.  */
+
+<% (1..column_count).each do |column| %>
+.pull-<%= column %> { margin-left: -<%= (column * (column_width + gutter_width)).to_i %>px; }<% end %>
+
+<%= (1..column_count).map {|c| ".pull-#{c}" }.join(", ") %> {float: left; position:relative;}
+
+<% (1..(column_count)).each do |column| %>
+.push-<%= column %> { margin: 0 -<%= (column * (column_width + gutter_width)).to_i %>px 1.5em <%= (column * (column_width + gutter_width)).to_i %>px; }<% end %>
+
+<%= (1..column_count).map {|c| ".push-#{c}" }.join(", ") %> {float: left; position:relative;}
+
+
+/* Misc classes and elements
+-------------------------------------------------------------- */
+
+/* In case you need to add a gutter above/below an element */
+div.prepend-top, .prepend-top {
+  margin-top:1.5em;
+}
+div.append-bottom, .append-bottom {
+  margin-bottom:1.5em;
+}
+
+/* Use a .box to create a padded box inside a column.  */
+.box {
+  padding: 1.5em;
+  margin-bottom: 1.5em;
+  background: #e5eCf9;
+}
+
+/* Use this to create a horizontal ruler across a column. */
+hr {
+  background: #ddd;
+  color: #ddd;
+  clear: both;
+  float: none;
+  width: 100%;
+  height: 1px;
+  margin: 0 0 1.45em;
+  border: none;
+}
+
+hr.space {
+  background: #fff;
+  color: #fff;
+  visibility: hidden;
+}
+
+
+/* Clearing floats without extra markup
+   Based on How To Clear Floats Without Structural Markup by PiE
+   [http://www.positioniseverything.net/easyclearing.html] */
+
+.clearfix:after, .container:after {
+  content: "\0020";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+  overflow:hidden;
+}
+.clearfix, .container {display: block;}
+
+/* Regular clearing
+   apply to column that should drop below previous ones. */
+
+.clear { clear:both; }
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/grid_builder.rb
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/grid_builder.rb	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/grid_builder.rb	(revision 319)
@@ -0,0 +1,63 @@
+begin
+  require "rubygems"
+  gem "rmagick"
+  require "rvg/rvg"
+rescue Exception => e
+  puts "  #{"*" * 100}"
+  puts "  **"
+  puts "  **   Warning:"
+  puts "  **   Could not load the Rmagick gem.  Please check your installation."
+  puts "  **   grid.png will not be generated."
+  puts "  **"
+  puts "  #{"*" * 100}\n"
+end
+
+module Blueprint
+  # Uses ImageMagick and RMagick to generate grid.png file
+  class GridBuilder
+    begin
+      include Magick
+    rescue Exception => e
+    end
+
+    attr_reader :column_width, :gutter_width, :output_path, :able_to_generate
+
+    # ==== Options
+    # * <tt>options</tt>
+    #   * <tt>:column_width</tt> -- Width (in pixels) of current grid column
+    #   * <tt>:gutter_width</tt> -- Width (in pixels) of current grid gutter
+    #   * <tt>:output_path</tt> -- Output path of grid.png file
+    def initialize(options={})
+      @able_to_generate = Magick::Long_version rescue false
+      return unless @able_to_generate
+      @column_width = options[:column_width] || Blueprint::COLUMN_WIDTH
+      @gutter_width = options[:gutter_width] || Blueprint::GUTTER_WIDTH
+      @output_path  = options[:output_path]  || Blueprint::SOURCE_PATH
+    end
+
+    # generates (overwriting if necessary) grid.png image to be tiled in background
+    def generate!
+      return false unless self.able_to_generate
+      total_width = self.column_width + self.gutter_width
+      height = 18
+      RVG::dpi = 100
+
+      width_in_inches = (total_width.to_f/RVG::dpi).in
+      height_in_inches = (height.to_f/RVG::dpi).in
+      rvg = RVG.new(width_in_inches, height_in_inches).viewbox(0, 0, total_width, height) do |canvas|
+        canvas.background_fill = "white"
+
+        canvas.g do |column|
+          column.rect(self.column_width - 1, height).styles(:fill => "#e8effb")
+        end
+
+        canvas.g do |baseline|
+          baseline.line(0, (height - 1), total_width, (height - 1)).styles(:fill => "#e9e9e9")
+        end
+      end
+
+      FileUtils.mkdir self.output_path unless File.exists? self.output_path
+      rvg.draw.write(File.join(self.output_path, "grid.png"))
+    end
+  end
+end
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/namespace.rb
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/namespace.rb	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/namespace.rb	(revision 319)
@@ -0,0 +1,38 @@
+module Blueprint
+  class Namespace
+
+    # Read html to string, remove namespace if any,
+    # set the new namespace, and update the test file.
+    def initialize(path, namespace)
+      html = File.path_to_string(path)
+      remove_current_namespace(html)
+      add_namespace(html, namespace)
+      File.string_to_file(html, path)
+    end
+
+    # adds namespace to BP classes in a html file
+    def add_namespace(html, namespace)
+      html.gsub!(/(class=")([a-zA-Z0-9\-_ ]*)(")/) do |m|
+        classes = m.to_s.split('"')[1].split(" ")
+        classes.map! { |c| c = namespace + c }
+        'class="' + classes.join(' ') + '"'
+      end
+      html
+    end
+
+    # removes a namespace from a string of html
+    def remove_current_namespace(html)
+      current = current_namespace(html)
+      html.gsub!(current, "")
+      html
+    end
+
+    # returns current namespace in test files
+    # based on container class
+    def current_namespace(html)
+      html =~ /class="([\S]+)container/
+      current_namespace = $1 if $1
+      current_namespace || ""
+    end
+  end
+end
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/semantic_class_names.rb
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/semantic_class_names.rb	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/semantic_class_names.rb	(revision 319)
@@ -0,0 +1,64 @@
+module Blueprint
+  # parses a hash of key/value pairs, key being output CSS selectors, value
+  # being a list of CSS selectors to draw from
+  class SemanticClassNames
+    attr_accessor :class_assignments
+    attr_reader   :namespace, :source_file
+
+    # ==== Options
+    # * <tt>options</tt>
+    #   * <tt>:namespace</tt> -- Namespace to be used when matching CSS selectors to draw from
+    #   * <tt>:source_file</tt> -- Source file to use as reference of CSS selectors.  Defaults to Blueprint's generated screen.css
+    #   * <tt>:class_assignments</tt> -- Hash of key/value pairs, key being output CSS selectors, value being a list of CSS selectors to draw from
+    def initialize(options = {})
+      @namespace = options[:namespace] || ""
+      @source_file = options[:source_file] || File.join(Blueprint::BLUEPRINT_ROOT_PATH, "screen.css")
+      self.class_assignments = options[:class_assignments] || {}
+    end
+
+    # Returns a CSS string of semantic selectors and associated styles
+    # ==== Options
+    # * <tt>assignments</tt> -- Hash of key/value pairs, key being output CSS selectors, value being a list of CSS selectors to draw from; defaults to what was passed in constructor or empty hash
+    def css_from_assignments(assignments = {})
+      assignments ||= self.class_assignments
+
+      # define a wrapper hash to hold all the new CSS assignments
+      output_css = {}
+
+      #loads full stylesheet into an array of hashes
+      blueprint_assignments = CSSParser.new(File.path_to_string(self.source_file)).parse
+
+      # iterates through each class assignment ('#footer' => '.span-24', '#header' => '.span-24')
+      assignments.each do |semantic_class, blueprint_classes|
+        # gathers all BP classes we're going to be mimicing
+        blueprint_classes = blueprint_classes.split(/,|\s/).select {|c| !c.blank? }.flatten.map {|c| c.strip }
+        classes = []
+        # loop through each BP class, grabbing the full hash (containing tags, index, and CSS rules)
+        blueprint_classes.each do |bp_class|
+          match = if bp_class.include?(".")
+                    bp_class.gsub(".", ".#{self.namespace}")
+                  else
+                    ".#{self.namespace}#{bp_class}"
+                  end
+          classes << blueprint_assignments.select do |line|
+            line[:tags] =~ Regexp.new(/^([\w\.\-\:]+, ?)*#{match}(, ?[\w\.\-\:]+)*$/)
+          end.uniq
+        end
+
+        # clean up the array
+        classes = classes.flatten.uniq
+
+        # set the semantic class to the rules gathered in classes, sorted by index
+        # this way, the styles will be applied in the correct order from top of file to bottom
+        output_css[semantic_class] = "#{classes.sort_by {|i| i[:idx] }.map {|i| i[:rules] }}"
+      end
+
+      # return the css in proper format
+      css = ""
+      output_css.each do |tags, rules|
+        css += "#{tags} {#{rules}}\n"
+      end
+      css
+    end
+  end
+end
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validate/COPYRIGHT.html
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validate/COPYRIGHT.html	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validate/COPYRIGHT.html	(revision 319)
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang='en' lang='en'>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<link rel="stylesheet" type="text/css" href="http://www.w3.org/StyleSheets/base.css" />
+<title>W3C IPR SOFTWARE NOTICE</title>
+</head>
+<body>
+<h1>W3C<sup>&reg;</sup> SOFTWARE NOTICE AND LICENSE</h1>
+
+<h3>Copyright &copy; 1997-2002 <a href="http://www.w3.org/">World
+Wide Web Consortium</a>, (<a
+href="http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de
+Recherche en Informatique et en Automatique</a>, <a
+href="http://www.keio.ac.jp/">Keio University</a>). All Rights
+Reserved. http://www.w3.org/Consortium/Legal/</h3>
+
+<p>This W3C work (including software, documents, or other related
+items) is being provided by the copyright holders under the
+following license. By obtaining, using and/or copying this work,
+you (the licensee) agree that you have read, understood, and will
+comply with the following terms and conditions:</p>
+
+<p>Permission to use, copy, modify, and distribute this software
+and its documentation, with or without modification,&nbsp; for any
+purpose and without fee or royalty is hereby granted, provided that
+you include the following on ALL copies of the software and
+documentation or portions thereof, including modifications, that
+you make:</p>
+
+<ol>
+<li>The full text of this NOTICE in a location viewable to users of
+the redistributed or derivative work.</li>
+
+<li>Any pre-existing intellectual property disclaimers, notices, or
+terms and conditions. If none exist, a short notice of the
+following form (hypertext is preferred, text is permitted) should
+be used within the body of any redistributed or derivative code:
+"Copyright &copy; [$date-of-software] <a
+href="http://www.w3.org/">World Wide Web Consortium</a>, (<a
+href="http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de
+Recherche en Informatique et en Automatique</a>, <a
+href="http://www.keio.ac.jp/">Keio University</a>). All Rights
+Reserved. http://www.w3.org/Consortium/Legal/"</li>
+
+<li>Notice of any changes or modifications to the W3C files,
+including the date changes were made. (We recommend you provide
+URIs to the location from which the code is derived.)</li>
+</ol>
+
+<p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND
+COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
+USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD
+PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
+
+<p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
+SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE
+SOFTWARE OR DOCUMENTATION.</p>
+
+<p>The name and trademarks of copyright holders may NOT be used in
+advertising or publicity pertaining to the software without
+specific, written prior permission. Title to copyright in this
+software and any associated documentation will at all times remain
+with copyright holders.</p>
+
+<p>____________________________________</p>
+
+<p>This formulation of W3C's notice and license became active on
+August 14 1998 so as to improve compatibility with GPL. This
+version ensures that W3C software licensing terms are no more
+restrictive than GPL and consequently W3C software may be
+distributed in GPL packages. See the <a
+href="copyright-software-19980519.html">older formulation</a> for
+the policy prior to this date. Please see our <a
+href="IPR-FAQ.html">Copyright FAQ</a> for common questions about
+using materials from our site, including specific terms and
+conditions for packages like libwww, Amaya, and Jigsaw. Other
+questions about this notice can be directed to <a
+href="mailto:site-policy@w3.org">site-policy@w3.org</a>.<br />
+&nbsp;</p>
+
+<p>&nbsp;</p>
+
+<address><a href="http://www.w3.org/Help/Webmaster.html">webmaster</a><br />
+ (last updated $Date: 2004/05/29 04:04:36 $)</address>
+
+</body>
+</html>
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validate/JIGSAW_COPYRIGHT
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validate/JIGSAW_COPYRIGHT	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validate/JIGSAW_COPYRIGHT	(revision 319)
@@ -0,0 +1,64 @@
+W3C IPR SOFTWARE NOTICE
+
+Copyright © 1995-1998 World Wide Web Consortium, (Massachusetts Institute of
+Technology, Institut National de Recherche en Informatique et en
+Automatique, Keio University). All Rights Reserved.
+http://www.w3.org/Consortium/Legal/
+
+This W3C work (including software, documents, or other related items) is
+being provided by the copyright holders under the following license. By
+obtaining, using and/or copying this work, you (the licensee) agree that you
+have read, understood, and will comply with the following terms and
+conditions:
+
+Permission to use, copy, and modify this software and its documentation,
+with or without modification,  for any purpose and without fee or royalty is
+hereby granted, provided that you include the following on ALL copies of the
+software and documentation or portions thereof, including modifications,
+that you make:
+
+  1. The full text of this NOTICE in a location viewable to users of the
+     redistributed or derivative work.
+  2. Any pre-existing intellectual property disclaimers, notices, or terms
+     and conditions. If none exist, a short notice of the following form
+     (hypertext is preferred, text is permitted) should be used within the
+     body of any redistributed or derivative code: "Copyright © World Wide
+     Web Consortium, (Massachusetts Institute of Technology, Institut
+     National de Recherche en Informatique et en Automatique, Keio
+     University). All Rights Reserved. http://www.w3.org/Consortium/Legal/"
+  3. Notice of any changes or modifications to the W3C files, including the
+     date changes were made. (We recommend you provide URIs to the location
+     from which the code is derived).
+
+In addition, creators of derivitive works must include the full text of this
+NOTICE in a location viewable to users of the derivitive work.
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
+MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
+PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE
+ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
+DOCUMENTATION.
+
+The name and trademarks of copyright holders may NOT be used in advertising
+or publicity pertaining to the software without specific, written prior
+permission. Title to copyright in this software and any associated
+documentation will at all times remain with copyright holders.
+
+____________________________________
+
+This formulation of W3C's notice and license became active on August 14
+1998. See the older formulation for the policy prior to this date. Please
+see our Copyright FAQ for common questions about using materials from our
+site, including specific terms and conditions for packages like libwww,
+Amaya, and Jigsaw. Other questions about this notice can be directed to
+site-policy@w3.org .
+
+
+
+
+webmaster
+(last updated 14-Aug-1998)
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validate/README.html
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validate/README.html	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validate/README.html	(revision 319)
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>CSS Validator Binary Distribution - Illumit</title>
+    <link title="RSS Feed" type="application/rss+xml" rel="alternate" href="http://www.illumit.com/site.rss" />
+  </head>
+  <body>
+    <h1>CSS Validator Binary Distribution</h1>
+    <p>This a binary distribution of <a href="http://jigsaw.w3.org/css-validator">W3C CSS Validator</a>.
+    It was built from the <a href="http://dev.w3.org/cvsweb/2002/css-validator">source</a> on June 25, 2006. 
+    No modifications were made.</p>
+    
+    <p>This distribution is provided <a href="#asis">as is</a> to make testing a large number of CSS files easier.</p>
+    
+    
+    <h2>Requirements</h2>
+    <p>A Java 2 Virtual Machine is required to use the validator. 
+      You can download one from <a href="http://java.sun.com/">Sun</a> if you do not have one installed.</p>
+      
+    <h2>Usage</h2>
+    <h2>Summary</h2>
+    <p><code>java -jar <samp>~/css-validator/</samp>css-validator.jar [-options] files URLs</code></p>
+    <h2>Sample</h2>
+    <pre>
+    java -jar ~/css-validator/css-validator.jar f1.css http://illumit.com/
+    </pre>
+    <h2>Options</h2>
+    <dl>
+      <dt>-e</dt><dd>Show errors only.</dd>
+      <dt>-html</dt><dd>Output HTML.</dd>
+      <dt>-css1 | -css2 | -css21 | -css3 | -svg | -svgbasic | -svgtiny</dt>
+      <dd>Specify CSS version. CSS2 is the default.</dd>
+    </dl>
+
+    <h2>Support</h2>
+    
+    <p>If you have questions about how this distribution is built or packaged, 
+    <a href="mailto:contact@illumit.com">mailto:contact@illumit.com</a>.</p>
+
+    <p>Use the CSS Validator <a href="http://jigsaw.w3.org/css-validator/Email">Feedback</a> 
+      page if you have any questions or problems with the validator itself.</p>
+
+    <p class="Footnote">Updates are announced on via 
+        <a class="RSSLink" rel="alternate" type="application/rss+xml" href="http://www.illumit.com/site.rss">RSS</a></p>
+
+      <!--    
+    <h2>Contents</h2>
+    <ul>
+      <li><a href="css-validator.jar">css-validator.jar</a> Executable JAR package</li>
+      <li><a href="COPYRIGHT.html">COPYRIGHT.html</a> CSS Validator Copyright Notice</li>
+      <li><a href="css-validator-javadoc.jar">css-validator-javadoc.jar</a> CSS Validator API Docs</li>
+      <li>Required libraries:<ul>
+        <li><a href="jigsaw.jar">jigsaw.jar</a> and <a href="JIGSAW_COPYRIGHT">JIGSAW_COPYRIGHT</a></li>
+        <li><a href="xerces.jar">xerces.jar</a> and <a href="XERCES_COPYING.txt">XERCES_COPYING.txt</a></li>
+        </ul>
+      </li>
+    </ul>
+      -->
+    
+    <h2>Download</h2>
+    
+    <p>Download the css validator binary distribution <a href="css-validator.zip">css-validator.zip</a>. Extract the files (OS X and *ix users can use unzip).</p>
+    
+    
+    <h2><a name="asis">License Agreement</a></h2>
+    
+    <p>This is a binary distribution of <a href="http://jigsaw.w3.org/css-validator">W3C CSS Validator</a> Version 2.0
+    It was built from the <a href="http://dev.w3.org/cvsweb/2002/css-validator">source</a> on June 25, 2006. 
+    No modifications were made to the source.</p>
+    
+    <p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND 
+ILLUMIT L.L.C AND THE COPYRIGHT HOLDERS (W3C) MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
+USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD
+PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
+
+<p>ILLUMIT L.L.C AND THE COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
+SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE
+SOFTWARE OR DOCUMENTATION.</p>
+
+  </body>
+</html>
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validate/XERCES_COPYING.txt
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validate/XERCES_COPYING.txt	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validate/XERCES_COPYING.txt	(revision 319)
@@ -0,0 +1,56 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:  
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xerces" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written 
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
Index: /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validator.rb
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validator.rb	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/blueprint/validator.rb	(revision 319)
@@ -0,0 +1,49 @@
+module Blueprint
+  # Validates generated CSS against the W3 using Java
+  class Validator
+    attr_reader :error_count
+
+    def initialize
+      @error_count = 0
+    end
+
+    # Validates all three CSS files
+    def validate
+      java_path = `which java`.rstrip
+      raise "You do not have a Java installed, but it is required." if java_path.blank?
+
+      output_header
+
+      Blueprint::CSS_FILES.keys.each do |file_name|
+        css_output_path = File.join(Blueprint::BLUEPRINT_ROOT_PATH, file_name)
+        puts "\n\n  Testing #{css_output_path}"
+        puts "  Output ============================================================\n\n"
+        @error_count += 1 if !system("#{java_path} -jar '#{Blueprint::VALIDATOR_FILE}' -e '#{css_output_path}'")
+      end
+
+      output_footer
+    end
+
+    private
+
+    def output_header
+      puts "\n\n"
+      puts "  ************************************************************"
+      puts "  **"
+      puts "  **   Blueprint CSS Validator"
+      puts "  **   Validates output CSS files"
+      puts "  **"
+      puts "  ************************************************************"
+    end
+
+    def output_footer
+      puts "\n\n"
+      puts "  ************************************************************"
+      puts "  **"
+      puts "  **   Done!"
+      puts "  **   Your CSS files are#{" not" if error_count > 0} valid.#{"  You had #{error_count} error(s) within your files" if error_count > 0}"
+      puts "  **"
+      puts "  ************************************************************"
+    end
+  end
+end
Index: /ether_2012/web/resources/css/blueprint-css/lib/compress.rb
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/compress.rb	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/compress.rb	(revision 319)
@@ -0,0 +1,167 @@
+#!/usr/bin/env ruby
+require File.join(File.dirname(__FILE__), "blueprint", "blueprint")
+
+# **Basic
+#
+#   Calling this file by itself will pull files from blueprint/src and
+#   concatenate them into three files; ie.css, print.css, and screen.css.
+#
+#     ruby compress.rb
+#
+#   However, argument variables can be set to change how this works.
+#
+#   Calling
+#
+#     ruby compress.rb -h
+#
+#   will reveal basic arguments you can pass to the compress.rb file.
+#
+# **Custom Settings
+#
+#   To use custom settings, the file need to be stored in settings.yml within
+#   this directory.  An example YAML file has been included.
+#
+#   Another ability is to use YAML (spec is at http://www.yaml.org/spec/1.1/)
+#   for project settings in a predefined structure and store all pertinent
+#   information there.  The YAML file has multiple keys (usually a named
+#   project) with a set of data that defines that project.  A sample structure
+#   can be found in settings.example.yml.
+#
+#   The basic structure is this:
+#
+#     Root nodes are project names.  You use these when calling compress.rb as such:
+#
+#       ruby compress.rb -p PROJECTNAME
+#
+#     A sample YAML with only roots and output paths would look like this:
+#
+#       project1:
+#         path: /path/to/my/project/stylesheets
+#       project2:
+#         path: /path/to/different/stylesheets
+#       project3:
+#         path: /path/to/another/projects/styles
+#
+#     You can then call
+#
+#       ruby compress.rb -p project1
+#
+#       or
+#
+#       ruby compress.rb -p project3
+#
+#     This would compress and export Blueprints CSS to the respective directory,
+#     checking for my-(ie|print|screen).css and appending it if present
+#
+#   A more advanced structure would look like this:
+#
+#       project1:
+#         path: /path/to/my/project/stylesheets
+#         namespace: custom-namespace-1-
+#         custom_css:
+#           ie.css:
+#             - custom-ie.css
+#           print.css:
+#             - docs.css
+#             - my-print-styles.css
+#           screen.css:
+#             - subfolder-of-stylesheets/sub_css.css
+#         custom_layout:
+#            column_count: 12
+#            column_width: 70
+#            gutter_width: 10
+#       project2:
+#         path: /path/to/different/stylesheets
+#         namespace: different-namespace-
+#         custom_css:
+#           screen.css:
+#             - custom_screen.css
+#         semantic_classes:
+#           "#footer, #header": column span-24 last
+#           "#content": column span-18 border
+#           "#extra-content": last span-6 column
+#           "div#navigation": last span-24 column
+#           "div.section, div.entry, .feeds": span-6 column
+#         plugins:
+#           - fancy-type
+#           - buttons
+#           - validations
+#       project3:
+#         path: /path/to/another/projects/styles
+#
+#     In a structure like this, a lot more assignment is occurring.  Custom
+#     namespaces are being set for two projects, while the third (project3)
+#     is just a simple path setting.
+#
+#     Also, custom CSS is being used that is appended at the end of its respective
+#     file.  So, in project1, print.css will have docs.css and my-print-styles.css
+#     instead of the default my-print.css.  Note that these files are relative
+#     to the path that you defined above; you can use subdirectories from the
+#     default path if you would like.
+#
+#     Another thing to note here is the custom_layout; if not defined, your
+#     generated CSS will default to the 24 column, 950px wide grid that has been
+#     standard with Blueprint for quite some time.  However, you can specify a
+#     custom grid setup if you would like.  The three options are column_count
+#     (the number of columns you want your grid to have), column width (the
+#     width in pixels that you want your columns to be), and gutter_width (the
+#     width in pixels you want your gutters - space between columns - to be).
+#     To use the Blueprint default, do not define this in your settings file.
+#
+#     Semantic classes are still in the works within Blueprint, but a simple
+#     implementation has been created.
+#
+#     Defining semantic_classes, with nodes underneath, will generate a class
+#     for each node which has rules of each class assigned to it.  For example,
+#     in project2 above, for '#footer, #header', elements with id's of footer
+#     and header will be assigned all the rules from the classes 'span-24,
+#     column, and last', while divs with classes either entry or section, as
+#     well as any element with class of feed, is assigned all the rules from
+#     'span-6 and column'.  Although it is a crude way do accomplish this, it
+#     keeps the generated CSS separate from the core BP CSS.
+#
+#     Also supported is plugins.  The compressor looks withinBLUEPRINT_DIR/blueprint/plugins
+#     to match against what's passed.  If the plugin name matches, it will append
+#     PLUGIN/(screen|print|ie).css to the corresponding CSS file.  It will append
+#     the plugin CSS to all three CSS files if there is a CSS file present named
+#     as the plugin (e.g. the fancy-type plugin with a fancy-type.css file found
+#     within the plugin directory)
+#
+#     In Ruby, the structure would look like this:
+#
+#     {
+#       'project1' => {
+#         'path' => '/path/to/my/project/stylesheets',
+#         'namespace' => 'custom-namespace-1-',
+#         'custom_css' => {
+#           'ie.css' => ['custom-ie.css'],
+#           'print.css' => ['docs.css', 'my-print-styles.css'],
+#           'screen.css' => ['subfolder-of-stylesheets/sub_css.css']
+#         },
+#         'custom_layout' => {
+#           'column_count' => 12,
+#           'column_width' => 70,
+#           'gutter_width' => 10
+#         }
+#       },
+#       'project2' => {
+#         'path' => '/path/to/different/stylesheets',
+#         'namespace' => 'different-namespace-',
+#         'custom_css' => {
+#           'screen.css' => ['custom_screen.css']
+#         },
+#         'semantic_classes' => {
+#           '#footer, #header' => 'column span-24 last',
+#           '#content' => 'column span-18 border',
+#           '#extra-content' => 'last span-6 column',
+#           'div#navigation' => 'last span-24 column',
+#           'div.section, div.entry, .feeds' => 'span-6 column'
+#         },
+#         'plugins' => ['fancy-type', 'buttons', 'validations']
+#       },
+#       'project3' => {
+#         'path' => '/path/to/another/projects/styles'
+#       }
+#     }
+
+Blueprint::Compressor.new.generate!
Index: /ether_2012/web/resources/css/blueprint-css/lib/settings.example.yml
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/settings.example.yml	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/settings.example.yml	(revision 319)
@@ -0,0 +1,33 @@
+# refer to http://www.yaml.org/spec/1.1/ for clarification on YAML collections
+project1:
+  path: /path/to/my/project/stylesheets
+  namespace: custom-namespace-1-
+  custom_css:
+    ie.css:
+      - custom-ie.css
+    print.css:
+      - docs.css
+      - my-print-styles.css
+    screen.css:
+      - subfolder-of-stylesheets/sub_css.css
+  custom_layout:
+    column_count: 12
+    column_width: 70
+    gutter_width: 10
+  plugins:
+    - fancy-type
+    - buttons
+project2:
+  path: /path/to/different/stylesheets
+  namespace: different-namespace-
+  custom_css:
+    screen.css:
+      - custom_screen.css
+  semantic_classes:
+    "#footer, #header": ".span-24"
+    "#content": ".span-17, .colborder"
+    "#extra-content": ".span-6"
+    "div#navigation": ".span_24"
+    "div.section, div.entry, .feeds": ".span-6"
+project3:
+  path: /path/to/another/projects/styles
Index: /ether_2012/web/resources/css/blueprint-css/lib/validate.rb
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/lib/validate.rb	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/lib/validate.rb	(revision 319)
@@ -0,0 +1,15 @@
+#!/usr/bin/env ruby
+
+require "blueprint/blueprint"
+require "blueprint/validator"
+
+# This script will validate the core Blueprint files.
+#
+# The files are not completely valid. This has to do
+# with a small number of CSS hacks needed to ensure
+# consistent rendering across browsers.
+#
+# To add your own CSS files for validation, see
+# /lib/blueprint/validator.rb
+
+Blueprint::Validator.new.validate
Index: /ether_2012/web/resources/css/blueprint-css/tests/index.html
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/tests/index.html	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/tests/index.html	(revision 319)
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint test pages</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+    <style type="text/css" media="screen">
+      p, table, hr, .box { margin-bottom:25px; }
+      .box p { margin-bottom:10px; }
+    </style>
+  </head>
+  <body>
+
+    <div class="container">
+      <h1>Blueprint test pages</h1>
+      <hr>
+
+      <p>Welcome to the Blueprint test pages. The HTML files below test most HTML elements, as well as most classes provided by Blueprint.</p>
+
+      <table border="0" cellspacing="0" cellpadding="0">
+      	<thead>
+	        <tr>
+  	        <th class="span-6">Test page</th>
+    	    	<th class="span-8">Main files tested</th>
+      	  	<th class="span-10">Description</th>
+        	</tr>
+        </thead>
+        <tbody>
+					<tr>
+						<td><a href="parts/sample.html">Sample page</a></td>
+						<td>
+							<a href="../blueprint/src/grid.css">grid.css</a>,
+							<a href="../blueprint/src/typography.css">typography.css</a>
+						</td>
+						<td>A simple sample page, with common elements.</td>
+					</tr>
+					<tr class="even">
+						<td><a href="parts/grid.html">Grid</a></td>
+						<td>
+							<a href="../blueprint/src/grid.css">grid.css</a>
+						</td>
+						<td>Tests classes provided by grid.css.</td>
+					</tr>
+					<tr>
+						<td><a href="parts/elements.html">Typography</a></td>
+						<td>
+							<a href="../blueprint/src/typography.css">typography.css</a>
+						</td>
+						<td>Tests HTML elements which gets set in typography.css.</td>
+					</tr>
+					<tr class="even">
+						<td><a href="parts/forms.html">Forms</a></td>
+						<td>
+							<a href="../blueprint/src/forms.css">forms.css</a>
+						</td>
+						<td>Tests classes and default look provided by forms.css.</td>
+					</tr>
+				</tbody>
+      </table>
+
+      <p><em><strong>Note about the compressed versions:</strong></em>
+      These test files utilize the compressed files. In other words, if you change any of the source files,
+      you'll have to re-compress them with the ruby script in the scripts folder to see any&nbsp;changes.</p>
+
+      <div class="box">
+        <p>For more information and help, try these resources:</p>
+        <ul class="bottom">
+          <li><a href="http://blueprintcss.org">The Blueprint home page</a></li>
+          <li><a href="http://github.com/joshuaclayton/blueprint-css/wikis/home">The Blueprint Wiki</a></li>
+          <li><a href="http://groups.google.com/group/blueprintcss">The Blueprint mailing list</a></li>
+        </ul>
+      </div>
+
+      <p><a href="http://validator.w3.org/check?uri=referer">
+        <img src="parts/valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="top"></a></p>
+
+    </div>
+  </body>
+</html>
Index: /ether_2012/web/resources/css/blueprint-css/tests/parts/elements.html
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/tests/parts/elements.html	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/tests/parts/elements.html	(revision 319)
@@ -0,0 +1,247 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint HTML Elements Tests</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+
+  </head>
+  <body>
+
+    <div class="container showgrid">
+      <h2>Tests for common HTML elements</h2>
+      <hr>
+      <h5>PARAGRAPHS <span class="alt">&amp;</span> BOXES</h5>
+      <div class="span-8">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor <sub>sub text</sub> ut labore et <sup>sup text</sup> magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+      </div>
+
+      <div class="span-8">
+        <p class="small">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        <p class="large">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+      </div>
+
+      <div class="span-8 last">
+
+        <div class="box">
+          <p class="last">Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+        </div>
+        <blockquote>
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+        </blockquote>
+
+      </div>
+      <hr>
+
+      <h5>LISTS</h5>
+
+      <div class="span-8">
+        <ul>
+          <li>Unordered list test</li>
+          <li>Another list element. Lorem ipsum dolor sit amet, consectetur adipisicing elit.</li>
+          <li>Yet another element in the list</li>
+          <li>Some long text. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Lorem ipsum dolor sit amet, consectetur adipisicing elit.</li>
+        </ul>
+        <ol>
+          <li>Ordered list test</li>
+          <li>Another list element</li>
+          <li>Yet another element in the list</li>
+        </ol>
+      </div>
+
+      <div class="span-8">
+        <ol>
+          <li>Ordered list</li>
+          <li>Here's a nested unordered list
+          <ul>
+            <li>Nested Unordered list</li>
+            <li>Nested ordered list
+            <ol>
+              <li>The first</li>
+              <li>And the second</li>
+            </ol>
+            </li>
+          </ul>
+          </li>
+          <li>Ordered List item</li>
+          <li>Nested Ordered list
+          <ol>
+            <li>Some point</li>
+            <li>Nested Unordered list
+            <ul>
+              <li>The first</li>
+              <li>And the second</li>
+            </ul>
+            </li>
+          </ol>
+          </li>
+        </ol>
+      </div>
+
+      <div class="span-8 last">
+        <dl>
+          <dt>definition list dt</dt>
+          <dd>definition list dd</dd>
+          <dt>definition list dt</dt>
+          <dd>definition list dd</dd>
+          <dt>Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</dt>
+          <dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</dd>
+          <dt>Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</dt>
+          <dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</dd>
+        </dl>
+      </div>
+      <hr>
+
+      <h5>HEADINGS</h5>
+
+      <div class="span-8">
+        <h1>H1: Lorem ipsum dolor sit amet</h1>
+        <h2>H2: Lorem ipsum dolor sit amet, consectetur elit</h2>
+        <h3>H3: Lorem ipsum dolor sit amet, consectetur adipisicing elit</h3>
+        <h4>H4: Lorem ipsum dolor sit amet, consectetur adipisicing elit adipis</h4>
+        <h5>H5: Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</h5>
+        <h6>H6: Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</h6>
+      </div>
+
+      <div class="span-8">
+        <h1>Heading 1</h1><hr>
+        <h2>Heading 2</h2><hr>
+        <h3>Heading 3</h3><hr>
+        <h4>Heading 4</h4><hr>
+        <h5>Heading 5</h5><hr>
+        <h6>Heading 6</h6>
+      </div>
+
+      <div class="span-8 last">
+        <h1>Heading 1</h1>
+        <h2>Heading 2</h2>
+        <h3>Heading 3</h3>
+        <h4>Heading 4</h4>
+        <h5>Heading 5</h5>
+        <h6>Heading 6</h6>
+      </div>
+      <hr>
+
+      <h5>MISC ELEMENTS</h5>
+
+      <div class="span-8">
+        <p>
+          <strong>&lt;strong&gt;</strong><br>
+          <del>&lt;del&gt; deleted</del><br>
+          <dfn>&lt;dfn&gt; dfn</dfn><br>
+          <em>&lt;em&gt; emphasis</em>
+        </p>
+        <p>
+          <a>&lt;a&gt; anchor</a><br>
+          <a href="#">&lt;a&gt; a + href</a>
+        </p>
+        <p>
+          <abbr title="extended abbr text should show when mouse over">&lt;abbr&gt; abbr - extended text when mouseover.</abbr><br>
+          <acronym title="extended acronym text should show when mouse over">&lt;acronym&gt; acronym - extended text when mouseover.</acronym>
+        </p>
+        <address>
+          &lt;address&gt;<br>
+          Donald Duck<br>
+          Box 555<br>
+          Disneyland
+        </address>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore dolore.</p>
+      </div>
+
+      <div class="span-8">
+        <table summary="This is the summary text for this table."  border="0" cellspacing="0" cellpadding="0">
+          <caption><em>A standard test table with a caption, tr, td elements</em></caption>
+          <tr>
+            <th class="span-4">Table Header One</th>
+            <th class="span-4 last">Table Header Two</th>
+          </tr>
+          <tr>
+            <td>TD One</td>
+            <td>TD Two</td>
+          </tr>
+          <tr>
+            <td colspan="2">TD colspan 2</td>
+          </tr>
+        </table>
+
+        <table summary="This is the summary text for this table."  border="0" cellspacing="0" cellpadding="0">
+          <caption><em>A test table with a thead, tfoot, and tbody elements</em></caption>
+          <thead>
+            <tr>
+              <th class="span-4">Table Header One</th>
+              <th class="span-4 last">Table Header Two</th>
+            </tr>
+          </thead>
+          <tfoot>
+            <tr>
+              <td colspan="2">tfoot footer</td>
+            </tr>
+          </tfoot>
+          <tbody>
+            <tr>
+              <td>TD One</td>
+              <td>TD Two</td>
+            </tr>
+            <tr>
+              <td>TD One</td>
+              <td>TD Two</td>
+            </tr>
+          </tbody>
+          <tbody>
+            <tr>
+              <td>TD One</td>
+              <td>TD Two</td>
+            </tr>
+            <tr>
+              <td>TD One</td>
+              <td>TD Two</td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+
+      <div class="span-8 last">
+
+<pre>&lt;pre&gt;
+pre  space1
+pre  space1
+pre    space2
+pre    space2
+pre tab
+pre tab</pre>
+
+        <code>&lt;code&gt;
+          Not indented
+          indent1
+          indent1
+          indent2
+          indent3</code>
+
+        <tt>&lt;tt&gt;
+          This tt text should be monospaced
+          and
+          wrap as if
+          one line of text
+          even though the code has newlines, spaces, and tabs.
+          It should be the same size as &lt;p&gt; text.
+        </tt>
+      </div>
+      <hr>
+
+      <p>
+        <a href="http://validator.w3.org/check?uri=referer">
+          <img src="valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="top">
+        </a>
+      </p>
+
+    </div>
+  </body>
+</html>
Index: /ether_2012/web/resources/css/blueprint-css/tests/parts/forms.html
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/tests/parts/forms.html	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/tests/parts/forms.html	(revision 319)
@@ -0,0 +1,194 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+"http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint Forms Tests</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+  </head>
+  <body>
+    <div class="container showgrid">
+      <h1>Forms</h1>
+      <hr>
+
+      <div class="span-12">
+
+        <form id="dummy" action="" method="post">
+
+          <fieldset>
+            <legend>Simple sample form</legend>
+            <p>
+              <label for="dummy0">Text input (title)</label><br>
+              <input type="text" class="title" name="dummy0" id="dummy0" value="Field with class .title">
+            </p>
+
+            <p>
+              <label for="dummy1">Another field</label><br>
+              <input type="text" class="text" id="dummy1" name="dummy1" value="Field with class .text">
+            </p>
+
+            <p>
+              <label for="dummy2">Textarea</label><br>
+              <textarea name="dummy2" id="dummy2" rows="5" cols="20"></textarea>
+            </p>
+
+            <p>
+              <label for="dummy3">A password field</label><br>
+              <input type="password" class="text" id="dummy3" name="dummy3" value="Password field with class .text">
+            </p>
+
+            <p>
+              <input type="submit" value="Submit">
+              <input type="reset" value="Reset">
+            </p>
+
+          </fieldset>
+        </form>
+
+      </div>
+      <div class="span-12 last">
+
+        <div class="error">
+          This is a &lt;div&gt; with the class <strong>.error</strong>. <a href="#">Link</a>.
+        </div>
+        <div class="notice">
+          This is a &lt;div&gt; with the class <strong>.notice</strong>. <a href="#">Link</a>.
+        </div>
+        <div class="info">
+          This is a &lt;div&gt; with the class <strong>.info</strong>. <a href="#">Link</a>.
+        </div>
+        <div class="success">
+          This is a &lt;div&gt; with the class <strong>.success</strong>. <a href="#">Link</a>.
+        </div>
+
+        <fieldset>
+          <legend>Select, checkboxes, lists</legend>
+
+          <p>
+            <label for="dummy3">Select field</label><br>
+            <select id="dummy3" name="dummy3">
+              <option value="1">Ottawa</option>
+              <option value="2">Calgary</option>
+              <option value="3">Moosejaw</option>
+            </select>
+          </p>
+
+          <p>
+            <label for="dummy4">Select with groups</label><br>
+            <select id="dummy4" name="dummy4">
+              <option>Favorite pet</option>
+              <optgroup label="mammals">
+                <option>dog</option>
+                <option>cat</option>
+                <option>rabbit</option>
+                <option>horse</option>
+              </optgroup>
+              <optgroup label="reptiles">
+                <option>iguana</option>
+                <option>snake</option>
+              </optgroup>
+            </select>
+          </p>
+
+          <p><label>Radio buttons</label><br>
+            <input type="radio" name="example"> Radio one<br>
+            <input type="radio" name="example"> Radio two<br>
+            <input type="radio" name="example"> Radio three<br>
+          </p>
+
+          <p><label>Checkboxes</label><br>
+            <input type="checkbox"> Check one<br>
+            <input type="checkbox"> Check two<br>
+            <input type="checkbox"> Check three<br>
+          </p>
+
+        </fieldset>
+
+      </div>
+
+      <div class="span-24 last">
+
+        <fieldset>
+          <legend>Alignment</legend>
+
+          <p>
+            <label for="dummy5">Select field</label>
+            <select id="dummy5" name="dummy5">
+              <option value="1">Ottawa</option>
+              <option value="2">Calgary</option>
+              <option value="3">Moosejaw</option>
+            </select>
+          </p>
+
+          <p>
+            <label for="dummy6">Text input (title)</label>
+            <input type="text" class="title" name="dummy6" id="dummy6" value="Field with class .title">
+          </p>
+
+          <p>
+            <label for="dummy7">Select field</label>
+            <select id="dummy7" name="dummy7">
+              <option value="1">Ottawa</option>
+              <option value="2">Calgary</option>
+              <option value="3">Moosejaw</option>
+            </select>
+            <label for="dummy8">Another field</label>
+            <input type="text" class="text" id="dummy8" name="dummy8" value="Field with class .text">
+          </p>
+
+        </fieldset>
+
+      </div>
+
+      <div class="span-24 last">
+        <form action="" method="post" class="inline">
+          <fieldset>
+            <legend>A form with class "inline"</legend>
+            <div class="span-3">
+              <label for="a">Label A:</label>
+              <select id="a" name="a" >
+                <option value="0">All</option>
+              </select>
+            </div>
+            <div class="span-2">
+              some text
+            </div>
+            <div class="span-3">
+              <input type="checkbox" id="o" name="o" value="true" checked="checked" class="checkbox">checkbox one
+            </div>
+            <div class="span-3">
+              <label for="b">Label B:</label>
+              <select id="b" name="b" >
+                <option value="0">All</option>
+              </select>
+            </div>
+            <div class="span-2">
+              <a href="#">A Hyperlink</a>
+            </div>
+            <div class="span-8">
+              <input type="text" class="text" id="q" name="q" value="Field with class .text">
+            </div>
+            <div class="span-2 last">
+              <input type="submit" value="submit" class="button">
+            </div>
+          </fieldset>
+
+        </form>
+
+      </div>
+
+      <hr>
+
+      <p>
+        <a href="http://validator.w3.org/check?uri=referer">
+        <img src="valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="top"></a>
+      </p>
+
+    </div>
+  </body>
+</html>
Index: /ether_2012/web/resources/css/blueprint-css/tests/parts/grid.html
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/tests/parts/grid.html	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/tests/parts/grid.html	(revision 319)
@@ -0,0 +1,163 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint Grid Tests</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+  </head>
+  <body>
+
+    <div class="container showgrid">
+      <h1>Blueprint Tests: grid.css</h1>
+      <div class="span-8">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-8">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-8 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 append-1">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 append-2">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 append-3 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 prepend-1">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 prepend-2">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 prepend-3 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <hr>
+      <div class="span-12 border">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+      </div>
+      <div class="span-12 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+      </div>
+      <hr>
+      <div class="span-1 prepend-1"><p>1</p></div>
+      <div class="span-1 prepend-2"><p>2</p></div>
+      <div class="span-1 prepend-3"><p>3</p></div>
+      <div class="span-1 prepend-4"><p>4</p></div>
+      <div class="span-1 prepend-5"><p>5</p></div>
+      <div class="span-1 prepend-3 last"><p>3</p></div>
+      <div class="span-1 append-1"><p>1</p></div>
+      <div class="span-1 append-2"><p>2</p></div>
+      <div class="span-1 append-3"><p>3</p></div>
+      <div class="span-1 append-4"><p>4</p></div>
+      <div class="span-1 append-5"><p>5</p></div>
+      <div class="span-1 append-3 last"><p>3</p></div>
+      <div class="span-1 border"><p>1</p></div>
+      <div class="span-1 border"><p>2</p></div>
+      <div class="span-1 border"><p>3</p></div>
+      <div class="span-1 border"><p>4</p></div>
+      <div class="span-1 border"><p>5</p></div>
+      <div class="span-1 border"><p>6</p></div>
+      <div class="span-1 border"><p>7</p></div>
+      <div class="span-1 border"><p>8</p></div>
+      <div class="span-1 border"><p>9</p></div>
+      <div class="span-1 border"><p>10</p></div>
+      <div class="span-1 border"><p>11</p></div>
+      <div class="span-1 border"><p>12</p></div>
+      <div class="span-1 border"><p>13</p></div>
+      <div class="span-1 border"><p>14</p></div>
+      <div class="span-1 border"><p>15</p></div>
+      <div class="span-1 border"><p>16</p></div>
+      <div class="span-1 border"><p>17</p></div>
+      <div class="span-1 border"><p>18</p></div>
+      <div class="span-1 border"><p>19</p></div>
+      <div class="span-1 border"><p>20</p></div>
+      <div class="span-1 border"><p>21</p></div>
+      <div class="span-1 border"><p>22</p></div>
+      <div class="span-1 border"><p>23</p></div>
+      <div class="span-1 last"><p>24</p></div>
+      <div class="span-4"><p>1</p></div>
+      <div class="span-4"><p>2</p></div>
+      <div class="span-4"><p>3</p></div>
+      <div class="span-4"><p>4</p></div>
+      <div class="span-4"><p>5</p></div>
+      <div class="span-4 last"><p>6</p></div>
+      <div class="prepend-23 span-1 last"><p>24</p></div>
+      <div class="prepend-1 span-1"><p>2</p></div>
+      <div class="prepend-20 span-1 append-1 last"><p>23</p></div>
+      <hr>
+      <div class="span-24">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+      </div>
+      <div class="span-12">
+        <div class="span-6">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.</p>
+        </div>
+        <div class="span-6 last">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        </div>
+        <div class="span-12 last">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        </div>
+      </div>
+      <div class="span-12 last">
+        <div class="span-6">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.</p>
+        </div>
+        <div class="span-6 last">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        </div>
+        <div class="span-12 last">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        </div>
+      </div>
+      <div class="span-14 prepend-5 append-5 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+      </div>
+      <hr>
+      <div class="span-12">
+        <h5>TESTING .PUSH-1 TO .PUSH-5</h5>
+        <div class="span-2"><img src="test-small.jpg" class="push-1"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2"><img src="test-small.jpg" class="push-2"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2"><img src="test-small.jpg" class="push-3"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2"><img src="test-small.jpg" class="push-4"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2"><img src="test-small.jpg" class="push-5"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+      </div>
+      <div class="span-12 last">
+        <h5>TESTING .PULL-1 TO .PULL-5</h5>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-1"></div>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-2"></div>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-3"></div>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-4"></div>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-5"></div>
+      </div>
+      <div class="span-24">
+        <p>
+          <a href="http://validator.w3.org/check?uri=referer">
+            <img src="valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="bottom">
+          </a>
+        </p>
+      </div>
+    </div>
+  </body>
+</html>
Index: /ether_2012/web/resources/css/blueprint-css/tests/parts/sample.html
===================================================================
--- /ether_2012/web/resources/css/blueprint-css/tests/parts/sample.html	(revision 319)
+++ /ether_2012/web/resources/css/blueprint-css/tests/parts/sample.html	(revision 319)
@@ -0,0 +1,75 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint Sample Page</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+
+    <!-- Import fancy-type plugin for the sample page. -->
+    <link rel="stylesheet" href="../../blueprint/plugins/fancy-type/screen.css" type="text/css" media="screen, projection">
+  </head>
+  <body>
+    <div class="container">
+      <h1>A simple sample page</h1>
+      <hr>
+      <h2 class="alt">This sample page demonstrates a tiny fraction of what you get with Blueprint.</h2>
+      <hr>
+      <div class="span-7 colborder">
+        <h6>Here's a box</h6>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip.</p>
+      </div>
+      <div class="span-8 colborder">
+        <h6>And another box</h6>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat laboris nisi ut aliquip.</p>
+      </div>
+      <div class="span-7 last">
+        <h6>This box is aligned with the sidebar</h6>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip.</p>
+      </div>
+      <hr>
+      <hr class="space">
+      <div class="span-15 prepend-1 colborder">
+        <p><img src="test.jpg" class="top pull-1 left" alt="test">Lorem ipsum dolor sit amet, <em>consectetuer adipiscing elit</em>. Nunc congue ipsum vestibulum libero. Aenean vitae justo. Nam eget tellus. Etiam convallis, est eu lobortis mattis, lectus tellus tempus felis, a ultricies erat ipsum at metus.</p>
+        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. <a href="#">Morbi et risus</a>. Aliquam nisl. Nulla facilisi. Cras accumsan vestibulum ante. Vestibulum sed tortor. Praesent <span class="caps">SMALL CAPS</span> tempus fringilla elit. Ut elit diam, sagittis in, nonummy in, gravida non, nunc. Ut orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nam egestas, orci eu imperdiet malesuada, nisl purus fringilla odio, quis commodo est orci vitae justo. Aliquam placerat odio tincidunt nulla. Cras in libero. Aenean rutrum, magna non tristique posuere, erat odio eleifend nisl, non convallis est tortor blandit ligula. Nulla id augue.</p>
+        <p>Nullam mattis, odio ut tempus facilisis, metus nisl facilisis metus, auctor consectetuer felis ligula nec mauris. Vestibulum odio erat, fermentum at, commodo vitae, ultrices et, urna. Mauris vulputate, mi pulvinar sagittis condimentum, sem nulla aliquam velit, sed imperdiet mi purus eu magna. Nulla varius metus ut eros. Aenean aliquet magna eget orci. Class aptent taciti sociosqu ad litora.</p>
+        <p>Vivamus euismod. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel nibh ut turpis dictum sagittis. Aliquam vel velit a elit auctor sollicitudin. Nam vel dui vel neque lacinia pretium. Quisque nunc erat, venenatis id, volutpat ut, scelerisque sed, diam. Mauris ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec mattis. Morbi dignissim sollicitudin libero. Nulla lorem.</p>
+        <blockquote>
+          <p>Integer cursus ornare mauris. Praesent nisl arcu, imperdiet eu, ornare id, scelerisque ut, nunc. Praesent sagittis erat sed velit tempus imperdiet. Ut tristique, ante in interdum hendrerit, erat enim faucibus felis, quis rutrum mauris lorem quis sem. Vestibulum ligula nisi, mattis nec, posuere et, blandit eu, ligula. Nam suscipit placerat odio. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque tortor libero, venenatis vitae, rhoncus eu, placerat ut, mi. Nulla nulla.</p>
+        </blockquote>
+        <p>Maecenas vel metus quis magna pharetra fermentum. <em>Integer sit amet tortor</em>. Maecenas porttitor, pede sed gravida auctor, nulla augue aliquet elit, at pretium urna orci ut metus. Aliquam in dolor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, tellus id ornare posuere, quam nunc accumsan turpis, at convallis tellus orci et nisl. Phasellus congue neque a lorem.</p>
+        <hr>
+        <div class="span-7 colborder">
+          <h6>This is a nested column</h6>
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>
+        </div>
+        <div class="span-7 last">
+          <h6>This is another nested column</h6>
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>
+        </div>
+      </div>
+      <div class="span-7 last">
+        <h3>A <span class="alt">Simple</span> Sidebar</h3>
+        <p>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.</p>
+        <p>Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida. Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida.</p>
+        <p class="quiet">Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.</p>
+        <h5>Incremental leading</h5>
+        <p class="incr">Vestibulum ante ipsum primis in faucibus orci luctus vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus.</p>
+        <p class="incr">Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.</p>
+      </div>
+      <hr>
+      <h2 class="alt">You may pick and choose amongst these and many more features, so be bold.</h2>
+      <hr>
+      <p>
+        <a href="http://validator.w3.org/check?uri=referer">
+          <img src="valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="top">
+        </a>
+      </p>
+    </div>
+  </body>
+</html>
Index: /ether_2012/web/resources/css/button.css
===================================================================
--- /ether_2012/web/resources/css/button.css	(revision 319)
+++ /ether_2012/web/resources/css/button.css	(revision 319)
@@ -0,0 +1,99 @@
+/** ****************************************************************** **/
+/** http://particletree.com/features/rediscovering-the-button-element/ **/
+/** ****************************************************************** **/
+
+/* BUTTONS */
+
+.buttons a, .buttons button {
+    display:block;
+    float:left;
+    margin:0 11px 0 0;
+    background-color:#f5f5f5;
+    border:1px solid #dedede;
+    border-top:1px solid #eee;
+    border-left:1px solid #eee;
+
+    font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;
+    font-size:100%;
+    line-height:130%;
+    text-decoration:none;
+    font-weight:bold;
+    color:#565656;
+    cursor:pointer;
+    padding:5px 10px 6px 7px; /* Links */
+}
+.buttons button{
+    width:auto;
+    overflow:visible;
+    padding:4px 6px 3px 6px; /* IE6 */
+}
+.buttons button[type]{
+    padding:5px 10px 5px 7px; /* Firefox */
+    line-height:17px; /* Safari */
+}
+*:first-child+html button[type]{
+    padding:4px 10px 3px 7px; /* IE7 */
+}
+.buttons button img, .buttons a img{
+    margin:0 3px -3px 0 !important;
+    padding:0;
+    border:none;
+    width:16px;
+    height:16px;
+}
+
+
+/* STANDARD */
+
+button:hover, .buttons a:hover{
+    background-color:#dff4ff;
+    border:1px solid #c2e1ef;
+    color:#336699;
+}
+.buttons a:active{
+    background-color:#6299c5;
+    border:1px solid #6299c5;
+    color:#fff;
+}
+
+/* POSITIVE */
+
+button.positive, .buttons a.positive{
+    color:#529214;
+}
+.buttons a.positive:hover, button.positive:hover{
+    background-color:#E6EFC2;
+    border:1px solid #C6D880;
+    color:#529214;
+}
+.buttons a.positive:active{
+    background-color:#529214;
+    border:1px solid #529214;
+    color:#fff;
+}
+
+/* NEGATIVE */
+
+.buttons a.negative, button.negative{
+    color:#d12f19;
+}
+.buttons a.negative:hover, button.negative:hover{
+    background:#fbe3e4;
+    border:1px solid #fbc2c4;
+    color:#d12f19;
+}
+.buttons a.negative:active{
+    background-color:#d12f19;
+    border:1px solid #d12f19;
+    color:#fff;
+}
+
+/* DISABLE */
+
+.buttons a.disable, .buttons a.disable:hover, .buttons button.disable, .buttons button.disable:hover
+{
+    background-color:#CCCCCC;
+    border:1px solid #dedede;
+    color:#565656;
+}
+
Index: /ether_2012/web/resources/css/calendarview-1.2/calendarview.css
===================================================================
--- /ether_2012/web/resources/css/calendarview-1.2/calendarview.css	(revision 319)
+++ /ether_2012/web/resources/css/calendarview-1.2/calendarview.css	(revision 319)
@@ -0,0 +1,108 @@
+.embeddedCalendar
+{
+	margin-left: auto;
+	margin-right: auto;
+	max-width: 240px;
+}
+
+div.calendar
+{
+  font-size: smaller;
+  color: #000;
+}
+
+div.calendar.popup
+{
+  margin-left: -40px;
+  margin-top: -100px;
+}
+
+div.calendar table
+{
+  background-color: #eee;
+  border: 1px solid #aaa;
+  border-collapse: collapse;
+  width: 100%;  
+}
+
+div.calendar thead {
+  background-color: white;
+}
+
+div.calendar td,
+div.calendar th
+{
+  padding: 3px;
+  text-align: center;
+}
+
+div.calendar td.title
+{
+  font-weight: bold;
+}
+
+div.calendar th
+{
+  background: #ddd;
+  border-bottom: 1px solid #ccc;
+  border-top: 1px solid #ccc;
+  font-weight: bold;
+  color: #555;
+}
+
+div.calendar tr.days td {
+  width: 2em;
+  color: #555;
+  text-align: center;
+  cursor: pointer;
+}
+
+div.calendar tr.days td:hover,
+div.calendar td.button:hover
+{
+  background-color: #34ABFA;
+  cursor: pointer;
+}
+
+div.calendar tr.days td:active
+div.calendar td.button:active
+{
+  background-color: #cde;
+}
+
+div.calendar tr.days td.selected
+{
+  font-weight: bold;
+  background-color: #fff;
+  color: #000;
+}
+
+div.calendar tr.days td.today
+{
+  font-weight: bold;
+  color: #D50000;
+}
+
+div.calendar tr.days td.otherDay
+{
+  color: #bbb;
+}
+
+div.dateField {
+#	width: 140px;
+	padding: 6px;
+	-webkit-border-radius: 6px;
+	-moz-border-radius: 6px;
+	color: #555;
+	background-color: white;
+	margin-left: auto;
+	margin-right: auto;
+	text-align: center;
+	padding: 0px;
+	text-align : left;
+}
+
+div#popupDateField:hover {
+	background-color: #cde;
+	cursor: pointer;
+}
Index: /ether_2012/web/resources/css/ether.css
===================================================================
--- /ether_2012/web/resources/css/ether.css	(revision 319)
+++ /ether_2012/web/resources/css/ether.css	(revision 319)
@@ -0,0 +1,85 @@
+body{
+	font-size: 14px;
+}
+
+.pair,.impair {
+	width: 234px;
+	padding-top: 3px;
+	padding-bottom: 3px;
+}
+
+.pair {
+	background-color:#f5f3ec;
+}
+
+.impair {
+	background-color:#FFFDF6;
+}
+
+.bindedText {
+	color: #6178BC;
+	text-decoration: none;
+}
+
+/** ************************************ **/
+/** *********** DIV INFOS ************** **/
+/** ************************************ **/
+.error, .alert, .notice, .success, .info, .loading {
+	padding: 0.5em;
+	margin: 0.5em auto;
+	border: 2px solid #ddd;
+	text-align: center;
+}
+
+.error, .alert {
+	background: #fbe3e4;
+	color: #8a1f11;
+	border-color: #fbc2c4;
+}
+
+.notice {
+	background: #fff6bf;
+	color: #514721;
+	border-color: #ffd324;
+}
+
+.success {
+	background: #e6efc2;
+	color: #264409;
+	border-color: #c6d880;
+}
+
+.info {
+	background: #d5edf8;
+	color: #205791;
+	border-color: #92cae4;
+}
+
+.loading
+{
+	border: none;
+}
+
+/** ************************************ **/
+/** ************ LOADING *************** **/
+/** ************************************ **/
+.loading-classic {
+	background-image: url("resources/icons/loading.gif");
+	height: 35px;
+	width: 35px;
+}
+
+/** ************************************ **/
+/** ************* OTHERS *************** **/
+/** ************************************ **/
+#messages {
+	color:#806159;
+	font-weight:bold;
+	vertical-align:middle;
+	/*margin-bottom:1em;*/
+}
+
+
+#containerPlateforms {
+    color:#6178BC;
+}
Index: /ether_2012/web/resources/css/library/bluetrip/LICENSE
===================================================================
--- /ether_2012/web/resources/css/library/bluetrip/LICENSE	(revision 319)
+++ /ether_2012/web/resources/css/library/bluetrip/LICENSE	(revision 319)
@@ -0,0 +1,312 @@
+BlueTrip CSS Framework License
+----------------------------------------------------------------
+
+The BlueTrip CSS Framework is available for use in all personal or 
+commercial projects, under both the (modified) MIT and the GPL license. You
+may choose the one that fits your project.
+
+
+The (modified) MIT License
+----------------------------------------------------------------
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sub-license, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice, and every other copyright notice found in this 
+software, and all the attributions in every file, and this permission notice 
+shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+The GPL License
+----------------------------------------------------------------
+
+        GNU GENERAL PUBLIC LICENSE
+           Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+          Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+        GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+          NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
Index: /ether_2012/web/resources/css/library/bluetrip/README
===================================================================
--- /ether_2012/web/resources/css/library/bluetrip/README	(revision 319)
+++ /ether_2012/web/resources/css/library/bluetrip/README	(revision 319)
@@ -0,0 +1,22 @@
+BlueTripCSS - A CSS Framework Fusion of Blueprint and Tripoli
+
+-----USAGE-----
+
+Add the following four links to the <head> of your page
+
+<link rel="stylesheet" href="../css/screen.css" type="text/css" media="screen, projection">
+<link rel="stylesheet" href="../css/print.css" type="text/css" media="print"> 
+<!--[if IE]>
+	<link rel="stylesheet" href="../css/ie.css" type="text/css" media="screen, projection">
+<![endif]-->
+<link rel="stylesheet" href="../css/style.css" type="text/css" media="screen, projection">
+
+Make sure you have the stylesheet links correct. Then edit "screen.css" to change a[href^="http://yourwebsite.com"] by putting your url in place of yourwebsite.com.  This ensures that internal links will not show the external link icon. Now get designing!
+
+-----INFORMATION-----
+
+Visit http://capsizedesigns.com/blog/2008/04/bluetripcss-a-fusion-of-blueprint-and-tripoli for more detailed information and instructions.
+
+-----LICENSE-----
+
+See LICENSE.txt
Index: /ether_2012/web/resources/css/library/bluetrip/css/ie.css
===================================================================
--- /ether_2012/web/resources/css/library/bluetrip/css/ie.css	(revision 319)
+++ /ether_2012/web/resources/css/library/bluetrip/css/ie.css	(revision 319)
@@ -0,0 +1,20 @@
+/* ie.css */
+body {text-align:center;}
+.container {text-align:left;}
+* html .column {overflow-x:hidden;}
+* html legend {margin:-18px -8px 16px 0;padding:0;}
+ol {margin-left:2em;}
+sup {vertical-align:text-top;}
+sub {vertical-align:text-bottom;}
+html>body p code {*white-space:normal;}
+hr {margin:-8px auto 11px;}
+.container ul { list-style: disc outside; margin-left: 2em; } /* IE can't handle :before and :after */
+.container ul li { text-indent: 0; margin-left: 0; }
+.container legend { margin-bottom: 1.6em; } /* IE form margin bug */
+sup, sub { font-size: 100%; } /* IE superscript & subscript bug */
+.container blockquote p, #content blockquote ul, #content blockquote ol, #content blockquote dl, #content blockquote pre, #content blockquote address, 
+.container blockquote table, #content blockquote form, #content blockquote h1, #content blockquote h2, #content blockquote h3, #content blockquote h4, #content blockquote h5, #content blockquote h6 { margin-top: .8em; margin-bottom: .8em; } /* IE can't handle :first-child */
+* html .container textarea, * html .container input { padding: 0; } /* IE < 7 form fix */
+.container input[type='submit'], .container input[type='button'] { padding: 0; } /* IE 7 button fix */
+.container legend+* { margin-top: 0; } /* we already added legend margin */
+a abbr, a acronym { text-decoration: underline; } /* IE 7 bug */
Index: /ether_2012/web/resources/css/library/bluetrip/css/print.css
===================================================================
--- /ether_2012/web/resources/css/library/bluetrip/css/print.css	(revision 319)
+++ /ether_2012/web/resources/css/library/bluetrip/css/print.css	(revision 319)
@@ -0,0 +1,55 @@
+/* -------------------------------------------------------------- 
+  
+ Hartija Css Print  Framework
+   * Version:   0.8 (2008-03-10)
+   
+   * In use by BlueTripCSS
+	 
+-------------------------------------------------------------- */
+
+body { 
+width:100% !important;
+margin:0 !important;
+padding:0 !important;
+line-height: 1.4;
+word-spacing:1.1pt;
+letter-spacing:0.2pt; font-family: Garamond,"Times New Roman", serif; color: #000; background: none; font-size: 12pt; }
+
+/*Headings */
+h1,h2,h3,h4,h5,h6 { font-family: Helvetica, Arial, sans-serif; }
+h1{font-size:19pt;}
+h2{font-size:17pt;}
+h3{font-size:15pt;}
+h4,h5,h6{font-size:12pt;}
+
+code { font: 10pt Courier, monospace; } 
+blockquote { margin: 1.3em; padding: 1em;  font-size: 10pt; }
+hr { background-color: #ccc; }
+
+/* Images */
+img { float: left; margin: 1em 1.5em 1.5em 0; }
+a img { border: none; }
+
+/* Links */
+a:link, a:visited { background: transparent; font-weight: 700; text-decoration: underline;color:#333; }
+a:link[href^="http://"]:after, a[href^="http://"]:visited:after { content: " (" attr(href) ") "; font-size: 90%; }
+a[href^="http://"] {color:#000; }
+
+/* Table */
+table { margin: 1px; text-align:left; }
+th { border-bottom: 1px solid #333;  font-weight: bold; }
+td { border-bottom: 1px solid #333; }
+th,td { padding: 4px 10px 4px 0; }
+tfoot { font-style: italic; }
+caption { background: #fff; margin-bottom:2em; text-align:left; }
+thead {display: table-header-group;}
+tr {page-break-inside: avoid;} 
+
+/*hide various parts from the site*/
+
+#header, #footer, #navigation, #rightSideBar, #leftSideBar 
+{display:none;}
+
+.container a.button, .container button {
+  display:none;
+}
Index: /ether_2012/web/resources/css/library/bluetrip/css/screen.css
===================================================================
--- /ether_2012/web/resources/css/library/bluetrip/css/screen.css	(revision 319)
+++ /ether_2012/web/resources/css/library/bluetrip/css/screen.css	(revision 319)
@@ -0,0 +1,412 @@
+/* -----------------------------------------------------------------------
+
+   BlueTripCSS Framework
+   
+   Mike Crittenden
+   mike@capsizedesigns.com
+   Copyright 2008 Mike Crittenden
+   
+   License - MIT or GPL (whichever suits you better)
+
+----------------------------------------------------------------------- */
+
+/* MEYER RESET */
+html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}
+body {line-height:1.5;}
+table {border-collapse:separate;border-spacing:0;}
+caption, th, td {text-align:left;font-weight:normal;}
+table, td, th {vertical-align:middle;}
+blockquote:before, blockquote:after, q:before, q:after {content:"";}
+blockquote, q {quotes:"" "";}
+a img {border:none;}
+
+/* BASIC TYPOGRAPHY */
+
+html { font-size: 62.5%; font-family: helvetica, "microsoft sans serif", arial, sans-serif; }
+strong, th, thead td, h1, h2, h3, h4, h5, h6 { font-weight: bold; }
+cite, em, dfn { font-style: italic; }
+code, kbd, samp, pre, tt, var, input[type='text'], input[type='password'], textarea { font-size: 92%; font-family: monaco, "Lucida Console", courier, monospace; }
+del { text-decoration: line-through; color: #666; }
+ins, dfn { border-bottom: 1px solid #ccc; }
+small, sup, sub { font-size: 85%; }
+abbr, acronym { text-transform: uppercase; font-size: 85%; letter-spacing: .1em; }
+a abbr, a acronym { border: none; }
+abbr[title], acronym[title], dfn[title] { cursor: help; border-bottom: 1px solid #ccc; }
+sup { vertical-align: super; }
+sub { vertical-align: sub; }
+
+/* QUOTES */
+
+blockquote { border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; color: #666; }
+blockquote *:first-child:before { content: "\201C"; }
+blockquote *:first-child:after { content: "\201D"; }
+
+/* FORMS */
+
+fieldset { padding:1.4em; margin: 0 0 1.5em 0; border: 1px solid #ccc; }
+legend { font-weight: bold; font-size:1.2em; }
+label { font-weight: bold; }
+textarea, input[type='text'], input[type='password'], select { border: 1px solid #ccc; background: #fff; }
+textarea:hover, input[type='text']:hover, input[type='password']:hover, select:hover { border-color: #aaa; }
+textarea:focus, input[type='text']:focus, input[type='password']:focus, select:focus { border-color: #888; outline: 2px solid #ffffaa; }
+input, select { cursor: pointer; }
+input[type='text'] { cursor: text; }
+
+/* BASE SIZES */
+
+.container { font-size: 1.2em; line-height: 1.6em; }
+.container h1 { font-size: 1.9em; }
+.container h2 { font-size: 1.7em; }
+.container h3 { font-size: 1.5em; }
+.container h4 { font-size: 1.3em; }
+.container h5 { font-size: 1.2em; }
+.container h6 { font-size: 1em; }
+
+/* LISTS */
+
+.container ul li { margin-left: .85em; }
+/*.container ul li:before {content: "\2022\00a0\00a0"; }  REMOVED FOR FF3 */
+.container ol { list-style-position: outside; list-style-type: decimal; }
+.container dt { font-weight: bold; }
+
+/* TABLES */
+
+.container table { border-top: 1px solid #ccc;  border-left: 1px solid #ccc; }
+.container th, .container td { border-bottom: 1px solid #ddd; border-right: 1px solid #ccc; }
+
+/* MARGINS & PADDINGS */
+
+.container blockquote *:first-child { margin: .8em 0; }
+.container hr, .container p, .container ul, .container ol, .container dl, .container pre, .container blockquote, .container address, .container table, .container form { margin-bottom: 1.6em; }
+/* NOTE: Calulate header margins: TOP: 1.6em/size, BOTTOM: 1.6em/size/2 */
+.container h1 { margin: 1em 0 .5em;  }
+.container h2 { margin: 1.07em 0 .535em; }
+.container h3 { margin: 1.14em 0 .57em; }
+.container h4 { margin: 1.23em 0 .615em; }
+.container h5 { margin: 1.33em 0 .67em; }
+.container h6 { margin: 1.6em 0 .8em; }
+.container th, .container td { padding: .8em; }
+.container caption { padding-bottom: .8em; } /* padding instead of margin for IE */
+.container blockquote { padding: 0 1em; margin: 1.6em 0; }
+.container fieldset { padding: 0 1em 1em 1em; margin: 1.6em 0; } /* padding-top is margin-top for fieldsets in Opera */
+.container legend { padding-left: .8em; padding-right: .8em; }
+.container legend+* { margin-top: 1em; } /* compensates for the opera margin bug */
+.container textarea, .container input { padding: .3em .4em .15em .4em; }
+.container select { padding: .1em .2em 0 .2em; }
+.container option { padding: 0 .4em; }
+.container a { position: relative; padding: 0.3em 0 .1em 0; } /* for larger click-area */
+.container dt { margin-top: .8em; margin-bottom: .4em; }
+.container ul { margin-left: 1.5em; }
+.container ol { margin-left: 2.35em; }
+.container ol ol, .container ul ol { margin-left: 2.5em; }
+.container form div { margin-bottom: .8em; }
+
+/* COLORS */
+
+.container a:link { text-decoration: underline; color: #36c; }
+.container a:visited { text-decoration: underline; color: #99c; }
+.container a:hover { text-decoration: underline; color: #c33; }
+.container a:active, .container a:focus { text-decoration: underline; color: #000; }
+.container code, .container pre { color: #c33; } /* very optional, but still useful. W3C uses about the same colors for codes */
+
+/* 24 COLUMN GRID */
+.container {width:950px;margin:0 auto;}
+.showgrid {background:url(../img/grid.png);}
+body {margin:1.5em 0;}
+div.span-1, div.span-2, div.span-3, div.span-4, div.span-5, div.span-6, div.span-7, div.span-8, div.span-9, div.span-10, div.span-11, div.span-12, div.span-13, div.span-14, div.span-15, div.span-16, div.span-17, div.span-18, div.span-19, div.span-20, div.span-21, div.span-22, div.span-23 {float:left;margin-right:10px;}
+div.span-24 {float:left;}
+div.last {margin-right:0;}
+.span-1 {width:30px;}
+.span-2 {width:70px;}
+.span-3 {width:110px;}
+.span-4 {width:150px;}
+.span-5 {width:190px;}
+.span-6 {width:230px;}
+.span-7 {width:270px;}
+.span-8 {width:310px;}
+.span-9 {width:350px;}
+.span-10 {width:390px;}
+.span-11 {width:430px;}
+.span-12 {width:470px;}
+.span-13 {width:510px;}
+.span-14 {width:550px;}
+.span-15 {width:590px;}
+.span-16 {width:630px;}
+.span-17 {width:670px;}
+.span-18 {width:710px;}
+.span-19 {width:750px;}
+.span-20 {width:790px;}
+.span-21 {width:830px;}
+.span-22 {width:870px;}
+.span-23 {width:910px;}
+.span-24, div.span-24 {width:950px;}
+.suffix-1 {padding-right:40px;}
+.suffix-2 {padding-right:80px;}
+.suffix-3 {padding-right:120px;}
+.suffix-4 {padding-right:160px;}
+.suffix-5 {padding-right:200px;}
+.suffix-6 {padding-right:240px;}
+.suffix-7 {padding-right:280px;}
+.suffix-8 {padding-right:320px;}
+.suffix-9 {padding-right:360px;}
+.suffix-10 {padding-right:400px;}
+.suffix-11 {padding-right:440px;}
+.suffix-12 {padding-right:480px;}
+.suffix-13 {padding-right:520px;}
+.suffix-14 {padding-right:560px;}
+.suffix-15 {padding-right:600px;}
+.suffix-16 {padding-right:640px;}
+.suffix-17 {padding-right:680px;}
+.suffix-18 {padding-right:720px;}
+.suffix-19 {padding-right:760px;}
+.suffix-20 {padding-right:800px;}
+.suffix-21 {padding-right:840px;}
+.suffix-22 {padding-right:880px;}
+.suffix-23 {padding-right:920px;}
+.prefix-1 {padding-left:40px;}
+.prefix-2 {padding-left:80px;}
+.prefix-3 {padding-left:120px;}
+.prefix-4 {padding-left:160px;}
+.prefix-5 {padding-left:200px;}
+.prefix-6 {padding-left:240px;}
+.prefix-7 {padding-left:280px;}
+.prefix-8 {padding-left:320px;}
+.prefix-9 {padding-left:360px;}
+.prefix-10 {padding-left:400px;}
+.prefix-11 {padding-left:440px;}
+.prefix-12 {padding-left:480px;}
+.prefix-13 {padding-left:520px;}
+.prefix-14 {padding-left:560px;}
+.prefix-15 {padding-left:600px;}
+.prefix-16 {padding-left:640px;}
+.prefix-17 {padding-left:680px;}
+.prefix-18 {padding-left:720px;}
+.prefix-19 {padding-left:760px;}
+.prefix-20 {padding-left:800px;}
+.prefix-21 {padding-left:840px;}
+.prefix-22 {padding-left:880px;}
+.prefix-23 {padding-left:920px;}
+div.border {padding-right:4px;margin-right:5px;border-right:1px solid #eee;}
+div.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #eee;}
+.pull-1 {margin-left:-40px;}
+.pull-2 {margin-left:-80px;}
+.pull-3 {margin-left:-120px;}
+.pull-4 {margin-left:-160px;}
+.pull-5 {margin-left:-200px;}
+.pull-6 {margin-left:-240px;}
+.pull-7 {margin-left:-280px;}
+.pull-8 {margin-left:-320px;}
+.pull-9 {margin-left:-360px;}
+.pull-10 {margin-left:-400px;}
+.pull-11 {margin-left:-440px;}
+.pull-12 {margin-left:-480px;}
+.pull-13 {margin-left:-520px;}
+.pull-14 {margin-left:-560px;}
+.pull-15 {margin-left:-600px;}
+.pull-16 {margin-left:-640px;}
+.pull-17 {margin-left:-680px;}
+.pull-18 {margin-left:-720px;}
+.pull-19 {margin-left:-760px;}
+.pull-20 {margin-left:-800px;}
+.pull-21 {margin-left:-840px;}
+.pull-22 {margin-left:-880px;}
+.pull-23 {margin-left:-920px;}
+.pull-24 {margin-left:-960px;}
+.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;}
+.push-1 {margin:0 -40px 1.5em 40px;}
+.push-2 {margin:0 -80px 1.5em 80px;}
+.push-3 {margin:0 -120px 1.5em 120px;}
+.push-4 {margin:0 -160px 1.5em 160px;}
+.push-5 {margin:0 -200px 1.5em 200px;}
+.push-6 {margin:0 -240px 1.5em 240px;}
+.push-7 {margin:0 -280px 1.5em 280px;}
+.push-8 {margin:0 -320px 1.5em 320px;}
+.push-9 {margin:0 -360px 1.5em 360px;}
+.push-10 {margin:0 -400px 1.5em 400px;}
+.push-11 {margin:0 -440px 1.5em 440px;}
+.push-12 {margin:0 -480px 1.5em 480px;}
+.push-13 {margin:0 -520px 1.5em 520px;}
+.push-14 {margin:0 -560px 1.5em 560px;}
+.push-15 {margin:0 -600px 1.5em 600px;}
+.push-16 {margin:0 -640px 1.5em 640px;}
+.push-17 {margin:0 -680px 1.5em 680px;}
+.push-18 {margin:0 -720px 1.5em 720px;}
+.push-19 {margin:0 -760px 1.5em 760px;}
+.push-20 {margin:0 -800px 1.5em 800px;}
+.push-21 {margin:0 -840px 1.5em 840px;}
+.push-22 {margin:0 -880px 1.5em 880px;}
+.push-23 {margin:0 -920px 1.5em 920px;}
+.push-24 {margin:0 -960px 1.5em 960px;}
+.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:right;position:relative;}
+hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;}
+hr.space {background:#fff;color:#fff;}
+.clearfix:after, .container:after {content:".";display:block;height:0;clear:both;visibility:hidden;}
+.clearfix, .container {display:inline-block;}
+* html .clearfix, * html .container {height:1%;}
+.clearfix, .container {display:block;}
+.clear {clear:both;}
+
+/* to create serif italic dramatic text, use this class */
+.fancy { 
+  color: #666; 
+  font-family: "Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif; 
+  font-style: italic;
+  font-weight: normal;
+}  
+
+/* creates small caps */
+.caps { 
+  font-variant: small-caps; 
+  letter-spacing: 1px; 
+  text-transform: lowercase; 
+  font-size:1.2em;
+  font-weight:bold;
+  padding:0 2px;
+}
+
+/* Use this class if a link gets an icon when it shouldn't. */
+body a.noicon { background:none; padding:0; margin:0; }
+
+/* Make sure the icons are not cut */
+a[href^="http:"], a[href^="mailto:"], a[href^="http:"]:visited, 
+a[href$=".pdf"], a[href$=".doc"], a[href$=".xls"], a[href$=".rss"], 
+a[href$=".rdf"], a[href^="aim:"] {
+  padding:2px 22px 2px 0;
+  margin:-2px 0;
+  background-repeat: no-repeat;
+  background-position: right center;
+}
+
+/* External links */
+a[href^="http:"]          { background-image: url(../img/icons/external.png); padding-right: 14px; } 
+a[href^="mailto:"]        { background-image: url(../img/icons/email.png); }
+a[href^="http:"]:visited  { background-image: url(../img/icons/visited.png); }
+
+/* Files */
+a[href$=".pdf"]   { background-image: url(../img/icons/pdf.png); }  
+a[href$=".doc"]   { background-image: url(../img/icons/doc.png); }  
+a[href$=".xls"]   { background-image: url(../img/icons/xls.png); }  
+ 
+/* Misc */
+a[href$=".rss"], 
+a[href$=".rdf"]   { background-image: url(../img/icons/feed.png); }
+a[href^="aim:"]   { background-image: url(../img/icons/im.png); }
+a[href^="http://yourwebsite.com"] { background:none; padding:0; margin:0; }
+
+/* TEXT CLASSES */
+
+.container .small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;}
+.container .large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;}
+.container .hide {display:none;}
+.container .quiet {color:#666;}
+.container .loud {color:#000;}
+.container .highlight {background:#ff0;}
+.container .top {margin-top:0;padding-top:0;}
+.container .bottom {margin-bottom:0;padding-bottom:0;}
+.container .thin {font-weight: lighter;}
+.container .error, .container .notice, .container .success {padding:.8em;margin-bottom:1.6em;border:2px solid #ddd;}
+.container .error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;}
+.container .notice {background:#FFF6BF;color:#514721;border-color:#FFD324;}
+.container .success {background:#E6EFC2;color:#264409;border-color:#C6D880;}
+.container .error a {color:#8a1f11; background:none; padding:0; margin:0; }
+.container .notice a {color:#514721; background:none; padding:0; margin:0; }
+.container .success a {color:#264409; background:none; padding:0; margin:0; }
+.container .center {text-align: center;}
+
+/*---------STYLES FOR BUTTONS----------*/
+/* Demo: particletree.com/features/rediscovering-the-button-element */
+/*
+	<button type="submit" class="button positive">
+	  <img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/> Save
+	</button>
+
+	<a class="button" href="/password/reset/">
+	  <img src="css/blueprint/plugins/buttons/icons/key.png" alt=""/> Change Password
+	</a>
+
+	<a href="#" class="button negative">
+	  <img src="css/blueprint/plugins/buttons/icons/cross.png" alt=""/> Cancel
+	</a>
+*/
+
+.container a.button, .container button {
+  display: block;
+  float: left;
+  margin:0 0.583em 0.667em 0;
+  padding:5px 10px 5px 7px;   /* Links */
+  border:1px solid #dedede;
+  border-top:1px solid #eee;
+  border-left:1px solid #eee;
+  background-color:#f5f5f5;
+  font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;
+  font-size:100%;
+  line-height:130%;
+  text-decoration:none;
+  font-weight:bold;
+  color:#565656;
+  cursor:pointer;
+}
+.container button {
+  width:auto;
+  overflow:visible;
+  padding:4px 10px 3px 7px;   /* IE6 */
+}
+.container button[type] {
+  padding:4px 10px 4px 7px;   /* Firefox */
+  line-height:17px;           /* Safari */
+}
+
+*:first-child+html .container button[type] {
+  padding:4px 10px 3px 7px;   /* IE7 */
+}
+
+.container button img, .container a.button img{
+  margin:0 3px -3px 0 !important;
+  padding:0;
+  border:none;
+  width:16px;
+  height:16px;
+  float:none;
+}
+
+/* Standard Buttons */
+button:hover, a.button:hover{
+  background-color:#dff4ff;
+  border:1px solid #c2e1ef;
+  color:#336699;
+}
+a.button:active, button:active{
+  background-color:#6299c5;
+  border:1px solid #6299c5;
+  color:#fff;
+}
+
+/* Positive */
+body .positive {
+  color:#529214;
+}
+a.positive:hover, button.positive:hover {
+  background-color:#E6EFC2;
+  border:1px solid #C6D880;
+  color:#529214;
+}
+a.positive:active, button.positive:active {
+  background-color:#529214;
+  border:1px solid #529214;
+  color:#fff;
+}
+
+/* Negative */
+body .negative {
+  color:#d12f19;
+}
+a.negative:hover, button.negative:hover {
+  background:#fbe3e4;
+  border:1px solid #fbc2c4;
+  color:#d12f19;
+}
+a.negative:active, button.negative:active {
+  background-color:#d12f19;
+  border:1px solid #d12f19;
+  color:#fff;
+}
Index: /ether_2012/web/resources/css/library/bluetrip/css/style.css
===================================================================
--- /ether_2012/web/resources/css/library/bluetrip/css/style.css	(revision 319)
+++ /ether_2012/web/resources/css/library/bluetrip/css/style.css	(revision 319)
@@ -0,0 +1,43 @@
+/*======================================
+      WELCOME TO THE STYLESHEET
+--------------------------------------      
+     Copyright Mike Crittenden
+      Author: Mike Crittenden
+======================================*/
+ 
+/**************************************\
+|------------COLOR SCHEME--------------|
+|--------------------------------------|
+- black		#000
+- white		#fff
+\**************************************/
+
+
+/**************************************/
+/*              GLOBALS               */
+/**************************************/
+
+
+/**************************************/
+/*              HEADER                */
+/**************************************/
+
+
+
+/**************************************/
+/*             NAVIGATION             */
+/**************************************/
+
+
+
+/**************************************/
+/*            MAIN CONTENT            */
+/**************************************/
+
+
+
+/**************************************/
+/*               FOOTER               */
+/**************************************/
+
+
Index: /ether_2012/web/resources/css/library/bluetrip/examples/grid.html
===================================================================
--- /ether_2012/web/resources/css/library/bluetrip/examples/grid.html	(revision 319)
+++ /ether_2012/web/resources/css/library/bluetrip/examples/grid.html	(revision 319)
@@ -0,0 +1,232 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+	
+<!--
+==============================================
+|       WELCOME TO THE SOURCE CODE!          |
+==============================================
+|                                            |
+|        AUTHOR: Mike Crittenden             |
+|     EMAIL: mike@capsizedesigns.com         |
+|--------------------------------------------|
+-->
+
+	<title>BlueTripCSS Grid - A Fusion of Blueprint and Tripoli</title>
+	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
+	
+	<link rel="stylesheet" href="../css/screen.css" type="text/css" media="screen, projection">
+   	<link rel="stylesheet" href="../css/print.css" type="text/css" media="print"> 
+		
+	<!--[if IE]>
+		<link rel="stylesheet" href="../css/ie.css" type="text/css" media="screen, projection">
+	<![endif]-->
+	
+   	<link rel="stylesheet" href="../css/style.css" type="text/css" media="screen, projection">
+
+</head>
+
+<body>
+	<div class="container showgrid">
+		<h1>BlueTrip CSS Grid Examples</h1>
+		
+
+		<div class="span-8">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		<div class="span-8">
+
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		<div class="span-8 last">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		
+
+		<div class="span-6 suffix-1">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+
+		</div>
+		<div class="span-6 suffix-2">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		<div class="span-6 suffix-3 last">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		
+
+		<div class="span-6 prefix-1">
+
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		<div class="span-6 prefix-2">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		<div class="span-6 prefix-3 last">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+
+		</div>
+		<hr>
+
+		<div class="span-12 border">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+		</div>
+		<div class="span-12 last">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+
+		</div>
+		<hr>
+
+		<div class="span-1 prefix-1"><p>1</p></div>
+		<div class="span-1 prefix-2"><p>2</p></div>
+		<div class="span-1 prefix-3"><p>3</p></div>
+		<div class="span-1 prefix-4"><p>4</p></div>
+
+		<div class="span-1 prefix-5"><p>5</p></div>
+		<div class="span-1 prefix-3 last"><p>3</p></div>
+
+		<div class="span-1 suffix-1"><p>1</p></div>
+		<div class="span-1 suffix-2"><p>2</p></div>
+		<div class="span-1 suffix-3"><p>3</p></div>
+		<div class="span-1 suffix-4"><p>4</p></div>
+
+		<div class="span-1 suffix-5"><p>5</p></div>
+		<div class="span-1 suffix-3 last"><p>3</p></div>
+		
+		<div class="span-1 border"><p>1</p></div>
+		<div class="span-1 border"><p>2</p></div>
+		<div class="span-1 border"><p>3</p></div>
+		<div class="span-1 border"><p>4</p></div>
+
+		<div class="span-1 border"><p>5</p></div>
+		<div class="span-1 border"><p>6</p></div>
+		<div class="span-1 border"><p>7</p></div>
+		<div class="span-1 border"><p>8</p></div>
+		<div class="span-1 border"><p>9</p></div>
+		<div class="span-1 border"><p>10</p></div>
+
+		<div class="span-1 border"><p>11</p></div>
+		<div class="span-1 border"><p>12</p></div>
+		<div class="span-1 border"><p>13</p></div>
+		<div class="span-1 border"><p>14</p></div>
+		<div class="span-1 border"><p>15</p></div>
+		<div class="span-1 border"><p>16</p></div>
+
+		<div class="span-1 border"><p>17</p></div>
+		<div class="span-1 border"><p>18</p></div>
+		<div class="span-1 border"><p>19</p></div>
+		<div class="span-1 border"><p>20</p></div>
+		<div class="span-1 border"><p>21</p></div>
+		<div class="span-1 border"><p>22</p></div>
+
+		<div class="span-1 border"><p>23</p></div>
+		<div class="span-1 last"><p>24</p></div>
+		
+		
+		<div class="span-4"><p>1</p></div>
+		<div class="span-4"><p>2</p></div>
+		<div class="span-4"><p>3</p></div>
+		<div class="span-4"><p>4</p></div>
+
+		<div class="span-4"><p>5</p></div>
+		<div class="span-4 last"><p>6</p></div>
+		
+		
+		<div class="prefix-23 span-1 last"><p>24</p></div>
+		
+		
+		<div class="prefix-1 span-1"><p>2</p></div>
+		<div class="prefix-20 span-1 suffix-1 last"><p>23</p></div>
+		<hr>
+
+		
+		<div class="span-24">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+		</div>
+		
+
+		<div class="span-12">
+			<div class="span-6">
+				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.</p>
+			</div>
+
+			<div class="span-6 last">
+				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+			</div>
+
+			<div class="span-12 last">
+				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+			</div>
+		</div>
+
+		<div class="span-12 last">
+			<div class="span-6">
+				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.</p>
+			</div>
+
+			<div class="span-6 last">
+				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+			</div>
+
+			<div class="span-12 last">
+				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+			</div>
+		</div>
+		
+
+		<div class="span-14 prefix-5 suffix-5 last">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+		</div>
+
+		<hr>
+		
+		<div class="span-12">
+		  <h5>TESTING .PUSH-1 TO .PUSH-5</h5>
+		
+			<div class="span-2"><img src="test-small.jpg" class="push-1"></div>
+			<div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+
+			<div class="span-2"><img src="test-small.jpg" class="push-2"></div>
+			<div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+
+		
+			<div class="span-2"><img src="test-small.jpg" class="push-3"></div>
+			<div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+
+			<div class="span-2"><img src="test-small.jpg" class="push-4"></div>
+			<div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+
+			<div class="span-2"><img src="test-small.jpg" class="push-5"></div>
+			<div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+
+		
+		</div>
+
+		<div class="span-12 last">
+		  <h5>TESTING .PULL-1 TO .PULL-5</h5>
+			
+			<div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+			<div class="span-2 last"><img src="test-small.jpg" class="top pull-1"></div>
+
+			<div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+
+			<div class="span-2 last"><img src="test-small.jpg" class="top pull-2"></div>		
+
+			<div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+			<div class="span-2 last"><img src="test-small.jpg" class="top pull-3"></div>		
+
+			<div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+			<div class="span-2 last"><img src="test-small.jpg" class="top pull-4"></div>		
+
+			<div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+			<div class="span-2 last"><img src="test-small.jpg" class="top pull-5"></div>		
+
+		</div>
+			
+	</div> <!-- end .container -->
+	
+</body>
+</html>
Index: /ether_2012/web/resources/css/library/bluetrip/examples/index.html
===================================================================
--- /ether_2012/web/resources/css/library/bluetrip/examples/index.html	(revision 319)
+++ /ether_2012/web/resources/css/library/bluetrip/examples/index.html	(revision 319)
@@ -0,0 +1,262 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+	
+<!--
+==============================================
+|       WELCOME TO THE SOURCE CODE!          |
+==============================================
+|                                            |
+|        AUTHOR: Mike Crittenden             |
+|     EMAIL: mike@capsizedesigns.com         |
+|============================================|
+-->
+
+	<title>BlueTripCSS Typography - A Fusion of Blueprint and Tripoli</title>
+	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
+	
+	<link rel="stylesheet" href="../css/screen.css" type="text/css" media="screen, projection" />
+   	<link rel="stylesheet" href="../css/print.css" type="text/css" media="print" /> 
+		
+	<!--[if IE]>
+		<link rel="stylesheet" href="../css/ie.css" type="text/css" media="screen, projection" />
+	<![endif]-->
+	
+   	<link rel="stylesheet" href="../css/style.css" type="text/css" media="screen, projection" />
+
+</head>
+
+<body>
+	<div class="container showgrid">
+			<div class="span-11 colborder">
+			<h1>Level 1 heading</h1>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h1 class="fancy">Level 1 heading class="fancy"</h1>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h1 class="thin">Level 1 heading class="thin"</h1>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h1 class="caps">Level 1 heading class="caps"</h1>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h2>Level 02 Heading</h2>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h2 class="fancy">Level 2 heading class="fancy"</h2>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h2 class="thin">Level 2 heading class="thin"</h2>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h2 class="caps">Level 2 heading class="caps"</h2>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h3>Level 03 Heading</h3>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h3 class="fancy">Level 3 heading class="fancy"</h3>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h3 class="thin">Level 3 heading class="thin"</h3>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h3 class="caps">Level 3 heading class="caps"</h3>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h4>Level 04 Heading</h4>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h4 class="fancy">Level 4 heading class="fancy"</h4>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h4 class="thin">Level 4 heading class="thin"</h4>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h4 class="caps">Level 4 heading class="caps"</h4>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h5>Level 05 Heading</h5>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h5 class="fancy">Level 5 heading class="fancy"</h5>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h5 class="thin">Level 5 heading class="thin"</h5>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h5 class="caps">Level 5 heading class="caps"</h5>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h6>Level 06 Heading</h6>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h6 class="fancy">Level 6 heading class="fancy"</h6>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h6 class="thin">Level 6 heading class="thin"</h6>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h6 class="caps">Level 6 heading class="caps"</h6>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<blockquote><p>Paragraph inside Blockquote: Nam libero leo, elementum in, dapibus a, suscipit vitae, purus. Duis arcu. Integer dignissim fermentum enim. Morbi convallis felis vel nibh. Sed scelerisque sagittis lorem.</p></blockquote>
+			</div><div class="span-12 last">
+			<address>Address: Example address 224, Sweden</address>
+			<pre><strong>Preformated:</strong>Testing one row
+				 and another</pre>
+			<p>
+			I am <a href="?abc123">the a tag</a> example<br />
+
+			I am <abbr title="test">the abbr tag</abbr> example<br />
+
+			I am <acronym>the acronym tag</acronym> example<br />
+			I am <b>the b tag</b> example<br />
+			I am <big>the big tag</big> example<br />
+
+			I am <cite>the cite tag</cite> example<br />
+
+			I am <code>the code tag</code> example<br />
+			I am <del>the del tag</del> example<br />
+			I am <dfn>the dfn tag</dfn> example<br />
+
+			I am <em>the em tag</em> example<br />
+
+			I am <i>the i tag</i> example<br />
+			I am <ins>the ins tag</ins> example<br />
+
+			I am <kbd>the kbd tag</kbd> example<br />
+
+			I am <q>the q tag <q>inside</q> a q tag</q> example<br />
+			I am <samp>the samp tag</samp> example<br />
+
+			I am <small>the small tag</small> example<br />
+			I am <span>the span tag</span> example<br />
+			I am <strong>the strong tag</strong> example<br />
+
+			I am <sub>the sub tag</sub> example<br />
+			I am <sup>the sup tag</sup> example<br />
+			I am <tt>the tt tag</tt> example<br />
+			I am <var>the var tag</var> example<br />
+
+			I am the <span class="small">small class</span> example<br />
+			I am the <span class="large">large class</span> example<br />
+			I am the <span class="quiet">quiet class</span> example<br />
+			I am the <span class="highlight">highlight class</span> example<br />
+			</p>
+			<hr />
+			<ul>
+				<li>Unordered list 01</li>
+				<li>Unordered list 02</li>
+				<li>Unordered list 03
+					<ul>
+
+						<li>Unordered list inside list level 2</li>
+
+						<li>Unordered list inside list level 2
+							<ul>
+								<li>Unordered list inside list level 3</li>
+								<li>Unordered list inside list level 3</li>
+							</ul>
+						</li>
+
+					</ul>
+				</li>
+
+			</ul>
+			<ol>
+				<li>Ordered list 01</li>
+				<li>Ordered list 02</li>
+				<li>Ordered list 03
+					<ol>
+						<li>Ordered list inside list level 2</li>
+
+						<li>Ordered list inside list level 2
+							<ol>
+
+								<li>Ordered list inside list level 3</li>
+								<li>Ordered list inside list level 3</li>
+							</ol>
+						</li>
+					</ol>
+				</li>
+
+			</ol>
+			<dl>
+				<dt>Description list title 01</dt>
+
+				<dd>Description list description 01</dd>
+				<dt>Description list title 02</dt>
+				<dd>Description list description 02</dd>
+				<dd>Description list description 03</dd>
+
+			</dl>
+			<table>
+				<caption>Table Caption</caption>
+
+				<thead>
+					<tr>
+						<th>Table head th</th>
+						<td>Table head td</td>
+					</tr>
+
+				</thead>
+				<tfoot>
+					<tr>
+
+						<th>Table foot th</th>
+						<td>Table foot td</td>
+					</tr>
+				</tfoot>
+
+				<tbody>
+					<tr>
+						<th>Table body th</th>
+
+						<td>Table body td</td>
+					</tr>
+					<tr>
+						<td>Table body td</td>
+
+						<td>Table body td</td>
+					</tr>
+				</tbody>
+
+			</table>
+			<form action="index.html#">
+			<fieldset>
+			<legend>Form legend</legend>
+			<div><label for="f1">Text input:</label><br /><input type="text"  id="f1" value="input text" /></div>
+			<div><label for="f2">Radio input:</label><br /><input type="radio"  id="f2" /></div>
+
+			<div><label for="f3">Checkbox input:</label><br /><input type="checkbox"  id="f3" /></div>
+			<div><label for="f4">Select field:</label><br /><select id="f4"><option>Option 01</option><option>Option 02</option></select></div>
+
+			<div><label for="f5">Textarea:</label><br /><textarea id="f5" cols="30" rows="5" >Textarea text</textarea></div>
+			<div><label for="f6">Input Button:</label> <br /><input type="button" id="f6" value="button text" /></div>
+			<div><label>Button Elements: <span class="small quiet"> Can use &lt;button&gt; tag or &lt;a class="button"&gt;</span></label><br />
+			<button class="button positive">
+	  		<img src="../img/icons/tick.png" alt=""/> Save
+			</button>
+
+			<a class="button" href="index.html#">
+			  <img src="../img/icons/key.png" alt=""/> Change Password
+			</a>
+
+			<a href="index.html#" class="button negative">
+			  <img src="../img/icons/cross.png" alt=""/> Cancel
+			</a></div>
+
+			</fieldset>
+
+			</form>
+			I am <a href="something.doc">a word document</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="something.pdf">a pdf document</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="http://www.something.com">an external website</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="something.rss">an rss feed</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="something.xls">an excel spreadsheet</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="aim:something">an AIM screenname</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="mailto:something">an email address</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="http://yourwebsite.com">an internal link</a>. Change the stylesheet's "http://yourwebsite.com" to your domain name so I don't look like an external link.
+			<br /><br />
+			<p class="success"><img src="../img/icons/tick.png" alt=""/> This is a paragraph with class="success" and <a href="http://www.something.com">a link</a>.</p>
+			<p class="error"><img src="../img/icons/cross.png" alt=""/> This is a paragraph with class="error" and <a href="http://www.something.com">a link</a>.</p>
+			<p class="notice"><img src="../img/icons/key.png" alt=""/> This is a paragraph with class="notice" and <a href="http://www.something.com">a link</a>.</p>
+			</div>
+            <div class="span-24 last center">
+              <p>
+                    <a href="http://validator.w3.org/check?uri=referer" class="noicon">
+                        <img src="http://www.w3.org/Icons/valid-xhtml10"
+                        alt="Valid XHTML 1.0 Strict" height="31" width="88" /></a>
+                    <a href="http://jigsaw.w3.org/css-validator/" class="noicon">
+                        <img src="http://jigsaw.w3.org/css-validator/images/vcss"
+                         alt="Valid CSS!" />
+                    </a>
+                </p>
+
+            </div>
+  
+			
+	</div> <!-- end .container -->
+	
+</body>
+</html>
Index: /ether_2012/web/resources/css/visu_plateform.css
===================================================================
--- /ether_2012/web/resources/css/visu_plateform.css	(revision 319)
+++ /ether_2012/web/resources/css/visu_plateform.css	(revision 319)
@@ -0,0 +1,76 @@
+/* ****************** CONTAINERS ************************* */
+#containerPlateforms, #containerParameters, #containerCalendar
+{
+	margin-top: 10px;
+}
+
+.containerPlateform, .containerParameter
+{
+	color: #6178BC;
+}
+
+.containerPlateform:hover, .containerParameter:hover
+{
+#	text-decoration: underline;
+	background: #70739C;
+	color: #FFFFFF;
+}
+
+/* ****************** LOADINGS ************************* */
+#loadingForPlateforms, #loadingForParameters
+{
+    position: relative;
+    top: 102px;
+    left: 100px;
+}
+
+/* ****************** OTHERS ************************* */
+#NoPlateform, #NoParameter
+{
+    position: relative;
+    top: 100px;
+    left: 65px;
+	color: #04155D;
+}
+
+.plateform_selected, .plateform_selected:hover,
+.parameter_selected, .parameter_selected:hover
+{
+	background: #70739C;
+	color: #E1DEF1;
+	text-decoration: none;
+}
+
+.errorAndButtons{
+#	margin: 0px 22px;
+	margin-left: auto;
+    margin-right: auto;
+    max-width: 240px;
+}
+
+#copyright {
+	margin-left:-80em;
+}
+/** ************************************ **/
+/** ************ CALENDAR ************** **/
+/** ************************************ **/
+.embeddedCalendar
+{
+	margin-top: 10px;
+	margin-bottom: 10px;
+	max-width: 240px;
+}
+
+div.leftField{
+	float: left;
+	margin-left: 53px;
+}
+
+div.rightField{
+	float: right;
+	margin-right: 53px;
+}
+
+/** ************************************ **/
+/** ************ BUTTONS *************** **/
+/** ************************************ **/
Index: /ether_2012/web/resources/js/Button.js
===================================================================
--- /ether_2012/web/resources/js/Button.js	(revision 319)
+++ /ether_2012/web/resources/js/Button.js	(revision 319)
@@ -0,0 +1,126 @@
+//********************************************************
+// Class Button
+// Display a button
+//
+// str value: Value to display in the button
+// dom parent: in which dom element to draw the button
+// int id: id of the dom element
+// func onclick: callback function when button clicked
+// str className : className of the general button
+// str classNameText : className for the button's text 
+//********************************************************
+
+var Button = Class.create({
+    initialize: function( param )
+    {
+        // Init
+        this.id = param.id ? param.id : "";
+        this.parent = param.parent ? param.parent : false;
+        this.value = param.value ? param.value : "";
+        this.className = param.className ? param.className : false;
+        this.classNameText = param.classNameText ? param.classNameText : false;
+        this.callbackOnClick = param.onClick ? param.onClick : false;
+        this.boolDisabled = false;
+        this.boolSelected = false;
+        this.boolDisplayed = false;
+
+        // Create button elements
+        this.divContainer = $(document.createElement("button"));
+        if(this.className)
+        	this.divContainer.className = this.className;
+        this.divContainer.atMe = this;
+        this.divContainer.id = this.id;
+        if( this.parent )
+            this.parent.appendChild(this.divContainer);
+
+        this.divText = $(document.createElement("div"));
+        if(this.classNameText)
+        	this.divText.className = "button_text";
+        this.divText.innerHTML = this.value;
+        this.divContainer.appendChild(this.divText);
+        
+        // Define button events
+        Event.observe(this.divContainer, 'click', this.onClick.bindAsEventListener(this));
+        Event.observe(this.divContainer, 'mouseover', this.onHover.bindAsEventListener(this));
+    },
+
+    // Getter / Setter ********************************************************
+
+    getContainer: function()
+    {
+        return this.divContainer;
+    },
+    
+    isDisable : function()
+    {
+        return this.boolDisabled;
+    },
+    
+    isSelected: function()
+    {
+        return this.boolSelected;
+    },
+    
+    setValue : function( value )
+    {
+        this.value = value;
+        this.divText.innerHTML = this.value;
+    },
+    
+    setCallbackOnClick : function( value )
+    {
+        this.callbackOnClick = value;
+    },
+    
+    // Actions ********************************************************
+
+    disable : function()
+    {
+        this.boolDisabled = true;
+        this.divContainer.addClassName("disable");
+    },
+    
+    enable : function()
+    {
+        this.boolDisabled = false;
+        this.divContainer.removeClassName("disable");
+    },
+    
+    select : function( value )
+    {
+        this.boolSelected = value;
+        if( this.boolSelected )
+            this.divContainer.addClassName("selected");
+        else
+            this.divContainer.removeClassName("selected");
+    },
+    
+    show : function()
+    {
+        this.boolDisplayed = true;
+        this.divContainer.style.display = "";
+    },
+
+    hide : function()
+    {
+        this.boolDisplayed = false;
+        this.divContainer.style.display = "none";
+    },
+
+    // Events ********************************************************
+
+    onClick : function( event )
+    {
+        if( !this.isDisable() && (undefined == event.detail || 1 == event.detail) )
+        {
+            if( this.callbackOnClick )
+                this.callbackOnClick();
+        }
+        Event.stop(event);
+    },
+
+    onHover : function( event )
+    {
+        Event.stop(event);
+    }
+});
Index: /ether_2012/web/resources/js/DomHelper.js
===================================================================
--- /ether_2012/web/resources/js/DomHelper.js	(revision 319)
+++ /ether_2012/web/resources/js/DomHelper.js	(revision 319)
@@ -0,0 +1,287 @@
+///
+// Requires prototype
+
+var Dom = Dom || {};
+
+Dom.clearContainer = function( containerId )
+{
+    this.getContainer(containerId).innerHTML = '';
+};
+
+Dom.getContainer = function( containerId )
+{
+    var container = $(containerId);
+    if( !container )
+    {
+        throw('Error: container with id="' + containerId + '" not found.');
+    }
+    return container;
+};
+
+Dom.createContainer = function(containerId, className)
+{        
+	var container = $(document.createElement("div"));
+	container.id = containerId;
+	if(className)
+		container.className = className;
+	
+	return container;
+};
+
+Dom.isEnter = function( event )
+{
+    var keyCode = event.keyCode || event.which;
+    return 13 == keyCode;
+};
+
+Dom.isDisable = function(containerId)
+{
+	var container = Dom.getContainer(containerId);
+	if(container.className == "disable")
+		return true;
+	else
+		return false;
+}
+
+var Row = Class.create(
+{
+    initialize: function( id, classType )
+    {
+        this.cellType = 'td';
+        if( null != id && "undefined" != id && null != classType)
+            this.domRow = new Element('tr', {id:id, class:classType});
+        else if ( null != id && "undefined" != id )
+            this.domRow = new Element('tr', {id:id});
+        else
+            this.domRow = new Element('tr');
+    },
+
+    addCell: function( contents )
+    {
+        var td = new Element(this.cellType);
+        if( 'string' == typeof contents )
+        {
+            td.update(contents);
+        }
+        else
+        {
+            td.insert(contents);
+        }
+        this.domRow.insert(td);
+    },
+
+    addCellWithSpaceIfEmpty: function( contents )
+    {
+        if( null != contents && "" != contents )
+            this.addCell(contents);
+        else
+        {
+            var td = new Element(this.cellType);
+            td.insert("&nbsp;");
+            this.domRow.insert(td);
+        }
+    },
+
+    addRealCell: function( cell )
+    {
+        this.domRow.insert(cell);
+    },
+
+    findInContainer: function( containerId )
+    {
+        var container = Dom.getContainer(containerId);
+        var row;
+        $A(container.childElements()).each(function( each )
+        {
+            if( this.id == each.readAttribute('id') )
+            {
+                row = each;
+                throw $break;
+            }
+        }.bind(this));
+        return row;
+    },
+
+    addToContainer: function( containerId )
+    {
+        var domRow = this.findInContainer(containerId);
+        if( undefined == domRow )
+        {
+            Dom.getContainer(containerId).insert(this.domRow);
+        }
+    },
+
+    removeFromContainer: function( containerId )
+    {
+        var row = this.findInContainer(containerId);
+        if( undefined != row )
+        {
+            row.remove();
+        }
+    }
+});
+
+
+var HeaderRow = Class.create(Row, {
+    initialize: function( $super, name, id )
+    {
+        $super(name, id);
+        this.cellType = 'th';
+    }
+});
+
+
+var Cell = Class.create({
+	
+    initialize: function( id )
+    {
+        if( null != id && "undefined" != id )
+        	this.domCell = new Element('td', {id:id});
+        else
+            this.domCell = new Element('td');
+    },
+
+    addContents: function( contents )
+    {
+        if( 'string' == typeof contents )
+            this.domCell.update(contents);
+        else
+            this.domCell.insert(contents);
+
+        return this.domCell;
+    },
+    
+    addColspan: function(colspan)
+    {
+    	Element.writeAttribute(this.domCell, {colspan:colspan});
+    },
+    
+    addClassName: function(className)
+    {
+    	Element.addClassName(this.domCell, className);
+    },
+});
+
+
+var Select = Class.create({
+    initialize: function( id, className, name, disabled )
+    {
+        this.id = id;
+        this.name = name;
+        this.valueKey = 'value';
+        this.textKey = 'text';
+        if( disabled )
+            this.select = new Element('select', {id:id, disabled:disabled});
+        else
+            this.select = new Element('select', {id:id});
+        this.select.addClassName(className);
+    },
+
+    setValueKey: function( key )
+    {
+        this.valueKey = key;
+    },
+
+    setTextKey: function( key )
+    {
+        this.textKey = key;
+    },
+
+    addOptions: function( options, selectedOption, onClickAction )
+    {
+        options.each(function( option )
+        {
+            this.addOption(option, selectedOption, onClickAction);
+        }.bind(this));
+    },
+
+    addOption: function( option, selectedOption, onClickAction )
+    {
+        var value = this.valueKey ? option[this.valueKey] : option;
+        var text = this.textKey ? option[this.textKey] : option;
+        if( null != selectedOption && value == selectedOption )
+            var option = new Element('option', {value:value, selected:"selected"}).update(text);
+        else
+            var option = new Element('option', {value:value}).update(text);
+
+        if( null != onClickAction )
+            Event.observe(option, 'click', onClickAction.bind(this));
+        this.select.insert(option);
+    },
+
+    addToElement: function( elementId )
+    {
+        $(elementId).insert(this.select);
+    }
+});
+
+
+var DomIdentifiedObject = Class.create(
+{
+    initialize: function( identifiedObject )
+    {
+        this.id = identifiedObject.id;
+        this.code = identifiedObject.code;
+    },
+
+    findInContainer: function( containerId )
+    {
+        var container = Dom.getContainer(containerId);
+        var row;
+        $A(container.childElements()).each(function( each )
+        {
+            if( this.id == each.readAttribute('id') )
+            {
+                row = each;
+                throw $break;
+            }
+        }.bind(this));
+        return row;
+    },
+
+    removeFromContainer: function( containerId )
+    {
+        var row = this.findInContainer(containerId);
+        if( undefined != row )
+        {
+            row.remove();
+        }
+    },
+
+    getBindedButton: function( text, callback, id )
+    {
+        if( id )
+            var button = new Element('input', {type: 'button', value: text, id: id});
+        else
+            var button = new Element('input', {type: 'button', value: text});
+        button.observe('click', callback.bindAsEventListener(this));
+        return button;
+    },
+
+    getInputText: function( idInput, nameInput, valueInput, classInput, actionForOnBlur )
+    {
+        var input = new Element('input', {type: 'text', name:nameInput, id:idInput, value:valueInput, onBlur:actionForOnBlur});
+        input.addClassName(classInput);
+        return input;
+    },
+
+    getCheckBox: function( idInput, nameInput, valueInput, actionForOnBlur )
+    {
+        var input = new Element('input', {type: 'checkbox', name:nameInput, checked:( "true" == valueInput ), id:idInput, onBlur:actionForOnBlur});
+        return input;
+    },
+    
+    getBindedText: function(text, callback)
+    {
+        var text = new Element('a', {class: 'bindedText'}).update(text);
+        text.observe('click', callback.bindAsEventListener(this));
+        return text;
+    },
+    
+    getLink: function( text, url)
+    {
+        var link = new Element('a', {href: url}).update(text);
+        return link;
+    },
+
+});
Index: /ether_2012/web/resources/js/Loading.js
===================================================================
--- /ether_2012/web/resources/js/Loading.js	(revision 319)
+++ /ether_2012/web/resources/js/Loading.js	(revision 319)
@@ -0,0 +1,33 @@
+//******************************************************************************
+// Loading interface
+// parameters :
+// parent : specify the parent of loading component
+// id : component id ( for css style )
+//******************************************************************************
+
+var Loading = Class.create({
+
+    initialize:function( parameters )
+    {
+        //Init parameters
+        this.parent = parameters.parent;
+        this.id = parameters.id;
+
+        //Create loading component
+        this.loadingDiv = document.createElement("div");
+        this.loadingDiv.id = this.id;
+        this.loadingDiv.className = "loading-classic";
+        this.parent.appendChild(this.loadingDiv);
+        this.hide();
+    } ,
+
+    display:function()
+    {
+        this.loadingDiv.style.display = "";
+    },
+
+    hide:function()
+    {
+        this.loadingDiv.style.display = "none";
+    }
+}) ;
Index: /ether_2012/web/resources/js/Request.js
===================================================================
--- /ether_2012/web/resources/js/Request.js	(revision 319)
+++ /ether_2012/web/resources/js/Request.js	(revision 319)
@@ -0,0 +1,27 @@
+var Request = Request || {
+    send: function( params )
+    {
+        new Ajax.Request(params.url,
+        {
+            method:      'post',
+            encoding:    'UTF-8',
+            contentType: 'application/x-www-form-urlencoded',
+            parameters:  params.parameters,
+            onSuccess:   params.onSuccess,
+            onFailure:   params.onFailure || handleError,
+            onComplete:  params.onComplete,
+            evalJSON:    'force'
+        });
+    },
+
+    translate: function( response )
+    {
+        return response.responseText.evalJSON();
+    }
+
+};
+
+function handleError()
+{
+	alert("Error Ajax");
+}
Index: /ether_2012/web/resources/js/ajax.js
===================================================================
--- /ether_2012/web/resources/js/ajax.js	(revision 319)
+++ /ether_2012/web/resources/js/ajax.js	(revision 319)
@@ -0,0 +1,636 @@
+/** ***************************************************** **/
+/** ********************** MEDIAS *********************** **/
+/** ***************************************************** **/
+
+//Retourne l'objet permettant de faire de l'AJAX en fonction du browser
+function getXmlHttpObject(handler){
+   var objXMLHttp=null;
+   if (window.XMLHttpRequest){// Firefox et autres
+       objXMLHttp=new XMLHttpRequest();
+   }else if (window.ActiveXObject){// Internet Explorer 
+       try{
+           objXMLHttp=new ActiveXObject("Msxml2.XMLHTTP") //For IE>=6
+       }catch(ex1){
+           try{
+               objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP") //For IE5.5
+           }catch(ex2){
+               objXMLHttp=null;
+           }
+       }
+   }
+   return objXMLHttp;
+}
+
+// Fonction permettant d'ajouter un contact au jeu cÃŽtÃ© serveur
+function addContact(chemin) {
+	var url = chemin+"/NewContact.do";
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("addContactClient('"+chemin+"');");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+// Fonction permettant d'ajouter un contact au jeu cÃŽtÃ© client
+function addContactClient(chemin) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadreContacts');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length;
+		var table = document.createElement('table');
+		if (nbElem == 0 || lignes[nbElem-1].className == "impair")
+			table.className = "pair";
+		else
+			table.className = "impair";
+		table.innerHTML = 
+			'<tbody>'+
+				'<tr>'+
+					'<td rowspan="8" nowrap="nowrap">'+messContact+' '+nbElem+'</td>'+
+					'<td>'+messNom+' : </td>'+
+					'<td colspan="2"><input id="contactNom_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].nom" value="" type="text"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPrenom+' : </td>'+
+					'<td colspan="2"><input id="contactPrenom_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].prenom" value="" type="text"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messOrg+' : </td>'+
+					'<td colspan="2"><input id="contactOrg_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].organisme" value="" type="text"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messMail+' * : </td>'+
+					'<td colspan="2"><input id="contactMail_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].com.medias.mail" value="" type="text"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messMdp+' * : </td>'+
+					'<td colspan="2"><input id="contactMdp_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].mdp" value="" type="text"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td rowspan="3">'+messRole+' * : </td>'+
+					'<td colspan="2"><input id="contactDef_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].role" value="default" type="radio" checked>'+messDef+'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td colspan="2"><input id="contactPi_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].role" value="pi" type="radio">'+messPi+'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td><input id="contactTech_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].role" value="tech" type="radio">'+messTech+'</td>'+
+					'<td><input onclick="removeContact(\''+chemin+'\','+nbElem+')" value="'+messDelPers+'" type="button"></td>'+
+				'</tr>'+
+			'</tbody>';
+		tableCadre.appendChild(table);
+	}
+}
+
+//Fonction permettant de supprimer un contact au jeu cÃŽtÃ© serveur
+function removeContact(chemin, indexContact) {
+	var url = chemin+"/RemoveContact.do?num="+indexContact;
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("removeContactClient("+indexContact+");");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+// Fonction permettant de supprimer un contact au jeu cÃŽtÃ© client
+function removeContactClient(indexContact) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadreContacts');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length;
+		// On dÃ©cale les valeurs intercalÃ©es
+		for (var num = indexContact ; num < nbElem - 1 ; num++) {
+			document.getElementById('contactNom_'+num).value = document.getElementById('contactNom_'+(num+1)).value;
+			document.getElementById('contactPrenom_'+num).value = document.getElementById('contactPrenom_'+(num+1)).value;
+			document.getElementById('contactOrg_'+num).value = document.getElementById('contactOrg_'+(num+1)).value;
+			document.getElementById('contactMail_'+num).value = document.getElementById('contactMail_'+(num+1)).value;
+			document.getElementById('contactMdp_'+num).value = document.getElementById('contactMdp_'+(num+1)).value;
+			document.getElementById('contactDef_'+num).checked = document.getElementById('contactDef_'+(num+1)).checked;
+			document.getElementById('contactPi_'+num).checked = document.getElementById('contactPi_'+(num+1)).checked;
+			document.getElementById('contactTech_'+num).checked = document.getElementById('contactTech_'+(num+1)).checked;
+		}
+		// On efface la ligne
+		tableCadre.removeChild(lignes[nbElem-1]);
+	}
+}
+
+//Fonction permettant d'ajouter une plateforme au jeu cÃŽtÃ© serveur
+function addPlat(chemin) {
+	var url = chemin+"/NewPlat.do";
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("addPlatClient('"+chemin+"');");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+//Fonction permettant d'ajouter une plateforme au jeu cÃŽtÃ© client
+function addPlatClient(chemin) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadrePlats');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length/2;
+		var table = document.createElement('table');
+		if (nbElem == 0 || lignes[lignes.length-2].className == "impair")
+			table.className = "pair";
+		else
+			table.className = "impair";
+		var nomCat = document.getElementById('nomCateg').value;
+		var listePlats;
+		if (nomCat == "AVION") {
+			listePlats = '<option value="ATR-42">ATR-42</option>'+
+						 '<option value="Piper-Aztec">Piper-Aztec</option>';
+		} else if (nomCat == "SURF_FIXE") {
+			listePlats = '<option value="Ballon Air de Paris">Ballon Air de Paris</option>'+
+						 '<option value="Champs-sur-Marne">Champs-sur-Marne</option>'+
+						 '<option value="CrÃ©teil">CrÃ©teil</option>'+
+						 '<option value="Grignon">Grignon</option>'+
+						 '<option value="Jussieu">Jussieu</option>'+
+						 '<option value="LHVP">LHVP</option>'+
+						 '<option value="Livry-Gargan">Livry-Gargan</option>'+
+						 '<option value="Roissy">Roissy</option>'+
+						 '<option value="SIRTA">SIRTA</option>'+
+						 '<option value="Tour Eiffel">Tour Eiffel</option>';
+		} else {
+			listePlats = '<option value="CEA-LIDAR">CEA-LIDAR</option>'+
+			 			 '<option value="MPI-DOAS">MPI-DOAS</option>'+
+			 			 '<option value="MPI-MOLA">MPI-MOLA</option>'+
+			 			 '<option value="PSI">PSI</option>';
+		}
+		table.innerHTML = 
+			'<tbody>'+
+				'<tr>'+
+					'<td rowspan="9" nowrap="nowrap">'+messPlat+' '+nbElem+'</td>'+
+					'<td>'+messPlatNom+' * : </td>'+
+					'<td colspan="2">'+
+						'<select id="platNom_'+nbElem+'" name="metadata.contenuPrevu.plateformes['+nbElem+'].nom" onchange="majListPlat('+nbElem+')">'+
+							'<option value="-">-</option>'+
+							listePlats+
+						'</select>'+
+						' '+messOth+' '+
+						'<input id="platOth_'+nbElem+'" name="metadata.contenuPrevu.plateformes['+nbElem+'].nomOth" value="" type="text" size="10" onchange="majListPlat('+nbElem+')">'+
+					'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messDesc+' : </td>'+
+					'<td colspan="2"><textarea id="platDesc_'+nbElem+'" name="metadata.contenuPrevu.plateformes['+nbElem+'].desc" cols="50"></textarea></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatImg+' : </td>'+
+					'<td colspan="2"><table width="100%"><tbody><tr><td colspan="2">'+
+						'<img src="'+chemin+'/images/utils/uploadText.png">&nbsp;<input name="metadata.contenuPrevu.plateformes['+nbElem+'].newFile" value="" type="file"><input name="mess['+nbElem+']" value="Upload" type="submit">'+
+					'</td></tr></tbody></table></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatLatMin+' : </td>'+
+					'<td><input id="platLatMin_'+nbElem+'" name=""metadata.contenuPrevu.plateformes['+nbElem+'].lat_min" value="" type="text"></td>'+
+					'<td>'+messPlatLatForm+'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatLatMax+' : </td>'+
+					'<td><input id="platLatMax_'+nbElem+'" name=""metadata.contenuPrevu.plateformes['+nbElem+'].lat_max" value="" type="text"></td>'+
+					'<td>'+messPlatLatForm+'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatLonMin+' : </td>'+
+					'<td><input id="platLonMin_'+nbElem+'" name=""metadata.contenuPrevu.plateformes['+nbElem+'].lon_min" value="" type="text"></td>'+
+					'<td>'+messPlatLonForm+'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatLonMax+' : </td>'+
+					'<td><input id="platLonMax_'+nbElem+'" name=""metadata.contenuPrevu.plateformes['+nbElem+'].lon_max" value="" type="text"></td>'+
+					'<td>'+messPlatLonForm+'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatAltMin+' : </td>'+
+					'<td colspan="2"><input id="platAltMin_'+nbElem+'" name=""metadata.contenuPrevu.plateformes['+nbElem+'].alt_min" value="" type="text"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatAltMax+' : </td>'+
+					'<td><input id="platAltMax_'+nbElem+'" name=""metadata.contenuPrevu.plateformes['+nbElem+'].alt_max" value="" type="text"></td>'+
+					'<td><input onclick="removePlat(\''+chemin+'\','+nbElem+')" value="'+messDelPlat+'" type="button"></td>'+
+				'</tr>'+
+			'</tbody>';
+		tableCadre.appendChild(table);
+		// On rajoute une ligne Ã  la liste de plateformes associÃ©s aux capteurs
+		var tableCapts = document.getElementById('cadreCapts');
+		var selectPlats = tableCapts.getElementsByTagName('select');
+		for (var numsel = 0; numsel < selectPlats.length ; numsel++) {
+			if (numsel % 2 != 0) {
+				var opt = document.createElement('option');
+				opt.text = '-';
+				opt.value = '-';
+				selectPlats[numsel].appendChild(opt);
+			}
+		}
+	}
+}
+
+//Fonction permettant de supprimer une plateforme au jeu cÃŽtÃ© serveur
+function removePlat(chemin, indexPlat) {
+	var url = chemin+"/RemovePlat.do?num="+indexPlat;
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("removePlatClient("+indexPlat+");");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+//Fonction permettant de supprimer une plateforme au jeu cÃŽtÃ© client
+function removePlatClient(indexPlat) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadrePlats');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length/2;
+		// On dÃ©cale les valeurs intercalÃ©es
+		for (var num = indexPlat ; num < nbElem - 1 ; num++) {
+			document.getElementById('platNom_'+num).value = document.getElementById('platNom_'+(num+1)).value;
+			document.getElementById('platOth_'+num).value = document.getElementById('platOth_'+(num+1)).value;
+			document.getElementById('platDesc_'+num).value = document.getElementById('platDesc_'+(num+1)).value;
+			document.getElementById('platLatMin_'+num).value = document.getElementById('platLatMin_'+(num+1)).value;
+			document.getElementById('platLatMax_'+num).value = document.getElementById('platLatMax_'+(num+1)).value;
+			document.getElementById('platLonMin_'+num).value = document.getElementById('platLonMin_'+(num+1)).value;
+			document.getElementById('platLonMax_'+num).value = document.getElementById('platLonMax_'+(num+1)).value;
+			document.getElementById('platAltMin_'+num).value = document.getElementById('platAltMin_'+(num+1)).value;
+			document.getElementById('platAltMax_'+num).value = document.getElementById('platAltMax_'+(num+1)).value;
+		}
+		// On efface la ligne
+		tableCadre.removeChild(lignes[lignes.length-2]);
+		// On efface une ligne Ã  la liste de plateformes associÃ©s aux capteurs
+		var tableCapts = document.getElementById('cadreCapts');
+		var selectPlats = tableCapts.getElementsByTagName('select');
+		for (var numsel = 0; numsel < selectPlats.length ; numsel++) {
+			if (numsel % 2 != 0) {
+				var options = selectPlats[numsel].getElementsByTagName("option");
+				selectPlats[numsel].removeChild(options[indexPlat]);
+			}
+		}
+	}
+}
+
+//Fonction permettant d'ajouter un capteur au jeu cÃŽtÃ© serveur
+function addCapt(chemin) {
+	var url = chemin+"/NewCapt.do";
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("addCaptClient('"+chemin+"');");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+//Fonction permettant d'ajouter un capteur au jeu cÃŽtÃ© client
+function addCaptClient(chemin) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadreCapts');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length;
+		var table = document.createElement('table');
+		if (nbElem == 0 || lignes[nbElem-1].className == "impair")
+			table.className = "pair";
+		else
+			table.className = "impair";
+		var listeCapts ='<option value="Aerosol Collector">Aerosol Collector</option>'+
+						'<option value="Aerosol Mass Spectrometer">Aerosol Mass Spectrometer</option>'+
+						'<option value="Aerosol/Cloud Particle Sizer">Aerosol/Cloud Particle Sizer</option>'+
+						'<option value="Aethalometer">Aethalometer</option>'+
+						'<option value="Airpointer">Airpointer</option>'+
+						'<option value="Anemometer">Anemometer</option>'+
+						'<option value="Autoanalyser">Autoanalyser</option>'+
+						'<option value="AWS (Automated Weather System)">AWS (Automated Weather System)</option>'+
+						'<option value="Backscatter LIDAR">Backscatter LIDAR</option>'+
+						'<option value="Balance">Balance</option>'+
+						'<option value="Camera">Camera</option>'+
+						'<option value="Carbon Analyser">Carbon Analyser</option>'+
+						'<option value="Ceilometer">Ceilometer</option>'+
+						'<option value="Chemiluminescence">Chemiluminescence</option>'+
+						'<option value="CHN Analyzer (Carbon, Hydrogen, Nitrogen)">CHN Analyzer (Carbon, Hydrogen, Nitrogen)</option>'+
+						'<option value="CIMS Mass Spectrometer">CIMS Mass Spectrometer</option>'+
+						'<option value="CO2 Analyser">CO2 Analyser</option>'+
+						'<option value="CPC (Condensation Particle Counter)">CPC (Condensation Particle Counter)</option>'+
+						'<option value="Disdrometer">Disdrometer</option>'+
+						'<option value="Dropsonde">Dropsonde</option>'+
+						'<option value="EAS (Electrical Aerosol Spectrometer)">EAS (Electrical Aerosol Spectrometer)</option>'+
+						'<option value="EC-OC">EC-OC</option>'+
+						'<option value="Eddy Correlation Device">Eddy Correlation Device</option>'+
+						'<option value="Gas Analyser">Gas Analyser</option>'+
+						'<option value="Gas Chromatograph">Gas Chromatograph</option>'+
+						'<option value="Gas Sampler">Gas Sampler</option>'+
+						'<option value="GPS Receiver">GPS Receiver</option>'+
+						'<option value="HTDMA (Hygroscopicity Tandem Differential Mobility Analyser)">HTDMA (Hygroscopicity Tandem Differential Mobility Analyser)</option>'+
+						'<option value="Humidity Sensor">Humidity Sensor</option>'+
+						'<option value="Interferometer">Interferometer</option>'+
+						'<option value="LIDAR (Light Detection and Ranging)">LIDAR (Light Detection and Ranging)</option>'+
+						'<option value="MAAP (Multi Angle Absorption Photometer)">MAAP (Multi Angle Absorption Photometer)</option>'+
+						'<option value="Magnetometer">Magnetometer</option>'+
+						'<option value="Meteo Station">Meteo Station</option>'+
+						'<option value="Microscope">Microscope</option>'+
+						'<option value="Nephelometer">Nephelometer</option>'+
+						'<option value="OPC (Optic Particle Counter)">OPC (Optic Particle Counter)</option>'+
+						'<option value="Oxygen Analyser">Oxygen Analyser</option>'+
+						'<option value="Ozone Analyser">Ozone Analyser</option>'+
+						'<option value="Particle Detector">Particle Detector</option>'+
+						'<option value="PH Meter">PH Meter</option>'+
+						'<option value="Photometer">Photometer</option>'+
+						'<option value="PILS-IC">PILS-IC</option>'+
+						'<option value="PILS-TOC">PILS-TOC</option>'+
+						'<option value="Pressure Sensor">Pressure Sensor</option>'+
+						'<option value="PSAP (Particle Soot Absorption Photometer)">PSAP (Particle Soot Absorption Photometer)</option>'+
+						'<option value="PTRMS">PTRMS</option>'+
+						'<option value="RADAR (Radio Detection and Ranging)">RADAR (Radio Detection and Ranging)</option>'+
+						'<option value="Radiometer">Radiometer</option>'+
+						'<option value="Radiosonde">Radiosonde</option>'+
+						'<option value="Rain gauge">Rain gauge</option>'+
+						'<option value="SMPS (Scanning Mobility Particle Sizer)">SMPS (Scanning Mobility Particle Sizer)</option>'+
+						'<option value="SODAR (Sound Detection and Ranging)">SODAR (Sound Detection and Ranging)</option>'+
+						'<option value="Spectrometer">Spectrometer</option>'+
+						'<option value="Spectroradiometer">Spectroradiometer</option>'+
+						'<option value="TDMPS">TDMPS</option>'+
+						'<option value="Temperature Sensor">Temperature Sensor</option>'+
+						'<option value="TEOM (Tapered Element Oscillating Microbalance)">TEOM (Tapered Element Oscillating Microbalance)</option>'+
+						'<option value="Tethersonde">Tethersonde</option>'+
+						'<option value="UVAPS (Ultraviolet Aerodynamic Particle Sizer)">UVAPS (Ultraviolet Aerodynamic Particle Sizer)</option>'+
+						'<option value="Video Camera">Video Camera</option>'+
+						'<option value="Visual Observations">Visual Observations</option>'+
+						'<option value="VSMPS (Volatility Scanning Mobility Particle Sizer)">VSMPS (Volatility Scanning Mobility Particle Sizer)</option>'+
+						'<option value="VTDMA (Volatility Tandem Differential Mobility Analyser)">VTDMA (Volatility Tandem Differential Mobility Analyser)</option>'+
+						'<option value="Wet Deposition Collector">Wet Deposition Collector</option>'+
+						'<option value="Wet/Dry Precipitation Sampler">Wet/Dry Precipitation Sampler</option>'+
+						'<option value="Wind Profiler">Wind Profiler</option>';
+		var tablePlats = document.getElementById('cadrePlats');
+		var selectPlats = tablePlats.getElementsByTagName('select');
+		var listePlats = "";
+		for (var num = 0 ; num < selectPlats.length ; num++) {
+			listePlats += '<option value="'+selectPlats[num].value+'">'+selectPlats[num].value+'</option>';
+		}
+		table.innerHTML = 
+			'<tbody>'+
+				'<tr>'+
+					'<td rowspan="6" nowrap="nowrap">'+messCapt+' '+nbElem+'</td>'+
+					'<td>'+messCaptType+' * : </td>'+
+					'<td colspan="2">'+
+						'<select id="captType_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].type" onchange="majListCapt('+nbElem+')">'+
+							'<option value="-">-</option>'+
+							listeCapts+
+						'</select>'+
+						' '+messOth+' '+
+						'<input id="captOth_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].typeOth" value="" type="text" onchange="majListCapt('+nbElem+')">'+
+					'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messCaptFab+' : </td>'+
+					'<td colspan="2"><input id="captFab_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].fabriquant" value="" type="text" onchange="majListCapt('+nbElem+')"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messCaptMod+' : </td>'+
+					'<td colspan="2"><input id="captMod_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].modele" value="" type="text" onchange="majListCapt('+nbElem+')"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messCaptNum+' : </td>'+
+					'<td colspan="2"><input id="captNum_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].num" value="" type="text" onchange="majListCapt('+nbElem+')"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messCaptEta+' : </td>'+
+					'<td colspan="2"><textarea id="captEta_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].etalon"></textarea></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messCaptPlat+' * : </td>'+
+					'<td>'+
+						'<select id="captPlat_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].nomPlateforme">'+
+							listePlats+
+						'</select>'+
+					'</td>'+
+					'<td><input onclick="removeCapt(\''+chemin+'\','+nbElem+')" value="'+messDelCapt+'" type="button"></td>'+
+				'</tr>'+
+			'</tbody>';
+		tableCadre.appendChild(table);
+		// On rajoute une ligne Ã  la liste de capteurs associÃ©s aux paramÃštres
+		var tableParams = document.getElementById('cadreParams');
+		var selectCapts = tableParams.getElementsByTagName('select');
+		for (var numsel = 0; numsel < selectCapts.length ; numsel++) {
+			if (numsel % 4 == 3) {
+				var opt = document.createElement('option');
+				opt.text = '-';
+				opt.value = '-';
+				selectCapts[numsel].appendChild(opt);
+			}
+		}
+	}
+}
+
+//Fonction permettant de supprimer un capteur au jeu cÃŽtÃ© serveur
+function removeCapt(chemin, indexCapt) {
+	var url = chemin+"/RemoveCapt.do?num="+indexCapt;
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("removeCaptClient("+indexCapt+");");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+//Fonction permettant de supprimer un capteur au jeu cÃŽtÃ© client
+function removeCaptClient(indexCapt) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadreCapts');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length;
+		// On dÃ©cale les valeurs intercalÃ©es
+		for (var num = indexCapt ; num < nbElem - 1 ; num++) {
+			document.getElementById('captType_'+num).value = document.getElementById('captType_'+(num+1)).value;
+			document.getElementById('captOth_'+num).value = document.getElementById('captOth_'+(num+1)).value;
+			document.getElementById('captFab_'+num).value = document.getElementById('captFab_'+(num+1)).value;
+			document.getElementById('captMod_'+num).value = document.getElementById('captMod_'+(num+1)).value;
+			document.getElementById('captNum_'+num).value = document.getElementById('captNum_'+(num+1)).value;
+			document.getElementById('captEta_'+num).value = document.getElementById('captEta_'+(num+1)).value;
+			document.getElementById('captPlat_'+num).value = document.getElementById('captPlat_'+(num+1)).value;
+		}
+		// On efface la ligne
+		tableCadre.removeChild(lignes[lignes.length-1]);
+		// On efface une ligne Ã  la liste de capteurs associÃ©s aux paramÃštres
+		var tableParams = document.getElementById('cadreParams');
+		var selectCapts = tableParams.getElementsByTagName('select');
+		for (var numsel = 0; numsel < selectCapts.length ; numsel++) {
+			if (numsel % 4 == 3) {
+				var options = selectCapts[numsel].getElementsByTagName("option");
+				selectCapts[numsel].removeChild(options[indexCapt]);
+			}
+		}
+	}
+}
+
+//Fonction permettant d'ajouter un paramÃštre au jeu cÃŽtÃ© serveur
+function addParam(chemin) {
+	var url = chemin+"/NewParam.do";
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("addParamClient('"+chemin+"');");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+//Fonction permettant d'ajouter un paramÃštre au jeu cÃŽtÃ© client
+function addParamClient(chemin) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadreParams');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length;
+		var table = document.createElement('table');
+		if (nbElem == 0 || lignes[nbElem-1].className == "impair")
+			table.className = "pair";
+		else
+			table.className = "impair";
+		var listeUnits = '<option value="no unit">no unit</option>'+
+						 '<option value="deg">&deg;</option>'+
+						 '<option value="degC">&deg;C</option>'+
+						 '<option value="degK">&deg;K</option>'+
+						 '<option value="%">%</option>'+
+						 '<option value="cm-3">cm-3</option>'+
+						 '<option value="hPa">hPa</option>'+
+						 '<option value="m">m</option>'+
+						 '<option value="m-1">m-1</option>'+
+						 '<option value="mbar">mbar</option>'+
+						 '<option value="mm">mm</option>'+
+						 '<option value="mm-1">mm-1</option>'+
+						 '<option value="mm.h-1">mm.h-1</option>'+
+						 '<option value="m.s-1">m.s-1</option>'+
+						 '<option value="microg.m-3">&micro;g.m-3</option>'+
+						 '<option value="ng.m-3">ng.m-3</option>'+
+						 '<option value="ppbv">ppbv</option>'+
+						 '<option value="ppmv">ppmv</option>'+
+						 '<option value="pptv">pptv</option>'+
+						 '<option value="s">s</option>'+
+						 '<option value="s-1">s-1</option>'+
+						 '<option value="W.m-2">W.m-2</option>';
+		var listeCategs = '<option value="Gas Species">Gas Species</option>'+
+						  '<option value="Aerosol Chemical Composition/Mass">Aerosol Chemical Composition/Mass</option>'+
+						  '<option value="Aerosol Properties">Aerosol Properties</option>'+
+						  '<option value="Meteo/Radiation">Meteo/Radiation</option>'+
+						  '<option value="Aircraft Parameters">Aircraft Parameters</option>'+
+						  '<option value="VOC">VOC</option>'+
+						  '<option value="Sums of VOC from PTRMS">Sums of VOC from PTRMS</option>';
+		var cadreCapts = document.getElementById('cadreCapts');
+		var tableCapts = cadreCapts.getElementsByTagName('table');
+		var listeCapts = "";
+		for (var num = 0 ; num < tableCapts.length ; num++) {
+			var type = document.getElementById('captType_'+num).value;
+			var typeOth = document.getElementById('captOth_'+num).value;
+			var fab = document.getElementById('captFab_'+num).value;
+			var mod = document.getElementById('captMod_'+num).value;
+			var nums = document.getElementById('captNum_'+num).value;
+			if (type == "-")
+				type = typeOth;
+			if (fab != "")
+				fab = " "+fab;
+			if (mod != "")
+				mod = " "+mod;
+			if (nums != "")
+				nums = " "+nums;
+			var nomCapt = type+fab+mod+nums;
+			listeCapts += '<option value="'+nomCapt+'">'+nomCapt+'</option>';
+		}
+		table.innerHTML = 
+			'<tbody>'+
+				'<tr>'+
+					'<td rowspan="4" nowrap="nowrap">'+messParam+' '+nbElem+'</td>'+
+					'<td>'+messParamCat+' * : </td>'+
+					'<td colspan="2">'+
+						'<select id="paramCat_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].categorie" onchange="majListParam(this.selectedIndex,'+nbElem+')">'+
+							'<option value="-">-</option>'+
+							listeCategs+
+						'</select>'+
+						' '+messOth+' '+
+						'<input id="catOth_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].categOth" value="" type="text">'+
+					'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messParamNom+' * : </td>'+
+					'<td colspan="2">'+
+						'<select id="paramNom_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].nom" >'+
+							'<option value="-">-</option>'+
+						'</select>'+
+						' '+messOth+' '+
+						'<input id="paramNomOth_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].nomOth" value="" type="text">'+
+					'</td>'+
+				'</tr>'+
+//				'<tr>'+
+//					'<td>'+messParamAb+' : </td>'+
+//					'<td colspan="2"><input id="paramAb_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].abrev" value="" type="text"></td>'+
+//				'</tr>'+
+				'<tr>'+
+					'<td>'+messParamUnit+' * : </td>'+
+					'<td colspan="2">'+
+					'<select id="paramUnit_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].unite">'+
+						'<option value="-">-</option>'+
+						listeUnits+
+					'</select>'+
+					' '+messOth+' '+
+					'<input id="unitOth_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].uniteOth" value="" type="text">'+
+					'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messParamCapt+' * : </td>'+
+					'<td>'+
+						'<select id="paramCapt_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].nomCapteur">'+
+							listeCapts+
+						'</select>'+
+					'</td>'+
+					'<td><input onclick="removeParam(\''+chemin+'\','+nbElem+')" value="'+messDelParam+'" type="button"></td>'+
+				'</tr>'+
+			'</tbody>';
+		tableCadre.appendChild(table);
+	}
+}
+
+//Fonction permettant de supprimer un paramÃštre au jeu cÃŽtÃ© serveur
+function removeParam(chemin, indexParam) {
+	var url = chemin+"/RemoveParam.do?num="+indexParam;
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("removeParamClient("+indexParam+");");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+//Fonction permettant de supprimer un paramÃštre au jeu cÃŽtÃ© client
+function removeParamClient(indexParam) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadreParams');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length;
+		// On dÃ©cale les valeurs intercalÃ©es
+		for (var num = indexParam ; num < nbElem - 1 ; num++) {
+			document.getElementById('paramNom_'+num).value = document.getElementById('paramNom_'+(num+1)).value;
+			document.getElementById('paramNomOth_'+num).value = document.getElementById('paramNomOth_'+(num+1)).value;
+//			document.getElementById('paramAb_'+num).value = document.getElementById('paramAb_'+(num+1)).value;
+			document.getElementById('paramCat_'+num).value = document.getElementById('paramCat_'+(num+1)).value;
+			document.getElementById('catOth_'+num).value = document.getElementById('catOth_'+(num+1)).value;
+			document.getElementById('paramUnit_'+num).value = document.getElementById('paramUnit_'+(num+1)).value;
+			document.getElementById('unitOth_'+num).value = document.getElementById('unitOth_'+(num+1)).value;
+			document.getElementById('paramCapt_'+num).value = document.getElementById('paramCapt_'+(num+1)).value;
+		}
+		// On efface la ligne
+		tableCadre.removeChild(lignes[lignes.length-1]);
+	}
+}
Index: /ether_2012/web/resources/js/autocomplete/css/style.css
===================================================================
--- /ether_2012/web/resources/js/autocomplete/css/style.css	(revision 319)
+++ /ether_2012/web/resources/js/autocomplete/css/style.css	(revision 319)
@@ -0,0 +1,104 @@
+label
+{
+	font-size: 0.7em;
+	font-family:arial;
+	float:left;
+}
+.input {
+	border: 1px solid #99b3b4;
+	width: 300px;
+	background: #e4ebeb;
+	font: 11px verdana, sans-serif;
+	color:#443;
+	padding:3px;
+	margin-bottom:4px;
+	outline:none;
+}
+.input:focus {
+	border:1px solid #567475;
+	background: #e4ebeb;
+}
+.submit-btn {
+	width: 54px;
+	height: 20px;
+	background: #743 url(http://www.roscripts.com/images/submit.gif) no-repeat;
+	outline: none;
+	float:right;
+}
+.submit-btn:hover {
+	background: #069 url(http://www.roscripts.com/images/submit.gif) no-repeat 0 -20px;
+}
+div#container {
+	border:1px solid #99b3b4;
+	padding:15px;
+	margin:50px auto;
+	width:300px;
+}
+.entry ul {
+	list-style:none;
+	margin:0px;
+	padding:0px;
+	display:block;
+}
+.entry li {
+	display:block;
+	margin:0px;
+}
+.entry li a {
+	outline: none;
+	background-color: #fbfbf9;
+	text-decoration:none;
+	display:block;
+	padding:10px 0 10px 15px;
+	border-bottom:1px solid #f2f2f2;
+	font:bold 75% arial,helvetica,sans-serif;
+	color:#999;
+}
+.entry li a:hover {
+	background:url(../images/go_partner.gif) 645px 25px no-repeat #fff;
+	border-bottom:1px solid #ccc;
+	color:#336699;		
+}
+.entry ul a em {
+	display:block;
+	color:#808080;
+	font-size:90%;
+	padding-right:30px;
+	font-style:normal;
+	font-weight:normal;
+}
+.entry span {
+	display:block;
+	color:#a8a8a8;
+	font-size:0.8em;
+	font-style:normal;
+	font-weight:normal;
+	padding-right:10px;
+}
+.entry a:hover span {
+	color:#800;
+}
+
+div#update {
+      position:absolute;
+      width:250px;
+      background-color:white;
+      color: black;
+      border:1px solid #888;
+      margin:0px;
+      padding:0px;
+}
+div#update ul {
+      list-style-type:none;
+      margin:0px;
+      padding:0px;
+}
+div#update ul li.selected { background-color: #ffb;}
+div#update ul li {
+      list-style-type:none;
+      display:block;
+      margin:0;
+      padding:2px;
+      height:22px;
+      cursor:pointer;
+}
Index: /ether_2012/web/resources/js/autocomplete/db.php
===================================================================
--- /ether_2012/web/resources/js/autocomplete/db.php	(revision 319)
+++ /ether_2012/web/resources/js/autocomplete/db.php	(revision 319)
@@ -0,0 +1,196 @@
+<?php
+
+$string = "Afghanistan,
+Albania,
+Algeria,
+Andorra,
+Angola,
+Antigua and Barbuda,
+Argentina,
+Armenia,
+Australia,
+Austria,
+Azerbaijan,
+Bahamas,
+Bahrain,
+Bangladesh,
+Barbados,
+Belarus,
+Belgium,
+Belize,
+Benin,
+Bhutan,
+Bolivia,
+Bosnia and Herzegovina,
+Botswana,
+Brazil,
+Brunei,
+Bulgaria,
+Burkina Faso,
+Burundi,
+Cambodia,
+Cameroon,
+Canada,
+Cape Verde,
+Central African Republic,
+Chad,
+Chile,
+China,
+Colombia,
+Comoros,
+Congo,
+Costa Rica,
+Cote d'Ivoire,
+Croatia,
+Cuba,
+Cyprus,
+Czech Republic,
+Denmark,
+Djibouti,
+Dominica,
+Dominican Republic,
+East Timor (Timor Timur),
+Ecuador,
+Egypt,
+El Salvador,
+Equatorial Guinea,
+Eritrea,
+Estonia,
+Ethiopia,
+Fiji,
+Finland,
+France,
+Gabon,
+Gambia, The,
+Georgia,
+Germany,
+Ghana,
+Greece,
+Grenada,
+Guatemala,
+Guinea,
+Guinea-Bissau,
+Guyana,
+Haiti,
+Honduras,
+Hungary,
+Iceland,
+India,
+Indonesia,
+Iran,
+Iraq,
+Ireland,
+Israel,
+Italy,
+Jamaica,
+Japan,
+Jordan,
+Kazakhstan,
+Kenya,
+Kiribati,
+Korea, North,
+Korea, South,
+Kuwait,
+Kyrgyzstan,
+Laos,
+Latvia,
+Lebanon,
+Lesotho,
+Liberia,
+Libya,
+Liechtenstein,
+Lithuania,
+Luxembourg,
+Macedonia,
+Madagascar,
+Malawi,
+Malaysia,
+Maldives,
+Mali,
+Malta,
+Marshall Islands,
+Mauritania,
+Mauritius,
+Mexico,
+Micronesia,
+Moldova,
+Monaco,
+Mongolia,
+Morocco,
+Mozambique,
+Myanmar,
+Namibia,
+Nauru,
+Nepal,
+Netherlands,
+New Zealand,
+Nicaragua,
+Niger,
+Nigeria,
+Norway,
+Oman,
+Pakistan,
+Palau,
+Panama,
+Papua New Guinea,
+Paraguay,
+Peru,
+Philippines,
+Poland,
+Portugal,
+Qatar,
+Romania,
+Russia,
+Rwanda,
+Saint Kitts and Nevis,
+Saint Lucia,
+Saint Vincent and The Grenadines,
+Samoa,
+San Marino,
+Sao Tome and Principe,
+Saudi Arabia,
+Senegal,
+Serbia and Montenegro,
+Seychelles,
+Sierra Leone,
+Singapore,
+Slovakia,
+Slovenia,
+Solomon Islands,
+Somalia,
+South Africa,
+Spain,
+Sri Lanka,
+Sudan,
+Suriname,
+Swaziland,
+Sweden,
+Switzerland,
+Syria,
+Taiwan,
+Tajikistan,
+Tanzania,
+Thailand,
+Togo,
+Tonga,
+Trinidad and Tobago,
+Tunisia,
+Turkey,
+Turkmenistan,
+Tuvalu,
+Uganda,
+Ukraine,
+United Arab Emirates,
+United Kingdom,
+United States,
+Uruguay,
+Uzbekistan,
+Vanuatu,
+Vatican City,
+Venezuela,
+Vietnam,
+Western Sahara,
+Yemen,
+Zambia,
+Zimbabwe";
+?>
Index: /ether_2012/web/resources/js/autocomplete/index.html
===================================================================
--- /ether_2012/web/resources/js/autocomplete/index.html	(revision 319)
+++ /ether_2012/web/resources/js/autocomplete/index.html	(revision 319)
@@ -0,0 +1,63 @@
+<!--<html>-->
+<!--<head>-->
+<!--<base href="http://www.ajaxdaddy.com/media/demos/play/1/scriptaculous-autocomplete/autocomplete/"/>-->
+<!--<title>X Scriptaculous - Ajax auto-suggest</title>-->
+<!--<meta http-equiv="content-type" content="text/html; charset=utf-8"/>-->
+
+<!--<script src="javascript/prototype.js" type="text/javascript"></script>-->
+<!--<script src="javascript/effects.js" type="text/javascript"></script>-->
+<!--<script src="javascript/controls.js" type="text/javascript"></script>-->
+<!--<link rel="stylesheet" href="css/style.css" type="text/css"/>-->
+<!--</head>-->
+<!--<body>-->
+<!--<div id="container">-->
+<!--<form method="get" action="">-->
+<!--<label for="testinput">Search for a country name</label><br/>-->
+<!--<input type="text" id="search" name="search" autocomplete="off" class="input" value=""/><br/>-->
+
+<!--<div id="update" style="display: none; position:relative;"></div>-->
+<!--<input type="image" name="register" class="submit-btn" src="http://www.roscripts.com/images/btn.gif"-->
+<!--alt="submit" title="submit"/>-->
+<!--</form>-->
+<!--<script type="text/javascript">-->
+<!--//alert('bau');-->
+<!--new Ajax.Autocompleter( 'search', 'update', 'response.php', { tokens: ','} );-->
+
+<!--</script>-->
+<!--</div>-->
+<!--</body>-->
+<!--</html>-->
+<!---->
+
+<html>
+<head>
+    <base href="http://www.ajaxdaddy.com/media/demos/play/1/scriptaculous-autocomplete/autocomplete/"/>
+
+    <title>X Scriptaculous - Ajax auto-suggest</title>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+
+    <script src="javascript/prototype.js" type="text/javascript"></script>
+    <script src="javascript/effects.js" type="text/javascript"></script>
+    <script src="javascript/controls.js" type="text/javascript"></script>
+    <link rel="stylesheet" href="   css/autocomplete/style.css" type="text/css"/>
+
+</head>
+<body>
+<div id="container">
+    <form method="get" action="">
+        <label for="testinput">Search for a country name</label><br/>
+        <input type="text" id="search" name="search" autocomplete="off" class="input" value=""/><br/>
+
+        <div id="update" style="display: none; position:relative;"></div>
+        <input type="image" name="register" class="submit-btn" src="http://www.roscripts.com/images/btn.gif"
+               alt="submit" title="submit"/>
+    </form>
+    dddd
+    <script type="text/javascript">
+        //alert('bau');
+        new Ajax.Autocompleter( 'search', 'update', 'http://localhost:8080/Project_source/resources/js/autocomplete/response.php', { tokens: ','} );
+
+    </script>
+</div>
+</body>
+</html>
Index: /ether_2012/web/resources/js/autocomplete/javascript/builder.js
===================================================================
--- /ether_2012/web/resources/js/autocomplete/javascript/builder.js	(revision 319)
+++ /ether_2012/web/resources/js/autocomplete/javascript/builder.js	(revision 319)
@@ -0,0 +1,131 @@
+// script.aculo.us builder.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+
+// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+var Builder = {
+  NODEMAP: {
+    AREA: 'map',
+    CAPTION: 'table',
+    COL: 'table',
+    COLGROUP: 'table',
+    LEGEND: 'fieldset',
+    OPTGROUP: 'select',
+    OPTION: 'select',
+    PARAM: 'object',
+    TBODY: 'table',
+    TD: 'table',
+    TFOOT: 'table',
+    TH: 'table',
+    THEAD: 'table',
+    TR: 'table'
+  },
+  // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
+  //       due to a Firefox bug
+  node: function(elementName) {
+    elementName = elementName.toUpperCase();
+    
+    // try innerHTML approach
+    var parentTag = this.NODEMAP[elementName] || 'div';
+    var parentElement = document.createElement(parentTag);
+    try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+      parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
+    } catch(e) {}
+    var element = parentElement.firstChild || null;
+      
+    // see if browser added wrapping tags
+    if(element && (element.tagName.toUpperCase() != elementName))
+      element = element.getElementsByTagName(elementName)[0];
+    
+    // fallback to createElement approach
+    if(!element) element = document.createElement(elementName);
+    
+    // abort if nothing could be created
+    if(!element) return;
+
+    // attributes (or text)
+    if(arguments[1])
+      if(this._isStringOrNumber(arguments[1]) ||
+        (arguments[1] instanceof Array)) {
+          this._children(element, arguments[1]);
+        } else {
+          var attrs = this._attributes(arguments[1]);
+          if(attrs.length) {
+            try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+              parentElement.innerHTML = "<" +elementName + " " +
+                attrs + "></" + elementName + ">";
+            } catch(e) {}
+            element = parentElement.firstChild || null;
+            // workaround firefox 1.0.X bug
+            if(!element) {
+              element = document.createElement(elementName);
+              for(attr in arguments[1]) 
+                element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
+            }
+            if(element.tagName.toUpperCase() != elementName)
+              element = parentElement.getElementsByTagName(elementName)[0];
+            }
+        } 
+
+    // text, or array of children
+    if(arguments[2])
+      this._children(element, arguments[2]);
+
+     return element;
+  },
+  _text: function(text) {
+     return document.createTextNode(text);
+  },
+
+  ATTR_MAP: {
+    'className': 'class',
+    'htmlFor': 'for'
+  },
+
+  _attributes: function(attributes) {
+    var attrs = [];
+    for(attribute in attributes)
+      attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
+          '="' + attributes[attribute].toString().escapeHTML() + '"');
+    return attrs.join(" ");
+  },
+  _children: function(element, children) {
+    if(typeof children=='object') { // array can hold nodes and text
+      children.flatten().each( function(e) {
+        if(typeof e=='object')
+          element.appendChild(e)
+        else
+          if(Builder._isStringOrNumber(e))
+            element.appendChild(Builder._text(e));
+      });
+    } else
+      if(Builder._isStringOrNumber(children)) 
+         element.appendChild(Builder._text(children));
+  },
+  _isStringOrNumber: function(param) {
+    return(typeof param=='string' || typeof param=='number');
+  },
+  build: function(html) {
+    var element = this.node('div');
+    $(element).update(html.strip());
+    return element.down();
+  },
+  dump: function(scope) { 
+    if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope 
+  
+    var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
+      "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
+      "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
+      "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
+      "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
+      "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
+  
+    tags.each( function(tag){ 
+      scope[tag] = function() { 
+        return Builder.node.apply(Builder, [tag].concat($A(arguments)));  
+      } 
+    });
+  }
+}
Index: /ether_2012/web/resources/js/autocomplete/javascript/controls.js
===================================================================
--- /ether_2012/web/resources/js/autocomplete/javascript/controls.js	(revision 319)
+++ /ether_2012/web/resources/js/autocomplete/javascript/controls.js	(revision 319)
@@ -0,0 +1,835 @@
+// script.aculo.us controls.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+
+// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005, 2006 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
+//           (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
+// Contributors:
+//  Richard Livsey
+//  Rahul Bhargava
+//  Rob Wills
+// 
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// Autocompleter.Base handles all the autocompletion functionality 
+// that's independent of the data source for autocompletion. This
+// includes drawing the autocompletion menu, observing keyboard
+// and mouse events, and similar.
+//
+// Specific autocompleters need to provide, at the very least, 
+// a getUpdatedChoices function that will be invoked every time
+// the text inside the monitored textbox changes. This method 
+// should get the text for which to provide autocompletion by
+// invoking this.getToken(), NOT by directly accessing
+// this.element.value. This is to allow incremental tokenized
+// autocompletion. Specific auto-completion logic (AJAX, etc)
+// belongs in getUpdatedChoices.
+//
+// Tokenized incremental autocompletion is enabled automatically
+// when an autocompleter is instantiated with the 'tokens' option
+// in the options parameter, e.g.:
+// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
+// will incrementally autocomplete with a comma as the token.
+// Additionally, ',' in the above example can be replaced with
+// a token array, e.g. { tokens: [',', '\n'] } which
+// enables autocompletion on multiple tokens. This is most 
+// useful when one of the tokens is \n (a newline), as it 
+// allows smart autocompletion after linebreaks.
+
+if(typeof Effect == 'undefined')
+  throw("controls.js requires including script.aculo.us' effects.js library");
+
+var Autocompleter = {}
+Autocompleter.Base = function() {};
+Autocompleter.Base.prototype = {
+  baseInitialize: function(element, update, options) {
+    this.element     = $(element); 
+    this.update      = $(update);  
+    this.hasFocus    = false; 
+    this.changed     = false; 
+    this.active      = false; 
+    this.index       = 0;     
+    this.entryCount  = 0;
+
+    if(this.setOptions)
+      this.setOptions(options);
+    else
+      this.options = options || {};
+
+    this.options.paramName    = this.options.paramName || this.element.name;
+    this.options.tokens       = this.options.tokens || [];
+    this.options.frequency    = this.options.frequency || 0.4;
+    this.options.minChars     = this.options.minChars || 1;
+    this.options.onShow       = this.options.onShow || 
+      function(element, update){ 
+        if(!update.style.position || update.style.position=='absolute') {
+          update.style.position = 'absolute';
+          Position.clone(element, update, {
+            setHeight: false, 
+            offsetTop: element.offsetHeight
+          });
+        }
+        Effect.Appear(update,{duration:0.15});
+      };
+    this.options.onHide = this.options.onHide || 
+      function(element, update){ new Effect.Fade(update,{duration:0.15}) };
+
+    if(typeof(this.options.tokens) == 'string') 
+      this.options.tokens = new Array(this.options.tokens);
+
+    this.observer = null;
+    
+    this.element.setAttribute('autocomplete','off');
+
+    Element.hide(this.update);
+
+    Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
+    Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
+  },
+
+  show: function() {
+    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
+    if(!this.iefix && 
+      (navigator.appVersion.indexOf('MSIE')>0) &&
+      (navigator.userAgent.indexOf('Opera')<0) &&
+      (Element.getStyle(this.update, 'position')=='absolute')) {
+      new Insertion.After(this.update, 
+       '<iframe id="' + this.update.id + '_iefix" '+
+       'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
+       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
+      this.iefix = $(this.update.id+'_iefix');
+    }
+    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
+  },
+  
+  fixIEOverlapping: function() {
+    Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
+    this.iefix.style.zIndex = 1;
+    this.update.style.zIndex = 2;
+    Element.show(this.iefix);
+  },
+
+  hide: function() {
+    this.stopIndicator();
+    if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
+    if(this.iefix) Element.hide(this.iefix);
+  },
+
+  startIndicator: function() {
+    if(this.options.indicator) Element.show(this.options.indicator);
+  },
+
+  stopIndicator: function() {
+    if(this.options.indicator) Element.hide(this.options.indicator);
+  },
+
+  onKeyPress: function(event) {
+    if(this.active)
+      switch(event.keyCode) {
+       case Event.KEY_TAB:
+       case Event.KEY_RETURN:
+         this.selectEntry();
+         Event.stop(event);
+       case Event.KEY_ESC:
+         this.hide();
+         this.active = false;
+         Event.stop(event);
+         return;
+       case Event.KEY_LEFT:
+       case Event.KEY_RIGHT:
+         return;
+       case Event.KEY_UP:
+         this.markPrevious();
+         this.render();
+         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+         return;
+       case Event.KEY_DOWN:
+         this.markNext();
+         this.render();
+         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+         return;
+      }
+     else 
+       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || 
+         (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;
+
+    this.changed = true;
+    this.hasFocus = true;
+
+    if(this.observer) clearTimeout(this.observer);
+      this.observer = 
+        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
+  },
+
+  activate: function() {
+    this.changed = false;
+    this.hasFocus = true;
+    this.getUpdatedChoices();
+  },
+
+  onHover: function(event) {
+    var element = Event.findElement(event, 'LI');
+    if(this.index != element.autocompleteIndex) 
+    {
+        this.index = element.autocompleteIndex;
+        this.render();
+    }
+    Event.stop(event);
+  },
+  
+  onClick: function(event) {
+    var element = Event.findElement(event, 'LI');
+    this.index = element.autocompleteIndex;
+    this.selectEntry();
+    this.hide();
+  },
+  
+  onBlur: function(event) {
+    // needed to make click events working
+    setTimeout(this.hide.bind(this), 250);
+    this.hasFocus = false;
+    this.active = false;     
+  }, 
+  
+  render: function() {
+    if(this.entryCount > 0) {
+      for (var i = 0; i < this.entryCount; i++)
+        this.index==i ? 
+          Element.addClassName(this.getEntry(i),"selected") : 
+          Element.removeClassName(this.getEntry(i),"selected");
+        
+      if(this.hasFocus) { 
+        this.show();
+        this.active = true;
+      }
+    } else {
+      this.active = false;
+      this.hide();
+    }
+  },
+  
+  markPrevious: function() {
+    if(this.index > 0) this.index--
+      else this.index = this.entryCount-1;
+    this.getEntry(this.index).scrollIntoView(true);
+  },
+  
+  markNext: function() {
+    if(this.index < this.entryCount-1) this.index++
+      else this.index = 0;
+    this.getEntry(this.index).scrollIntoView(false);
+  },
+  
+  getEntry: function(index) {
+    return this.update.firstChild.childNodes[index];
+  },
+  
+  getCurrentEntry: function() {
+    return this.getEntry(this.index);
+  },
+  
+  selectEntry: function() {
+    this.active = false;
+    this.updateElement(this.getCurrentEntry());
+  },
+
+  updateElement: function(selectedElement) {
+    if (this.options.updateElement) {
+      this.options.updateElement(selectedElement);
+      return;
+    }
+    var value = '';
+    if (this.options.select) {
+      var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
+      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
+    } else
+      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
+    
+    var lastTokenPos = this.findLastToken();
+    if (lastTokenPos != -1) {
+      var newValue = this.element.value.substr(0, lastTokenPos + 1);
+      var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
+      if (whitespace)
+        newValue += whitespace[0];
+      this.element.value = newValue + value;
+    } else {
+      this.element.value = value;
+    }
+    this.element.focus();
+    
+    if (this.options.afterUpdateElement)
+      this.options.afterUpdateElement(this.element, selectedElement);
+  },
+
+  updateChoices: function(choices) {
+    if(!this.changed && this.hasFocus) {
+      this.update.innerHTML = choices;
+      Element.cleanWhitespace(this.update);
+      Element.cleanWhitespace(this.update.down());
+
+      if(this.update.firstChild && this.update.down().childNodes) {
+        this.entryCount = 
+          this.update.down().childNodes.length;
+        for (var i = 0; i < this.entryCount; i++) {
+          var entry = this.getEntry(i);
+          entry.autocompleteIndex = i;
+          this.addObservers(entry);
+        }
+      } else { 
+        this.entryCount = 0;
+      }
+
+      this.stopIndicator();
+      this.index = 0;
+      
+      if(this.entryCount==1 && this.options.autoSelect) {
+        this.selectEntry();
+        this.hide();
+      } else {
+        this.render();
+      }
+    }
+  },
+
+  addObservers: function(element) {
+    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
+    Event.observe(element, "click", this.onClick.bindAsEventListener(this));
+  },
+
+  onObserverEvent: function() {
+    this.changed = false;   
+    if(this.getToken().length>=this.options.minChars) {
+      this.startIndicator();
+      this.getUpdatedChoices();
+    } else {
+      this.active = false;
+      this.hide();
+    }
+  },
+
+  getToken: function() {
+    var tokenPos = this.findLastToken();
+    if (tokenPos != -1)
+      var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
+    else
+      var ret = this.element.value;
+
+    return /\n/.test(ret) ? '' : ret;
+  },
+
+  findLastToken: function() {
+    var lastTokenPos = -1;
+
+    for (var i=0; i<this.options.tokens.length; i++) {
+      var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
+      if (thisTokenPos > lastTokenPos)
+        lastTokenPos = thisTokenPos;
+    }
+    return lastTokenPos;
+  }
+}
+
+Ajax.Autocompleter = Class.create();
+Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
+  initialize: function(element, update, url, options) {
+    this.baseInitialize(element, update, options);
+    this.options.asynchronous  = true;
+    this.options.onComplete    = this.onComplete.bind(this);
+    this.options.defaultParams = this.options.parameters || null;
+    this.url                   = url;
+  },
+
+  getUpdatedChoices: function() {
+    entry = encodeURIComponent(this.options.paramName) + '=' + 
+      encodeURIComponent(this.getToken());
+
+    this.options.parameters = this.options.callback ?
+      this.options.callback(this.element, entry) : entry;
+
+    if(this.options.defaultParams) 
+      this.options.parameters += '&' + this.options.defaultParams;
+
+    new Ajax.Request(this.url, this.options);
+  },
+
+  onComplete: function(request) {
+    this.updateChoices(request.responseText);
+  }
+
+});
+
+// The local array autocompleter. Used when you'd prefer to
+// inject an array of autocompletion options into the page, rather
+// than sending out Ajax queries, which can be quite slow sometimes.
+//
+// The constructor takes four parameters. The first two are, as usual,
+// the id of the monitored textbox, and id of the autocompletion menu.
+// The third is the array you want to autocomplete from, and the fourth
+// is the options block.
+//
+// Extra local autocompletion options:
+// - choices - How many autocompletion choices to offer
+//
+// - partialSearch - If false, the autocompleter will match entered
+//                    text only at the beginning of strings in the 
+//                    autocomplete array. Defaults to true, which will
+//                    match text at the beginning of any *word* in the
+//                    strings in the autocomplete array. If you want to
+//                    search anywhere in the string, additionally set
+//                    the option fullSearch to true (default: off).
+//
+// - fullSsearch - Search anywhere in autocomplete array strings.
+//
+// - partialChars - How many characters to enter before triggering
+//                   a partial match (unlike minChars, which defines
+//                   how many characters are required to do any match
+//                   at all). Defaults to 2.
+//
+// - ignoreCase - Whether to ignore case when autocompleting.
+//                 Defaults to true.
+//
+// It's possible to pass in a custom function as the 'selector' 
+// option, if you prefer to write your own autocompletion logic.
+// In that case, the other options above will not apply unless
+// you support them.
+
+Autocompleter.Local = Class.create();
+Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
+  initialize: function(element, update, array, options) {
+    this.baseInitialize(element, update, options);
+    this.options.array = array;
+  },
+
+  getUpdatedChoices: function() {
+    this.updateChoices(this.options.selector(this));
+  },
+
+  setOptions: function(options) {
+    this.options = Object.extend({
+      choices: 10,
+      partialSearch: true,
+      partialChars: 2,
+      ignoreCase: true,
+      fullSearch: false,
+      selector: function(instance) {
+        var ret       = []; // Beginning matches
+        var partial   = []; // Inside matches
+        var entry     = instance.getToken();
+        var count     = 0;
+
+        for (var i = 0; i < instance.options.array.length &&  
+          ret.length < instance.options.choices ; i++) { 
+
+          var elem = instance.options.array[i];
+          var foundPos = instance.options.ignoreCase ? 
+            elem.toLowerCase().indexOf(entry.toLowerCase()) : 
+            elem.indexOf(entry);
+
+          while (foundPos != -1) {
+            if (foundPos == 0 && elem.length != entry.length) { 
+              ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + 
+                elem.substr(entry.length) + "</li>");
+              break;
+            } else if (entry.length >= instance.options.partialChars && 
+              instance.options.partialSearch && foundPos != -1) {
+              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
+                partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
+                  elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
+                  foundPos + entry.length) + "</li>");
+                break;
+              }
+            }
+
+            foundPos = instance.options.ignoreCase ? 
+              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : 
+              elem.indexOf(entry, foundPos + 1);
+
+          }
+        }
+        if (partial.length)
+          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
+        return "<ul>" + ret.join('') + "</ul>";
+      }
+    }, options || {});
+  }
+});
+
+// AJAX in-place editor
+//
+// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor
+
+// Use this if you notice weird scrolling problems on some browsers,
+// the DOM might be a bit confused when this gets called so do this
+// waits 1 ms (with setTimeout) until it does the activation
+Field.scrollFreeActivate = function(field) {
+  setTimeout(function() {
+    Field.activate(field);
+  }, 1);
+}
+
+Ajax.InPlaceEditor = Class.create();
+Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
+Ajax.InPlaceEditor.prototype = {
+  initialize: function(element, url, options) {
+    this.url = url;
+    this.element = $(element);
+
+    this.options = Object.extend({
+      paramName: "value",
+      okButton: true,
+      okText: "ok",
+      cancelLink: true,
+      cancelText: "cancel",
+      savingText: "Saving...",
+      clickToEditText: "Click to edit",
+      okText: "ok",
+      rows: 1,
+      onComplete: function(transport, element) {
+        new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
+      },
+      onFailure: function(transport) {
+        alert("Error communicating with the server: " + transport.responseText.stripTags());
+      },
+      callback: function(form) {
+        return Form.serialize(form);
+      },
+      handleLineBreaks: true,
+      loadingText: 'Loading...',
+      savingClassName: 'inplaceeditor-saving',
+      loadingClassName: 'inplaceeditor-loading',
+      formClassName: 'inplaceeditor-form',
+      highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
+      highlightendcolor: "#FFFFFF",
+      externalControl: null,
+      submitOnBlur: false,
+      ajaxOptions: {},
+      evalScripts: false
+    }, options || {});
+
+    if(!this.options.formId && this.element.id) {
+      this.options.formId = this.element.id + "-inplaceeditor";
+      if ($(this.options.formId)) {
+        // there's already a form with that name, don't specify an id
+        this.options.formId = null;
+      }
+    }
+    
+    if (this.options.externalControl) {
+      this.options.externalControl = $(this.options.externalControl);
+    }
+    
+    this.originalBackground = Element.getStyle(this.element, 'background-color');
+    if (!this.originalBackground) {
+      this.originalBackground = "transparent";
+    }
+    
+    this.element.title = this.options.clickToEditText;
+    
+    this.onclickListener = this.enterEditMode.bindAsEventListener(this);
+    this.mouseoverListener = this.enterHover.bindAsEventListener(this);
+    this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
+    Event.observe(this.element, 'click', this.onclickListener);
+    Event.observe(this.element, 'mouseover', this.mouseoverListener);
+    Event.observe(this.element, 'mouseout', this.mouseoutListener);
+    if (this.options.externalControl) {
+      Event.observe(this.options.externalControl, 'click', this.onclickListener);
+      Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
+      Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
+    }
+  },
+  enterEditMode: function(evt) {
+    if (this.saving) return;
+    if (this.editing) return;
+    this.editing = true;
+    this.onEnterEditMode();
+    if (this.options.externalControl) {
+      Element.hide(this.options.externalControl);
+    }
+    Element.hide(this.element);
+    this.createForm();
+    this.element.parentNode.insertBefore(this.form, this.element);
+    if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);
+    // stop the event to avoid a page refresh in Safari
+    if (evt) {
+      Event.stop(evt);
+    }
+    return false;
+  },
+  createForm: function() {
+    this.form = document.createElement("form");
+    this.form.id = this.options.formId;
+    Element.addClassName(this.form, this.options.formClassName)
+    this.form.onsubmit = this.onSubmit.bind(this);
+
+    this.createEditField();
+
+    if (this.options.textarea) {
+      var br = document.createElement("br");
+      this.form.appendChild(br);
+    }
+
+    if (this.options.okButton) {
+      okButton = document.createElement("input");
+      okButton.type = "submit";
+      okButton.value = this.options.okText;
+      okButton.className = 'editor_ok_button';
+      this.form.appendChild(okButton);
+    }
+
+    if (this.options.cancelLink) {
+      cancelLink = document.createElement("a");
+      cancelLink.href = "#";
+      cancelLink.appendChild(document.createTextNode(this.options.cancelText));
+      cancelLink.onclick = this.onclickCancel.bind(this);
+      cancelLink.className = 'editor_cancel';      
+      this.form.appendChild(cancelLink);
+    }
+  },
+  hasHTMLLineBreaks: function(string) {
+    if (!this.options.handleLineBreaks) return false;
+    return string.match(/<br/i) || string.match(/<p>/i);
+  },
+  convertHTMLLineBreaks: function(string) {
+    return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
+  },
+  createEditField: function() {
+    var text;
+    if(this.options.loadTextURL) {
+      text = this.options.loadingText;
+    } else {
+      text = this.getText();
+    }
+
+    var obj = this;
+    
+    if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
+      this.options.textarea = false;
+      var textField = document.createElement("input");
+      textField.obj = this;
+      textField.type = "text";
+      textField.name = this.options.paramName;
+      textField.value = text;
+      textField.style.backgroundColor = this.options.highlightcolor;
+      textField.className = 'editor_field';
+      var size = this.options.size || this.options.cols || 0;
+      if (size != 0) textField.size = size;
+      if (this.options.submitOnBlur)
+        textField.onblur = this.onSubmit.bind(this);
+      this.editField = textField;
+    } else {
+      this.options.textarea = true;
+      var textArea = document.createElement("textarea");
+      textArea.obj = this;
+      textArea.name = this.options.paramName;
+      textArea.value = this.convertHTMLLineBreaks(text);
+      textArea.rows = this.options.rows;
+      textArea.cols = this.options.cols || 40;
+      textArea.className = 'editor_field';      
+      if (this.options.submitOnBlur)
+        textArea.onblur = this.onSubmit.bind(this);
+      this.editField = textArea;
+    }
+    
+    if(this.options.loadTextURL) {
+      this.loadExternalText();
+    }
+    this.form.appendChild(this.editField);
+  },
+  getText: function() {
+    return this.element.innerHTML;
+  },
+  loadExternalText: function() {
+    Element.addClassName(this.form, this.options.loadingClassName);
+    this.editField.disabled = true;
+    new Ajax.Request(
+      this.options.loadTextURL,
+      Object.extend({
+        asynchronous: true,
+        onComplete: this.onLoadedExternalText.bind(this)
+      }, this.options.ajaxOptions)
+    );
+  },
+  onLoadedExternalText: function(transport) {
+    Element.removeClassName(this.form, this.options.loadingClassName);
+    this.editField.disabled = false;
+    this.editField.value = transport.responseText.stripTags();
+    Field.scrollFreeActivate(this.editField);
+  },
+  onclickCancel: function() {
+    this.onComplete();
+    this.leaveEditMode();
+    return false;
+  },
+  onFailure: function(transport) {
+    this.options.onFailure(transport);
+    if (this.oldInnerHTML) {
+      this.element.innerHTML = this.oldInnerHTML;
+      this.oldInnerHTML = null;
+    }
+    return false;
+  },
+  onSubmit: function() {
+    // onLoading resets these so we need to save them away for the Ajax call
+    var form = this.form;
+    var value = this.editField.value;
+    
+    // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
+    // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
+    // to be displayed indefinitely
+    this.onLoading();
+    
+    if (this.options.evalScripts) {
+      new Ajax.Request(
+        this.url, Object.extend({
+          parameters: this.options.callback(form, value),
+          onComplete: this.onComplete.bind(this),
+          onFailure: this.onFailure.bind(this),
+          asynchronous:true, 
+          evalScripts:true
+        }, this.options.ajaxOptions));
+    } else  {
+      new Ajax.Updater(
+        { success: this.element,
+          // don't update on failure (this could be an option)
+          failure: null }, 
+        this.url, Object.extend({
+          parameters: this.options.callback(form, value),
+          onComplete: this.onComplete.bind(this),
+          onFailure: this.onFailure.bind(this)
+        }, this.options.ajaxOptions));
+    }
+    // stop the event to avoid a page refresh in Safari
+    if (arguments.length > 1) {
+      Event.stop(arguments[0]);
+    }
+    return false;
+  },
+  onLoading: function() {
+    this.saving = true;
+    this.removeForm();
+    this.leaveHover();
+    this.showSaving();
+  },
+  showSaving: function() {
+    this.oldInnerHTML = this.element.innerHTML;
+    this.element.innerHTML = this.options.savingText;
+    Element.addClassName(this.element, this.options.savingClassName);
+    this.element.style.backgroundColor = this.originalBackground;
+    Element.show(this.element);
+  },
+  removeForm: function() {
+    if(this.form) {
+      if (this.form.parentNode) Element.remove(this.form);
+      this.form = null;
+    }
+  },
+  enterHover: function() {
+    if (this.saving) return;
+    this.element.style.backgroundColor = this.options.highlightcolor;
+    if (this.effect) {
+      this.effect.cancel();
+    }
+    Element.addClassName(this.element, this.options.hoverClassName)
+  },
+  leaveHover: function() {
+    if (this.options.backgroundColor) {
+      this.element.style.backgroundColor = this.oldBackground;
+    }
+    Element.removeClassName(this.element, this.options.hoverClassName)
+    if (this.saving) return;
+    this.effect = new Effect.Highlight(this.element, {
+      startcolor: this.options.highlightcolor,
+      endcolor: this.options.highlightendcolor,
+      restorecolor: this.originalBackground
+    });
+  },
+  leaveEditMode: function() {
+    Element.removeClassName(this.element, this.options.savingClassName);
+    this.removeForm();
+    this.leaveHover();
+    this.element.style.backgroundColor = this.originalBackground;
+    Element.show(this.element);
+    if (this.options.externalControl) {
+      Element.show(this.options.externalControl);
+    }
+    this.editing = false;
+    this.saving = false;
+    this.oldInnerHTML = null;
+    this.onLeaveEditMode();
+  },
+  onComplete: function(transport) {
+    this.leaveEditMode();
+    this.options.onComplete.bind(this)(transport, this.element);
+  },
+  onEnterEditMode: function() {},
+  onLeaveEditMode: function() {},
+  dispose: function() {
+    if (this.oldInnerHTML) {
+      this.element.innerHTML = this.oldInnerHTML;
+    }
+    this.leaveEditMode();
+    Event.stopObserving(this.element, 'click', this.onclickListener);
+    Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
+    Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
+    if (this.options.externalControl) {
+      Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
+      Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
+      Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
+    }
+  }
+};
+
+Ajax.InPlaceCollectionEditor = Class.create();
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
+  createEditField: function() {
+    if (!this.cached_selectTag) {
+      var selectTag = document.createElement("select");
+      var collection = this.options.collection || [];
+      var optionTag;
+      collection.each(function(e,i) {
+        optionTag = document.createElement("option");
+        optionTag.value = (e instanceof Array) ? e[0] : e;
+        if((typeof this.options.value == 'undefined') && 
+          ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;
+        if(this.options.value==optionTag.value) optionTag.selected = true;
+        optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
+        selectTag.appendChild(optionTag);
+      }.bind(this));
+      this.cached_selectTag = selectTag;
+    }
+
+    this.editField = this.cached_selectTag;
+    if(this.options.loadTextURL) this.loadExternalText();
+    this.form.appendChild(this.editField);
+    this.options.callback = function(form, value) {
+      return "value=" + encodeURIComponent(value);
+    }
+  }
+});
+
+// Delayed observer, like Form.Element.Observer, 
+// but waits for delay after last key input
+// Ideal for live-search fields
+
+Form.Element.DelayedObserver = Class.create();
+Form.Element.DelayedObserver.prototype = {
+  initialize: function(element, delay, callback) {
+    this.delay     = delay || 0.5;
+    this.element   = $(element);
+    this.callback  = callback;
+    this.timer     = null;
+    this.lastValue = $F(this.element); 
+    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
+  },
+  delayedListener: function(event) {
+    if(this.lastValue == $F(this.element)) return;
+    if(this.timer) clearTimeout(this.timer);
+    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
+    this.lastValue = $F(this.element);
+  },
+  onTimerEvent: function() {
+    this.timer = null;
+    this.callback(this.element, $F(this.element));
+  }
+};
Index: /ether_2012/web/resources/js/autocomplete/javascript/effects.js
===================================================================
--- /ether_2012/web/resources/js/autocomplete/javascript/effects.js	(revision 319)
+++ /ether_2012/web/resources/js/autocomplete/javascript/effects.js	(revision 319)
@@ -0,0 +1,1090 @@
+// script.aculo.us effects.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+
+// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Contributors:
+//  Justin Palmer (http://encytemedia.com/)
+//  Mark Pilgrim (http://diveintomark.org/)
+//  Martin Bialasinki
+// 
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/ 
+
+// converts rgb() and #xxx to #xxxxxx format,  
+// returns self (or first argument) if not convertable  
+String.prototype.parseColor = function() {  
+  var color = '#';
+  if(this.slice(0,4) == 'rgb(') {  
+    var cols = this.slice(4,this.length-1).split(',');  
+    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
+  } else {  
+    if(this.slice(0,1) == '#') {  
+      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
+      if(this.length==7) color = this.toLowerCase();  
+    }  
+  }  
+  return(color.length==7 ? color : (arguments[0] || this));  
+}
+
+/*--------------------------------------------------------------------------*/
+
+Element.collectTextNodes = function(element) {  
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue : 
+      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
+  }).flatten().join('');
+}
+
+Element.collectTextNodesIgnoreClass = function(element, className) {  
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue : 
+      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
+        Element.collectTextNodesIgnoreClass(node, className) : ''));
+  }).flatten().join('');
+}
+
+Element.setContentZoom = function(element, percent) {
+  element = $(element);  
+  element.setStyle({fontSize: (percent/100) + 'em'});   
+  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+  return element;
+}
+
+Element.getOpacity = function(element){
+  return $(element).getStyle('opacity');
+}
+
+Element.setOpacity = function(element, value){
+  return $(element).setStyle({opacity:value});
+}
+
+Element.getInlineOpacity = function(element){
+  return $(element).style.opacity || '';
+}
+
+Element.forceRerendering = function(element) {
+  try {
+    element = $(element);
+    var n = document.createTextNode(' ');
+    element.appendChild(n);
+    element.removeChild(n);
+  } catch(e) { }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Array.prototype.call = function() {
+  var args = arguments;
+  this.each(function(f){ f.apply(this, args) });
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Effect = {
+  _elementDoesNotExistError: {
+    name: 'ElementDoesNotExistError',
+    message: 'The specified DOM element does not exist, but is required for this effect to operate'
+  },
+  tagifyText: function(element) {
+    if(typeof Builder == 'undefined')
+      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
+      
+    var tagifyStyle = 'position:relative';
+    if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
+    
+    element = $(element);
+    $A(element.childNodes).each( function(child) {
+      if(child.nodeType==3) {
+        child.nodeValue.toArray().each( function(character) {
+          element.insertBefore(
+            Builder.node('span',{style: tagifyStyle},
+              character == ' ' ? String.fromCharCode(160) : character), 
+              child);
+        });
+        Element.remove(child);
+      }
+    });
+  },
+  multiple: function(element, effect) {
+    var elements;
+    if(((typeof element == 'object') || 
+        (typeof element == 'function')) && 
+       (element.length))
+      elements = element;
+    else
+      elements = $(element).childNodes;
+      
+    var options = Object.extend({
+      speed: 0.1,
+      delay: 0.0
+    }, arguments[2] || {});
+    var masterDelay = options.delay;
+
+    $A(elements).each( function(element, index) {
+      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
+    });
+  },
+  PAIRS: {
+    'slide':  ['SlideDown','SlideUp'],
+    'blind':  ['BlindDown','BlindUp'],
+    'appear': ['Appear','Fade']
+  },
+  toggle: function(element, effect) {
+    element = $(element);
+    effect = (effect || 'appear').toLowerCase();
+    var options = Object.extend({
+      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
+    }, arguments[2] || {});
+    Effect[element.visible() ? 
+      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
+  }
+};
+
+var Effect2 = Effect; // deprecated
+
+/* ------------- transitions ------------- */
+
+Effect.Transitions = {
+  linear: Prototype.K,
+  sinoidal: function(pos) {
+    return (-Math.cos(pos*Math.PI)/2) + 0.5;
+  },
+  reverse: function(pos) {
+    return 1-pos;
+  },
+  flicker: function(pos) {
+    return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
+  },
+  wobble: function(pos) {
+    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
+  },
+  pulse: function(pos, pulses) { 
+    pulses = pulses || 5; 
+    return (
+      Math.round((pos % (1/pulses)) * pulses) == 0 ? 
+            ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
+        1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
+      );
+  },
+  none: function(pos) {
+    return 0;
+  },
+  full: function(pos) {
+    return 1;
+  }
+};
+
+/* ------------- core effects ------------- */
+
+Effect.ScopedQueue = Class.create();
+Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
+  initialize: function() {
+    this.effects  = [];
+    this.interval = null;
+  },
+  _each: function(iterator) {
+    this.effects._each(iterator);
+  },
+  add: function(effect) {
+    var timestamp = new Date().getTime();
+    
+    var position = (typeof effect.options.queue == 'string') ? 
+      effect.options.queue : effect.options.queue.position;
+    
+    switch(position) {
+      case 'front':
+        // move unstarted effects after this effect  
+        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
+            e.startOn  += effect.finishOn;
+            e.finishOn += effect.finishOn;
+          });
+        break;
+      case 'with-last':
+        timestamp = this.effects.pluck('startOn').max() || timestamp;
+        break;
+      case 'end':
+        // start effect after last queued effect has finished
+        timestamp = this.effects.pluck('finishOn').max() || timestamp;
+        break;
+    }
+    
+    effect.startOn  += timestamp;
+    effect.finishOn += timestamp;
+
+    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
+      this.effects.push(effect);
+    
+    if(!this.interval) 
+      this.interval = setInterval(this.loop.bind(this), 15);
+  },
+  remove: function(effect) {
+    this.effects = this.effects.reject(function(e) { return e==effect });
+    if(this.effects.length == 0) {
+      clearInterval(this.interval);
+      this.interval = null;
+    }
+  },
+  loop: function() {
+    var timePos = new Date().getTime();
+    for(var i=0, len=this.effects.length;i<len;i++) 
+      if(this.effects[i]) this.effects[i].loop(timePos);
+  }
+});
+
+Effect.Queues = {
+  instances: $H(),
+  get: function(queueName) {
+    if(typeof queueName != 'string') return queueName;
+    
+    if(!this.instances[queueName])
+      this.instances[queueName] = new Effect.ScopedQueue();
+      
+    return this.instances[queueName];
+  }
+}
+Effect.Queue = Effect.Queues.get('global');
+
+Effect.DefaultOptions = {
+  transition: Effect.Transitions.sinoidal,
+  duration:   1.0,   // seconds
+  fps:        60.0,  // max. 60fps due to Effect.Queue implementation
+  sync:       false, // true for combining
+  from:       0.0,
+  to:         1.0,
+  delay:      0.0,
+  queue:      'parallel'
+}
+
+Effect.Base = function() {};
+Effect.Base.prototype = {
+  position: null,
+  start: function(options) {
+    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
+    this.currentFrame = 0;
+    this.state        = 'idle';
+    this.startOn      = this.options.delay*1000;
+    this.finishOn     = this.startOn + (this.options.duration*1000);
+    this.event('beforeStart');
+    if(!this.options.sync)
+      Effect.Queues.get(typeof this.options.queue == 'string' ? 
+        'global' : this.options.queue.scope).add(this);
+  },
+  loop: function(timePos) {
+    if(timePos >= this.startOn) {
+      if(timePos >= this.finishOn) {
+        this.render(1.0);
+        this.cancel();
+        this.event('beforeFinish');
+        if(this.finish) this.finish(); 
+        this.event('afterFinish');
+        return;  
+      }
+      var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
+      var frame = Math.round(pos * this.options.fps * this.options.duration);
+      if(frame > this.currentFrame) {
+        this.render(pos);
+        this.currentFrame = frame;
+      }
+    }
+  },
+  render: function(pos) {
+    if(this.state == 'idle') {
+      this.state = 'running';
+      this.event('beforeSetup');
+      if(this.setup) this.setup();
+      this.event('afterSetup');
+    }
+    if(this.state == 'running') {
+      if(this.options.transition) pos = this.options.transition(pos);
+      pos *= (this.options.to-this.options.from);
+      pos += this.options.from;
+      this.position = pos;
+      this.event('beforeUpdate');
+      if(this.update) this.update(pos);
+      this.event('afterUpdate');
+    }
+  },
+  cancel: function() {
+    if(!this.options.sync)
+      Effect.Queues.get(typeof this.options.queue == 'string' ? 
+        'global' : this.options.queue.scope).remove(this);
+    this.state = 'finished';
+  },
+  event: function(eventName) {
+    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
+    if(this.options[eventName]) this.options[eventName](this);
+  },
+  inspect: function() {
+    var data = $H();
+    for(property in this)
+      if(typeof this[property] != 'function') data[property] = this[property];
+    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
+  }
+}
+
+Effect.Parallel = Class.create();
+Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
+  initialize: function(effects) {
+    this.effects = effects || [];
+    this.start(arguments[1]);
+  },
+  update: function(position) {
+    this.effects.invoke('render', position);
+  },
+  finish: function(position) {
+    this.effects.each( function(effect) {
+      effect.render(1.0);
+      effect.cancel();
+      effect.event('beforeFinish');
+      if(effect.finish) effect.finish(position);
+      effect.event('afterFinish');
+    });
+  }
+});
+
+Effect.Event = Class.create();
+Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
+  initialize: function() {
+    var options = Object.extend({
+      duration: 0
+    }, arguments[0] || {});
+    this.start(options);
+  },
+  update: Prototype.emptyFunction
+});
+
+Effect.Opacity = Class.create();
+Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    // make this work on IE on elements without 'layout'
+    if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
+      this.element.setStyle({zoom: 1});
+    var options = Object.extend({
+      from: this.element.getOpacity() || 0.0,
+      to:   1.0
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  update: function(position) {
+    this.element.setOpacity(position);
+  }
+});
+
+Effect.Move = Class.create();
+Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      x:    0,
+      y:    0,
+      mode: 'relative'
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function() {
+    // Bug in Opera: Opera returns the "real" position of a static element or
+    // relative element that does not have top/left explicitly set.
+    // ==> Always set top and left for position relative elements in your stylesheets 
+    // (to 0 if you do not need them) 
+    this.element.makePositioned();
+    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
+    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
+    if(this.options.mode == 'absolute') {
+      // absolute movement, so we need to calc deltaX and deltaY
+      this.options.x = this.options.x - this.originalLeft;
+      this.options.y = this.options.y - this.originalTop;
+    }
+  },
+  update: function(position) {
+    this.element.setStyle({
+      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
+      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'
+    });
+  }
+});
+
+// for backwards compatibility
+Effect.MoveBy = function(element, toTop, toLeft) {
+  return new Effect.Move(element, 
+    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
+};
+
+Effect.Scale = Class.create();
+Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
+  initialize: function(element, percent) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      scaleX: true,
+      scaleY: true,
+      scaleContent: true,
+      scaleFromCenter: false,
+      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
+      scaleFrom: 100.0,
+      scaleTo:   percent
+    }, arguments[2] || {});
+    this.start(options);
+  },
+  setup: function() {
+    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
+    this.elementPositioning = this.element.getStyle('position');
+    
+    this.originalStyle = {};
+    ['top','left','width','height','fontSize'].each( function(k) {
+      this.originalStyle[k] = this.element.style[k];
+    }.bind(this));
+      
+    this.originalTop  = this.element.offsetTop;
+    this.originalLeft = this.element.offsetLeft;
+    
+    var fontSize = this.element.getStyle('font-size') || '100%';
+    ['em','px','%','pt'].each( function(fontSizeType) {
+      if(fontSize.indexOf(fontSizeType)>0) {
+        this.fontSize     = parseFloat(fontSize);
+        this.fontSizeType = fontSizeType;
+      }
+    }.bind(this));
+    
+    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
+    
+    this.dims = null;
+    if(this.options.scaleMode=='box')
+      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
+    if(/^content/.test(this.options.scaleMode))
+      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
+    if(!this.dims)
+      this.dims = [this.options.scaleMode.originalHeight,
+                   this.options.scaleMode.originalWidth];
+  },
+  update: function(position) {
+    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
+    if(this.options.scaleContent && this.fontSize)
+      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
+    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
+  },
+  finish: function(position) {
+    if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
+  },
+  setDimensions: function(height, width) {
+    var d = {};
+    if(this.options.scaleX) d.width = Math.round(width) + 'px';
+    if(this.options.scaleY) d.height = Math.round(height) + 'px';
+    if(this.options.scaleFromCenter) {
+      var topd  = (height - this.dims[0])/2;
+      var leftd = (width  - this.dims[1])/2;
+      if(this.elementPositioning == 'absolute') {
+        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
+        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
+      } else {
+        if(this.options.scaleY) d.top = -topd + 'px';
+        if(this.options.scaleX) d.left = -leftd + 'px';
+      }
+    }
+    this.element.setStyle(d);
+  }
+});
+
+Effect.Highlight = Class.create();
+Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function() {
+    // Prevent executing on elements not in the layout flow
+    if(this.element.getStyle('display')=='none') { this.cancel(); return; }
+    // Disable background image during the effect
+    this.oldStyle = {};
+    if (!this.options.keepBackgroundImage) {
+      this.oldStyle.backgroundImage = this.element.getStyle('background-image');
+      this.element.setStyle({backgroundImage: 'none'});
+    }
+    if(!this.options.endcolor)
+      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
+    if(!this.options.restorecolor)
+      this.options.restorecolor = this.element.getStyle('background-color');
+    // init color calculations
+    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
+    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
+  },
+  update: function(position) {
+    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
+      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
+  },
+  finish: function() {
+    this.element.setStyle(Object.extend(this.oldStyle, {
+      backgroundColor: this.options.restorecolor
+    }));
+  }
+});
+
+Effect.ScrollTo = Class.create();
+Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    this.start(arguments[1] || {});
+  },
+  setup: function() {
+    Position.prepare();
+    var offsets = Position.cumulativeOffset(this.element);
+    if(this.options.offset) offsets[1] += this.options.offset;
+    var max = window.innerHeight ? 
+      window.height - window.innerHeight :
+      document.body.scrollHeight - 
+        (document.documentElement.clientHeight ? 
+          document.documentElement.clientHeight : document.body.clientHeight);
+    this.scrollStart = Position.deltaY;
+    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
+  },
+  update: function(position) {
+    Position.prepare();
+    window.scrollTo(Position.deltaX, 
+      this.scrollStart + (position*this.delta));
+  }
+});
+
+/* ------------- combination effects ------------- */
+
+Effect.Fade = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  var options = Object.extend({
+  from: element.getOpacity() || 1.0,
+  to:   0.0,
+  afterFinishInternal: function(effect) { 
+    if(effect.options.to!=0) return;
+    effect.element.hide().setStyle({opacity: oldOpacity}); 
+  }}, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Appear = function(element) {
+  element = $(element);
+  var options = Object.extend({
+  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
+  to:   1.0,
+  // force Safari to render floated elements properly
+  afterFinishInternal: function(effect) {
+    effect.element.forceRerendering();
+  },
+  beforeSetup: function(effect) {
+    effect.element.setOpacity(effect.options.from).show(); 
+  }}, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Puff = function(element) {
+  element = $(element);
+  var oldStyle = { 
+    opacity: element.getInlineOpacity(), 
+    position: element.getStyle('position'),
+    top:  element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height
+  };
+  return new Effect.Parallel(
+   [ new Effect.Scale(element, 200, 
+      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
+     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
+     Object.extend({ duration: 1.0, 
+      beforeSetupInternal: function(effect) {
+        Position.absolutize(effect.effects[0].element)
+      },
+      afterFinishInternal: function(effect) {
+         effect.effects[0].element.hide().setStyle(oldStyle); }
+     }, arguments[1] || {})
+   );
+}
+
+Effect.BlindUp = function(element) {
+  element = $(element);
+  element.makeClipping();
+  return new Effect.Scale(element, 0,
+    Object.extend({ scaleContent: false, 
+      scaleX: false, 
+      restoreAfterFinish: true,
+      afterFinishInternal: function(effect) {
+        effect.element.hide().undoClipping();
+      } 
+    }, arguments[1] || {})
+  );
+}
+
+Effect.BlindDown = function(element) {
+  element = $(element);
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({ 
+    scaleContent: false, 
+    scaleX: false,
+    scaleFrom: 0,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
+    },  
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping();
+    }
+  }, arguments[1] || {}));
+}
+
+Effect.SwitchOff = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  return new Effect.Appear(element, Object.extend({
+    duration: 0.4,
+    from: 0,
+    transition: Effect.Transitions.flicker,
+    afterFinishInternal: function(effect) {
+      new Effect.Scale(effect.element, 1, { 
+        duration: 0.3, scaleFromCenter: true,
+        scaleX: false, scaleContent: false, restoreAfterFinish: true,
+        beforeSetup: function(effect) { 
+          effect.element.makePositioned().makeClipping();
+        },
+        afterFinishInternal: function(effect) {
+          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
+        }
+      })
+    }
+  }, arguments[1] || {}));
+}
+
+Effect.DropOut = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left'),
+    opacity: element.getInlineOpacity() };
+  return new Effect.Parallel(
+    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
+      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
+    Object.extend(
+      { duration: 0.5,
+        beforeSetup: function(effect) {
+          effect.effects[0].element.makePositioned(); 
+        },
+        afterFinishInternal: function(effect) {
+          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
+        } 
+      }, arguments[1] || {}));
+}
+
+Effect.Shake = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left') };
+    return new Effect.Move(element, 
+      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+        effect.element.undoPositioned().setStyle(oldStyle);
+  }}) }}) }}) }}) }}) }});
+}
+
+Effect.SlideDown = function(element) {
+  element = $(element).cleanWhitespace();
+  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
+  var oldInnerBottom = element.down().getStyle('bottom');
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({ 
+    scaleContent: false, 
+    scaleX: false, 
+    scaleFrom: window.opera ? 0 : 1,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makePositioned();
+      effect.element.down().makePositioned();
+      if(window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
+    },
+    afterUpdateInternal: function(effect) {
+      effect.element.down().setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping().undoPositioned();
+      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
+    }, arguments[1] || {})
+  );
+}
+
+Effect.SlideUp = function(element) {
+  element = $(element).cleanWhitespace();
+  var oldInnerBottom = element.down().getStyle('bottom');
+  return new Effect.Scale(element, window.opera ? 0 : 1,
+   Object.extend({ scaleContent: false, 
+    scaleX: false, 
+    scaleMode: 'box',
+    scaleFrom: 100,
+    restoreAfterFinish: true,
+    beforeStartInternal: function(effect) {
+      effect.element.makePositioned();
+      effect.element.down().makePositioned();
+      if(window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping().show();
+    },  
+    afterUpdateInternal: function(effect) {
+      effect.element.down().setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' });
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
+      effect.element.down().undoPositioned();
+    }
+   }, arguments[1] || {})
+  );
+}
+
+// Bug in opera makes the TD containing this element expand for a instance after finish 
+Effect.Squish = function(element) {
+  return new Effect.Scale(element, window.opera ? 1 : 0, { 
+    restoreAfterFinish: true,
+    beforeSetup: function(effect) {
+      effect.element.makeClipping(); 
+    },  
+    afterFinishInternal: function(effect) {
+      effect.element.hide().undoClipping(); 
+    }
+  });
+}
+
+Effect.Grow = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.full
+  }, arguments[1] || {});
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();    
+  var initialMoveX, initialMoveY;
+  var moveX, moveY;
+  
+  switch (options.direction) {
+    case 'top-left':
+      initialMoveX = initialMoveY = moveX = moveY = 0; 
+      break;
+    case 'top-right':
+      initialMoveX = dims.width;
+      initialMoveY = moveY = 0;
+      moveX = -dims.width;
+      break;
+    case 'bottom-left':
+      initialMoveX = moveX = 0;
+      initialMoveY = dims.height;
+      moveY = -dims.height;
+      break;
+    case 'bottom-right':
+      initialMoveX = dims.width;
+      initialMoveY = dims.height;
+      moveX = -dims.width;
+      moveY = -dims.height;
+      break;
+    case 'center':
+      initialMoveX = dims.width / 2;
+      initialMoveY = dims.height / 2;
+      moveX = -dims.width / 2;
+      moveY = -dims.height / 2;
+      break;
+  }
+  
+  return new Effect.Move(element, {
+    x: initialMoveX,
+    y: initialMoveY,
+    duration: 0.01, 
+    beforeSetup: function(effect) {
+      effect.element.hide().makeClipping().makePositioned();
+    },
+    afterFinishInternal: function(effect) {
+      new Effect.Parallel(
+        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
+          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
+          new Effect.Scale(effect.element, 100, {
+            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
+            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
+        ], Object.extend({
+             beforeSetup: function(effect) {
+               effect.effects[0].element.setStyle({height: '0px'}).show(); 
+             },
+             afterFinishInternal: function(effect) {
+               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 
+             }
+           }, options)
+      )
+    }
+  });
+}
+
+Effect.Shrink = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.none
+  }, arguments[1] || {});
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();
+  var moveX, moveY;
+  
+  switch (options.direction) {
+    case 'top-left':
+      moveX = moveY = 0;
+      break;
+    case 'top-right':
+      moveX = dims.width;
+      moveY = 0;
+      break;
+    case 'bottom-left':
+      moveX = 0;
+      moveY = dims.height;
+      break;
+    case 'bottom-right':
+      moveX = dims.width;
+      moveY = dims.height;
+      break;
+    case 'center':  
+      moveX = dims.width / 2;
+      moveY = dims.height / 2;
+      break;
+  }
+  
+  return new Effect.Parallel(
+    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
+      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
+      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
+    ], Object.extend({            
+         beforeStartInternal: function(effect) {
+           effect.effects[0].element.makePositioned().makeClipping(); 
+         },
+         afterFinishInternal: function(effect) {
+           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
+       }, options)
+  );
+}
+
+Effect.Pulsate = function(element) {
+  element = $(element);
+  var options    = arguments[1] || {};
+  var oldOpacity = element.getInlineOpacity();
+  var transition = options.transition || Effect.Transitions.sinoidal;
+  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
+  reverser.bind(transition);
+  return new Effect.Opacity(element, 
+    Object.extend(Object.extend({  duration: 2.0, from: 0,
+      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
+    }, options), {transition: reverser}));
+}
+
+Effect.Fold = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height };
+  element.makeClipping();
+  return new Effect.Scale(element, 5, Object.extend({   
+    scaleContent: false,
+    scaleX: false,
+    afterFinishInternal: function(effect) {
+    new Effect.Scale(element, 1, { 
+      scaleContent: false, 
+      scaleY: false,
+      afterFinishInternal: function(effect) {
+        effect.element.hide().undoClipping().setStyle(oldStyle);
+      } });
+  }}, arguments[1] || {}));
+};
+
+Effect.Morph = Class.create();
+Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      style: {}
+    }, arguments[1] || {});
+    if (typeof options.style == 'string') {
+      if(options.style.indexOf(':') == -1) {
+        var cssText = '', selector = '.' + options.style;
+        $A(document.styleSheets).reverse().each(function(styleSheet) {
+          if (styleSheet.cssRules) cssRules = styleSheet.cssRules;
+          else if (styleSheet.rules) cssRules = styleSheet.rules;
+          $A(cssRules).reverse().each(function(rule) {
+            if (selector == rule.selectorText) {
+              cssText = rule.style.cssText;
+              throw $break;
+            }
+          });
+          if (cssText) throw $break;
+        });
+        this.style = cssText.parseStyle();
+        options.afterFinishInternal = function(effect){
+          effect.element.addClassName(effect.options.style);
+          effect.transforms.each(function(transform) {
+            if(transform.style != 'opacity')
+              effect.element.style[transform.style.camelize()] = '';
+          });
+        }
+      } else this.style = options.style.parseStyle();
+    } else this.style = $H(options.style)
+    this.start(options);
+  },
+  setup: function(){
+    function parseColor(color){
+      if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
+      color = color.parseColor();
+      return $R(0,2).map(function(i){
+        return parseInt( color.slice(i*2+1,i*2+3), 16 ) 
+      });
+    }
+    this.transforms = this.style.map(function(pair){
+      var property = pair[0].underscore().dasherize(), value = pair[1], unit = null;
+
+      if(value.parseColor('#zzzzzz') != '#zzzzzz') {
+        value = value.parseColor();
+        unit  = 'color';
+      } else if(property == 'opacity') {
+        value = parseFloat(value);
+        if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
+          this.element.setStyle({zoom: 1});
+      } else if(Element.CSS_LENGTH.test(value)) 
+        var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/),
+          value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null;
+
+      var originalValue = this.element.getStyle(property);
+      return $H({ 
+        style: property, 
+        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 
+        targetValue: unit=='color' ? parseColor(value) : value,
+        unit: unit
+      });
+    }.bind(this)).reject(function(transform){
+      return (
+        (transform.originalValue == transform.targetValue) ||
+        (
+          transform.unit != 'color' &&
+          (isNaN(transform.originalValue) || isNaN(transform.targetValue))
+        )
+      )
+    });
+  },
+  update: function(position) {
+    var style = $H(), value = null;
+    this.transforms.each(function(transform){
+      value = transform.unit=='color' ?
+        $R(0,2).inject('#',function(m,v,i){
+          return m+(Math.round(transform.originalValue[i]+
+            (transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) : 
+        transform.originalValue + Math.round(
+          ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
+      style[transform.style] = value;
+    });
+    this.element.setStyle(style);
+  }
+});
+
+Effect.Transform = Class.create();
+Object.extend(Effect.Transform.prototype, {
+  initialize: function(tracks){
+    this.tracks  = [];
+    this.options = arguments[1] || {};
+    this.addTracks(tracks);
+  },
+  addTracks: function(tracks){
+    tracks.each(function(track){
+      var data = $H(track).values().first();
+      this.tracks.push($H({
+        ids:     $H(track).keys().first(),
+        effect:  Effect.Morph,
+        options: { style: data }
+      }));
+    }.bind(this));
+    return this;
+  },
+  play: function(){
+    return new Effect.Parallel(
+      this.tracks.map(function(track){
+        var elements = [$(track.ids) || $$(track.ids)].flatten();
+        return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });
+      }).flatten(),
+      this.options
+    );
+  }
+});
+
+Element.CSS_PROPERTIES = $w(
+  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 
+  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
+  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
+  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
+  'fontSize fontWeight height left letterSpacing lineHeight ' +
+  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
+  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
+  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
+  'right textIndent top width wordSpacing zIndex');
+  
+Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
+
+String.prototype.parseStyle = function(){
+  var element = Element.extend(document.createElement('div'));
+  element.innerHTML = '<div style="' + this + '"></div>';
+  var style = element.down().style, styleRules = $H();
+  
+  Element.CSS_PROPERTIES.each(function(property){
+    if(style[property]) styleRules[property] = style[property]; 
+  });
+  if(/MSIE/.test(navigator.userAgent) && !window.opera && this.indexOf('opacity') > -1) {
+    styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1];
+  }
+  return styleRules;
+};
+
+Element.morph = function(element, style) {
+  new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
+  return element;
+};
+
+['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
+ 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( 
+  function(f) { Element.Methods[f] = Element[f]; }
+);
+
+Element.Methods.visualEffect = function(element, effect, options) {
+  s = effect.gsub(/_/, '-').camelize();
+  effect_class = s.charAt(0).toUpperCase() + s.substring(1);
+  new Effect[effect_class](element, options);
+  return $(element);
+};
+
+Element.addMethods();
Index: /ether_2012/web/resources/js/autocomplete/javascript/prototype.js
===================================================================
--- /ether_2012/web/resources/js/autocomplete/javascript/prototype.js	(revision 319)
+++ /ether_2012/web/resources/js/autocomplete/javascript/prototype.js	(revision 319)
@@ -0,0 +1,2515 @@
+/*  Prototype JavaScript framework, version 1.5.0
+ *  (c) 2005-2007 Sam Stephenson
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *  For details, see the Prototype web site: http://prototype.conio.net/
+ *
+/*--------------------------------------------------------------------------*/
+
+var Prototype = {
+  Version: '1.5.0',
+  BrowserFeatures: {
+    XPath: !!document.evaluate
+  },
+
+  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
+  emptyFunction: function() {},
+  K: function(x) { return x }
+}
+
+var Class = {
+  create: function() {
+    return function() {
+      this.initialize.apply(this, arguments);
+    }
+  }
+}
+
+var Abstract = new Object();
+
+Object.extend = function(destination, source) {
+  for (var property in source) {
+    destination[property] = source[property];
+  }
+  return destination;
+}
+
+Object.extend(Object, {
+  inspect: function(object) {
+    try {
+      if (object === undefined) return 'undefined';
+      if (object === null) return 'null';
+      return object.inspect ? object.inspect() : object.toString();
+    } catch (e) {
+      if (e instanceof RangeError) return '...';
+      throw e;
+    }
+  },
+
+  keys: function(object) {
+    var keys = [];
+    for (var property in object)
+      keys.push(property);
+    return keys;
+  },
+
+  values: function(object) {
+    var values = [];
+    for (var property in object)
+      values.push(object[property]);
+    return values;
+  },
+
+  clone: function(object) {
+    return Object.extend({}, object);
+  }
+});
+
+Function.prototype.bind = function() {
+  var __method = this, args = $A(arguments), object = args.shift();
+  return function() {
+    return __method.apply(object, args.concat($A(arguments)));
+  }
+}
+
+Function.prototype.bindAsEventListener = function(object) {
+  var __method = this, args = $A(arguments), object = args.shift();
+  return function(event) {
+    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
+  }
+}
+
+Object.extend(Number.prototype, {
+  toColorPart: function() {
+    var digits = this.toString(16);
+    if (this < 16) return '0' + digits;
+    return digits;
+  },
+
+  succ: function() {
+    return this + 1;
+  },
+
+  times: function(iterator) {
+    $R(0, this, true).each(iterator);
+    return this;
+  }
+});
+
+var Try = {
+  these: function() {
+    var returnValue;
+
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      var lambda = arguments[i];
+      try {
+        returnValue = lambda();
+        break;
+      } catch (e) {}
+    }
+
+    return returnValue;
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var PeriodicalExecuter = Class.create();
+PeriodicalExecuter.prototype = {
+  initialize: function(callback, frequency) {
+    this.callback = callback;
+    this.frequency = frequency;
+    this.currentlyExecuting = false;
+
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  stop: function() {
+    if (!this.timer) return;
+    clearInterval(this.timer);
+    this.timer = null;
+  },
+
+  onTimerEvent: function() {
+    if (!this.currentlyExecuting) {
+      try {
+        this.currentlyExecuting = true;
+        this.callback(this);
+      } finally {
+        this.currentlyExecuting = false;
+      }
+    }
+  }
+}
+String.interpret = function(value){
+  return value == null ? '' : String(value);
+}
+
+Object.extend(String.prototype, {
+  gsub: function(pattern, replacement) {
+    var result = '', source = this, match;
+    replacement = arguments.callee.prepareReplacement(replacement);
+
+    while (source.length > 0) {
+      if (match = source.match(pattern)) {
+        result += source.slice(0, match.index);
+        result += String.interpret(replacement(match));
+        source  = source.slice(match.index + match[0].length);
+      } else {
+        result += source, source = '';
+      }
+    }
+    return result;
+  },
+
+  sub: function(pattern, replacement, count) {
+    replacement = this.gsub.prepareReplacement(replacement);
+    count = count === undefined ? 1 : count;
+
+    return this.gsub(pattern, function(match) {
+      if (--count < 0) return match[0];
+      return replacement(match);
+    });
+  },
+
+  scan: function(pattern, iterator) {
+    this.gsub(pattern, iterator);
+    return this;
+  },
+
+  truncate: function(length, truncation) {
+    length = length || 30;
+    truncation = truncation === undefined ? '...' : truncation;
+    return this.length > length ?
+      this.slice(0, length - truncation.length) + truncation : this;
+  },
+
+  strip: function() {
+    return this.replace(/^\s+/, '').replace(/\s+$/, '');
+  },
+
+  stripTags: function() {
+    return this.replace(/<\/?[^>]+>/gi, '');
+  },
+
+  stripScripts: function() {
+    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
+  },
+
+  extractScripts: function() {
+    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
+    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
+    return (this.match(matchAll) || []).map(function(scriptTag) {
+      return (scriptTag.match(matchOne) || ['', ''])[1];
+    });
+  },
+
+  evalScripts: function() {
+    return this.extractScripts().map(function(script) { return eval(script) });
+  },
+
+  escapeHTML: function() {
+    var div = document.createElement('div');
+    var text = document.createTextNode(this);
+    div.appendChild(text);
+    return div.innerHTML;
+  },
+
+  unescapeHTML: function() {
+    var div = document.createElement('div');
+    div.innerHTML = this.stripTags();
+    return div.childNodes[0] ? (div.childNodes.length > 1 ?
+      $A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) :
+      div.childNodes[0].nodeValue) : '';
+  },
+
+  toQueryParams: function(separator) {
+    var match = this.strip().match(/([^?#]*)(#.*)?$/);
+    if (!match) return {};
+
+    return match[1].split(separator || '&').inject({}, function(hash, pair) {
+      if ((pair = pair.split('='))[0]) {
+        var name = decodeURIComponent(pair[0]);
+        var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;
+
+        if (hash[name] !== undefined) {
+          if (hash[name].constructor != Array)
+            hash[name] = [hash[name]];
+          if (value) hash[name].push(value);
+        }
+        else hash[name] = value;
+      }
+      return hash;
+    });
+  },
+
+  toArray: function() {
+    return this.split('');
+  },
+
+  succ: function() {
+    return this.slice(0, this.length - 1) +
+      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
+  },
+
+  camelize: function() {
+    var parts = this.split('-'), len = parts.length;
+    if (len == 1) return parts[0];
+
+    var camelized = this.charAt(0) == '-'
+      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
+      : parts[0];
+
+    for (var i = 1; i < len; i++)
+      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
+
+    return camelized;
+  },
+
+  capitalize: function(){
+    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
+  },
+
+  underscore: function() {
+    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
+  },
+
+  dasherize: function() {
+    return this.gsub(/_/,'-');
+  },
+
+  inspect: function(useDoubleQuotes) {
+    var escapedString = this.replace(/\\/g, '\\\\');
+    if (useDoubleQuotes)
+      return '"' + escapedString.replace(/"/g, '\\"') + '"';
+    else
+      return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+  }
+});
+
+String.prototype.gsub.prepareReplacement = function(replacement) {
+  if (typeof replacement == 'function') return replacement;
+  var template = new Template(replacement);
+  return function(match) { return template.evaluate(match) };
+}
+
+String.prototype.parseQuery = String.prototype.toQueryParams;
+
+var Template = Class.create();
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+Template.prototype = {
+  initialize: function(template, pattern) {
+    this.template = template.toString();
+    this.pattern  = pattern || Template.Pattern;
+  },
+
+  evaluate: function(object) {
+    return this.template.gsub(this.pattern, function(match) {
+      var before = match[1];
+      if (before == '\\') return match[2];
+      return before + String.interpret(object[match[3]]);
+    });
+  }
+}
+
+var $break    = new Object();
+var $continue = new Object();
+
+var Enumerable = {
+  each: function(iterator) {
+    var index = 0;
+    try {
+      this._each(function(value) {
+        try {
+          iterator(value, index++);
+        } catch (e) {
+          if (e != $continue) throw e;
+        }
+      });
+    } catch (e) {
+      if (e != $break) throw e;
+    }
+    return this;
+  },
+
+  eachSlice: function(number, iterator) {
+    var index = -number, slices = [], array = this.toArray();
+    while ((index += number) < array.length)
+      slices.push(array.slice(index, index+number));
+    return slices.map(iterator);
+  },
+
+  all: function(iterator) {
+    var result = true;
+    this.each(function(value, index) {
+      result = result && !!(iterator || Prototype.K)(value, index);
+      if (!result) throw $break;
+    });
+    return result;
+  },
+
+  any: function(iterator) {
+    var result = false;
+    this.each(function(value, index) {
+      if (result = !!(iterator || Prototype.K)(value, index))
+        throw $break;
+    });
+    return result;
+  },
+
+  collect: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push((iterator || Prototype.K)(value, index));
+    });
+    return results;
+  },
+
+  detect: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      if (iterator(value, index)) {
+        result = value;
+        throw $break;
+      }
+    });
+    return result;
+  },
+
+  findAll: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  grep: function(pattern, iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      var stringValue = value.toString();
+      if (stringValue.match(pattern))
+        results.push((iterator || Prototype.K)(value, index));
+    })
+    return results;
+  },
+
+  include: function(object) {
+    var found = false;
+    this.each(function(value) {
+      if (value == object) {
+        found = true;
+        throw $break;
+      }
+    });
+    return found;
+  },
+
+  inGroupsOf: function(number, fillWith) {
+    fillWith = fillWith === undefined ? null : fillWith;
+    return this.eachSlice(number, function(slice) {
+      while(slice.length < number) slice.push(fillWith);
+      return slice;
+    });
+  },
+
+  inject: function(memo, iterator) {
+    this.each(function(value, index) {
+      memo = iterator(memo, value, index);
+    });
+    return memo;
+  },
+
+  invoke: function(method) {
+    var args = $A(arguments).slice(1);
+    return this.map(function(value) {
+      return value[method].apply(value, args);
+    });
+  },
+
+  max: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (result == undefined || value >= result)
+        result = value;
+    });
+    return result;
+  },
+
+  min: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (result == undefined || value < result)
+        result = value;
+    });
+    return result;
+  },
+
+  partition: function(iterator) {
+    var trues = [], falses = [];
+    this.each(function(value, index) {
+      ((iterator || Prototype.K)(value, index) ?
+        trues : falses).push(value);
+    });
+    return [trues, falses];
+  },
+
+  pluck: function(property) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push(value[property]);
+    });
+    return results;
+  },
+
+  reject: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (!iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  sortBy: function(iterator) {
+    return this.map(function(value, index) {
+      return {value: value, criteria: iterator(value, index)};
+    }).sort(function(left, right) {
+      var a = left.criteria, b = right.criteria;
+      return a < b ? -1 : a > b ? 1 : 0;
+    }).pluck('value');
+  },
+
+  toArray: function() {
+    return this.map();
+  },
+
+  zip: function() {
+    var iterator = Prototype.K, args = $A(arguments);
+    if (typeof args.last() == 'function')
+      iterator = args.pop();
+
+    var collections = [this].concat(args).map($A);
+    return this.map(function(value, index) {
+      return iterator(collections.pluck(index));
+    });
+  },
+
+  size: function() {
+    return this.toArray().length;
+  },
+
+  inspect: function() {
+    return '#<Enumerable:' + this.toArray().inspect() + '>';
+  }
+}
+
+Object.extend(Enumerable, {
+  map:     Enumerable.collect,
+  find:    Enumerable.detect,
+  select:  Enumerable.findAll,
+  member:  Enumerable.include,
+  entries: Enumerable.toArray
+});
+var $A = Array.from = function(iterable) {
+  if (!iterable) return [];
+  if (iterable.toArray) {
+    return iterable.toArray();
+  } else {
+    var results = [];
+    for (var i = 0, length = iterable.length; i < length; i++)
+      results.push(iterable[i]);
+    return results;
+  }
+}
+
+Object.extend(Array.prototype, Enumerable);
+
+if (!Array.prototype._reverse)
+  Array.prototype._reverse = Array.prototype.reverse;
+
+Object.extend(Array.prototype, {
+  _each: function(iterator) {
+    for (var i = 0, length = this.length; i < length; i++)
+      iterator(this[i]);
+  },
+
+  clear: function() {
+    this.length = 0;
+    return this;
+  },
+
+  first: function() {
+    return this[0];
+  },
+
+  last: function() {
+    return this[this.length - 1];
+  },
+
+  compact: function() {
+    return this.select(function(value) {
+      return value != null;
+    });
+  },
+
+  flatten: function() {
+    return this.inject([], function(array, value) {
+      return array.concat(value && value.constructor == Array ?
+        value.flatten() : [value]);
+    });
+  },
+
+  without: function() {
+    var values = $A(arguments);
+    return this.select(function(value) {
+      return !values.include(value);
+    });
+  },
+
+  indexOf: function(object) {
+    for (var i = 0, length = this.length; i < length; i++)
+      if (this[i] == object) return i;
+    return -1;
+  },
+
+  reverse: function(inline) {
+    return (inline !== false ? this : this.toArray())._reverse();
+  },
+
+  reduce: function() {
+    return this.length > 1 ? this : this[0];
+  },
+
+  uniq: function() {
+    return this.inject([], function(array, value) {
+      return array.include(value) ? array : array.concat([value]);
+    });
+  },
+
+  clone: function() {
+    return [].concat(this);
+  },
+
+  size: function() {
+    return this.length;
+  },
+
+  inspect: function() {
+    return '[' + this.map(Object.inspect).join(', ') + ']';
+  }
+});
+
+Array.prototype.toArray = Array.prototype.clone;
+
+function $w(string){
+  string = string.strip();
+  return string ? string.split(/\s+/) : [];
+}
+
+if(window.opera){
+  Array.prototype.concat = function(){
+    var array = [];
+    for(var i = 0, length = this.length; i < length; i++) array.push(this[i]);
+    for(var i = 0, length = arguments.length; i < length; i++) {
+      if(arguments[i].constructor == Array) {
+        for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
+          array.push(arguments[i][j]);
+      } else {
+        array.push(arguments[i]);
+      }
+    }
+    return array;
+  }
+}
+var Hash = function(obj) {
+  Object.extend(this, obj || {});
+};
+
+Object.extend(Hash, {
+  toQueryString: function(obj) {
+    var parts = [];
+
+	  this.prototype._each.call(obj, function(pair) {
+      if (!pair.key) return;
+
+      if (pair.value && pair.value.constructor == Array) {
+        var values = pair.value.compact();
+        if (values.length < 2) pair.value = values.reduce();
+        else {
+        	key = encodeURIComponent(pair.key);
+          values.each(function(value) {
+            value = value != undefined ? encodeURIComponent(value) : '';
+            parts.push(key + '=' + encodeURIComponent(value));
+          });
+          return;
+        }
+      }
+      if (pair.value == undefined) pair[1] = '';
+      parts.push(pair.map(encodeURIComponent).join('='));
+	  });
+
+    return parts.join('&');
+  }
+});
+
+Object.extend(Hash.prototype, Enumerable);
+Object.extend(Hash.prototype, {
+  _each: function(iterator) {
+    for (var key in this) {
+      var value = this[key];
+      if (value && value == Hash.prototype[key]) continue;
+
+      var pair = [key, value];
+      pair.key = key;
+      pair.value = value;
+      iterator(pair);
+    }
+  },
+
+  keys: function() {
+    return this.pluck('key');
+  },
+
+  values: function() {
+    return this.pluck('value');
+  },
+
+  merge: function(hash) {
+    return $H(hash).inject(this, function(mergedHash, pair) {
+      mergedHash[pair.key] = pair.value;
+      return mergedHash;
+    });
+  },
+
+  remove: function() {
+    var result;
+    for(var i = 0, length = arguments.length; i < length; i++) {
+      var value = this[arguments[i]];
+      if (value !== undefined){
+        if (result === undefined) result = value;
+        else {
+          if (result.constructor != Array) result = [result];
+          result.push(value)
+        }
+      }
+      delete this[arguments[i]];
+    }
+    return result;
+  },
+
+  toQueryString: function() {
+    return Hash.toQueryString(this);
+  },
+
+  inspect: function() {
+    return '#<Hash:{' + this.map(function(pair) {
+      return pair.map(Object.inspect).join(': ');
+    }).join(', ') + '}>';
+  }
+});
+
+function $H(object) {
+  if (object && object.constructor == Hash) return object;
+  return new Hash(object);
+};
+ObjectRange = Class.create();
+Object.extend(ObjectRange.prototype, Enumerable);
+Object.extend(ObjectRange.prototype, {
+  initialize: function(start, end, exclusive) {
+    this.start = start;
+    this.end = end;
+    this.exclusive = exclusive;
+  },
+
+  _each: function(iterator) {
+    var value = this.start;
+    while (this.include(value)) {
+      iterator(value);
+      value = value.succ();
+    }
+  },
+
+  include: function(value) {
+    if (value < this.start)
+      return false;
+    if (this.exclusive)
+      return value < this.end;
+    return value <= this.end;
+  }
+});
+
+var $R = function(start, end, exclusive) {
+  return new ObjectRange(start, end, exclusive);
+}
+
+var Ajax = {
+  getTransport: function() {
+    return Try.these(
+      function() {return new XMLHttpRequest()},
+      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
+    ) || false;
+  },
+
+  activeRequestCount: 0
+}
+
+Ajax.Responders = {
+  responders: [],
+
+  _each: function(iterator) {
+    this.responders._each(iterator);
+  },
+
+  register: function(responder) {
+    if (!this.include(responder))
+      this.responders.push(responder);
+  },
+
+  unregister: function(responder) {
+    this.responders = this.responders.without(responder);
+  },
+
+  dispatch: function(callback, request, transport, json) {
+    this.each(function(responder) {
+      if (typeof responder[callback] == 'function') {
+        try {
+          responder[callback].apply(responder, [request, transport, json]);
+        } catch (e) {}
+      }
+    });
+  }
+};
+
+Object.extend(Ajax.Responders, Enumerable);
+
+Ajax.Responders.register({
+  onCreate: function() {
+    Ajax.activeRequestCount++;
+  },
+  onComplete: function() {
+    Ajax.activeRequestCount--;
+  }
+});
+
+Ajax.Base = function() {};
+Ajax.Base.prototype = {
+  setOptions: function(options) {
+    this.options = {
+      method:       'post',
+      asynchronous: true,
+      contentType:  'application/x-www-form-urlencoded',
+      encoding:     'UTF-8',
+      parameters:   ''
+    }
+    Object.extend(this.options, options || {});
+
+    this.options.method = this.options.method.toLowerCase();
+    if (typeof this.options.parameters == 'string')
+      this.options.parameters = this.options.parameters.toQueryParams();
+  }
+}
+
+Ajax.Request = Class.create();
+Ajax.Request.Events =
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
+  _complete: false,
+
+  initialize: function(url, options) {
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+    this.request(url);
+  },
+
+  request: function(url) {
+    this.url = url;
+    this.method = this.options.method;
+    var params = this.options.parameters;
+
+    if (!['get', 'post'].include(this.method)) {
+      // simulate other verbs over post
+      params['_method'] = this.method;
+      this.method = 'post';
+    }
+
+    params = Hash.toQueryString(params);
+    if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='
+
+    // when GET, append parameters to URL
+    if (this.method == 'get' && params)
+      this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params;
+
+    try {
+      Ajax.Responders.dispatch('onCreate', this, this.transport);
+
+      this.transport.open(this.method.toUpperCase(), this.url,
+        this.options.asynchronous);
+
+      if (this.options.asynchronous)
+        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
+
+      this.transport.onreadystatechange = this.onStateChange.bind(this);
+      this.setRequestHeaders();
+
+      var body = this.method == 'post' ? (this.options.postBody || params) : null;
+
+      this.transport.send(body);
+
+      /* Force Firefox to handle ready state 4 for synchronous requests */
+      if (!this.options.asynchronous && this.transport.overrideMimeType)
+        this.onStateChange();
+
+    }
+    catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  onStateChange: function() {
+    var readyState = this.transport.readyState;
+    if (readyState > 1 && !((readyState == 4) && this._complete))
+      this.respondToReadyState(this.transport.readyState);
+  },
+
+  setRequestHeaders: function() {
+    var headers = {
+      'X-Requested-With': 'XMLHttpRequest',
+      'X-Prototype-Version': Prototype.Version,
+      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
+    };
+
+    if (this.method == 'post') {
+      headers['Content-type'] = this.options.contentType +
+        (this.options.encoding ? '; charset=' + this.options.encoding : '');
+
+      /* Force "Connection: close" for older Mozilla browsers to work
+       * around a bug where XMLHttpRequest sends an incorrect
+       * Content-length header. See Mozilla Bugzilla #246651.
+       */
+      if (this.transport.overrideMimeType &&
+          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
+            headers['Connection'] = 'close';
+    }
+
+    // user-defined headers
+    if (typeof this.options.requestHeaders == 'object') {
+      var extras = this.options.requestHeaders;
+
+      if (typeof extras.push == 'function')
+        for (var i = 0, length = extras.length; i < length; i += 2)
+          headers[extras[i]] = extras[i+1];
+      else
+        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
+    }
+
+    for (var name in headers)
+      this.transport.setRequestHeader(name, headers[name]);
+  },
+
+  success: function() {
+    return !this.transport.status
+        || (this.transport.status >= 200 && this.transport.status < 300);
+  },
+
+  respondToReadyState: function(readyState) {
+    var state = Ajax.Request.Events[readyState];
+    var transport = this.transport, json = this.evalJSON();
+
+    if (state == 'Complete') {
+      try {
+        this._complete = true;
+        (this.options['on' + this.transport.status]
+         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
+         || Prototype.emptyFunction)(transport, json);
+      } catch (e) {
+        this.dispatchException(e);
+      }
+
+      if ((this.getHeader('Content-type') || 'text/javascript').strip().
+        match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
+          this.evalResponse();
+    }
+
+    try {
+      (this.options['on' + state] || Prototype.emptyFunction)(transport, json);
+      Ajax.Responders.dispatch('on' + state, this, transport, json);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+
+    if (state == 'Complete') {
+      // avoid memory leak in MSIE: clean up
+      this.transport.onreadystatechange = Prototype.emptyFunction;
+    }
+  },
+
+  getHeader: function(name) {
+    try {
+      return this.transport.getResponseHeader(name);
+    } catch (e) { return null }
+  },
+
+  evalJSON: function() {
+    try {
+      var json = this.getHeader('X-JSON');
+      return json ? eval('(' + json + ')') : null;
+    } catch (e) { return null }
+  },
+
+  evalResponse: function() {
+    try {
+      return eval(this.transport.responseText);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  dispatchException: function(exception) {
+    (this.options.onException || Prototype.emptyFunction)(this, exception);
+    Ajax.Responders.dispatch('onException', this, exception);
+  }
+});
+
+Ajax.Updater = Class.create();
+
+Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
+  initialize: function(container, url, options) {
+    this.container = {
+      success: (container.success || container),
+      failure: (container.failure || (container.success ? null : container))
+    }
+
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+
+    var onComplete = this.options.onComplete || Prototype.emptyFunction;
+    this.options.onComplete = (function(transport, param) {
+      this.updateContent();
+      onComplete(transport, param);
+    }).bind(this);
+
+    this.request(url);
+  },
+
+  updateContent: function() {
+    var receiver = this.container[this.success() ? 'success' : 'failure'];
+    var response = this.transport.responseText;
+
+    if (!this.options.evalScripts) response = response.stripScripts();
+
+    if (receiver = $(receiver)) {
+      if (this.options.insertion)
+        new this.options.insertion(receiver, response);
+      else
+        receiver.update(response);
+    }
+
+    if (this.success()) {
+      if (this.onComplete)
+        setTimeout(this.onComplete.bind(this), 10);
+    }
+  }
+});
+
+Ajax.PeriodicalUpdater = Class.create();
+Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
+  initialize: function(container, url, options) {
+    this.setOptions(options);
+    this.onComplete = this.options.onComplete;
+
+    this.frequency = (this.options.frequency || 2);
+    this.decay = (this.options.decay || 1);
+
+    this.updater = {};
+    this.container = container;
+    this.url = url;
+
+    this.start();
+  },
+
+  start: function() {
+    this.options.onComplete = this.updateComplete.bind(this);
+    this.onTimerEvent();
+  },
+
+  stop: function() {
+    this.updater.options.onComplete = undefined;
+    clearTimeout(this.timer);
+    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
+  },
+
+  updateComplete: function(request) {
+    if (this.options.decay) {
+      this.decay = (request.responseText == this.lastText ?
+        this.decay * this.options.decay : 1);
+
+      this.lastText = request.responseText;
+    }
+    this.timer = setTimeout(this.onTimerEvent.bind(this),
+      this.decay * this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    this.updater = new Ajax.Updater(this.container, this.url, this.options);
+  }
+});
+function $(element) {
+  if (arguments.length > 1) {
+    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
+      elements.push($(arguments[i]));
+    return elements;
+  }
+  if (typeof element == 'string')
+    element = document.getElementById(element);
+  return Element.extend(element);
+}
+
+if (Prototype.BrowserFeatures.XPath) {
+  document._getElementsByXPath = function(expression, parentElement) {
+    var results = [];
+    var query = document.evaluate(expression, $(parentElement) || document,
+      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    for (var i = 0, length = query.snapshotLength; i < length; i++)
+      results.push(query.snapshotItem(i));
+    return results;
+  };
+}
+
+document.getElementsByClassName = function(className, parentElement) {
+  if (Prototype.BrowserFeatures.XPath) {
+    var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
+    return document._getElementsByXPath(q, parentElement);
+  } else {
+    var children = ($(parentElement) || document.body).getElementsByTagName('*');
+    var elements = [], child;
+    for (var i = 0, length = children.length; i < length; i++) {
+      child = children[i];
+      if (Element.hasClassName(child, className))
+        elements.push(Element.extend(child));
+    }
+    return elements;
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+if (!window.Element)
+  var Element = new Object();
+
+Element.extend = function(element) {
+  if (!element || _nativeExtensions || element.nodeType == 3) return element;
+
+  if (!element._extended && element.tagName && element != window) {
+    var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
+
+    if (element.tagName == 'FORM')
+      Object.extend(methods, Form.Methods);
+    if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
+      Object.extend(methods, Form.Element.Methods);
+
+    Object.extend(methods, Element.Methods.Simulated);
+
+    for (var property in methods) {
+      var value = methods[property];
+      if (typeof value == 'function' && !(property in element))
+        element[property] = cache.findOrStore(value);
+    }
+  }
+
+  element._extended = true;
+  return element;
+};
+
+Element.extend.cache = {
+  findOrStore: function(value) {
+    return this[value] = this[value] || function() {
+      return value.apply(null, [this].concat($A(arguments)));
+    }
+  }
+};
+
+Element.Methods = {
+  visible: function(element) {
+    return $(element).style.display != 'none';
+  },
+
+  toggle: function(element) {
+    element = $(element);
+    Element[Element.visible(element) ? 'hide' : 'show'](element);
+    return element;
+  },
+
+  hide: function(element) {
+    $(element).style.display = 'none';
+    return element;
+  },
+
+  show: function(element) {
+    $(element).style.display = '';
+    return element;
+  },
+
+  remove: function(element) {
+    element = $(element);
+    element.parentNode.removeChild(element);
+    return element;
+  },
+
+  update: function(element, html) {
+    html = typeof html == 'undefined' ? '' : html.toString();
+    $(element).innerHTML = html.stripScripts();
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  },
+
+  replace: function(element, html) {
+    element = $(element);
+    html = typeof html == 'undefined' ? '' : html.toString();
+    if (element.outerHTML) {
+      element.outerHTML = html.stripScripts();
+    } else {
+      var range = element.ownerDocument.createRange();
+      range.selectNodeContents(element);
+      element.parentNode.replaceChild(
+        range.createContextualFragment(html.stripScripts()), element);
+    }
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  },
+
+  inspect: function(element) {
+    element = $(element);
+    var result = '<' + element.tagName.toLowerCase();
+    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
+      var property = pair.first(), attribute = pair.last();
+      var value = (element[property] || '').toString();
+      if (value) result += ' ' + attribute + '=' + value.inspect(true);
+    });
+    return result + '>';
+  },
+
+  recursivelyCollect: function(element, property) {
+    element = $(element);
+    var elements = [];
+    while (element = element[property])
+      if (element.nodeType == 1)
+        elements.push(Element.extend(element));
+    return elements;
+  },
+
+  ancestors: function(element) {
+    return $(element).recursivelyCollect('parentNode');
+  },
+
+  descendants: function(element) {
+    return $A($(element).getElementsByTagName('*'));
+  },
+
+  immediateDescendants: function(element) {
+    if (!(element = $(element).firstChild)) return [];
+    while (element && element.nodeType != 1) element = element.nextSibling;
+    if (element) return [element].concat($(element).nextSiblings());
+    return [];
+  },
+
+  previousSiblings: function(element) {
+    return $(element).recursivelyCollect('previousSibling');
+  },
+
+  nextSiblings: function(element) {
+    return $(element).recursivelyCollect('nextSibling');
+  },
+
+  siblings: function(element) {
+    element = $(element);
+    return element.previousSiblings().reverse().concat(element.nextSiblings());
+  },
+
+  match: function(element, selector) {
+    if (typeof selector == 'string')
+      selector = new Selector(selector);
+    return selector.match($(element));
+  },
+
+  up: function(element, expression, index) {
+    return Selector.findElement($(element).ancestors(), expression, index);
+  },
+
+  down: function(element, expression, index) {
+    return Selector.findElement($(element).descendants(), expression, index);
+  },
+
+  previous: function(element, expression, index) {
+    return Selector.findElement($(element).previousSiblings(), expression, index);
+  },
+
+  next: function(element, expression, index) {
+    return Selector.findElement($(element).nextSiblings(), expression, index);
+  },
+
+  getElementsBySelector: function() {
+    var args = $A(arguments), element = $(args.shift());
+    return Selector.findChildElements(element, args);
+  },
+
+  getElementsByClassName: function(element, className) {
+    return document.getElementsByClassName(className, element);
+  },
+
+  readAttribute: function(element, name) {
+    element = $(element);
+    if (document.all && !window.opera) {
+      var t = Element._attributeTranslations;
+      if (t.values[name]) return t.values[name](element, name);
+      if (t.names[name])  name = t.names[name];
+      var attribute = element.attributes[name];
+      if(attribute) return attribute.nodeValue;
+    }
+    return element.getAttribute(name);
+  },
+
+  getHeight: function(element) {
+    return $(element).getDimensions().height;
+  },
+
+  getWidth: function(element) {
+    return $(element).getDimensions().width;
+  },
+
+  classNames: function(element) {
+    return new Element.ClassNames(element);
+  },
+
+  hasClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    var elementClassName = element.className;
+    if (elementClassName.length == 0) return false;
+    if (elementClassName == className ||
+        elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
+      return true;
+    return false;
+  },
+
+  addClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element).add(className);
+    return element;
+  },
+
+  removeClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element).remove(className);
+    return element;
+  },
+
+  toggleClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
+    return element;
+  },
+
+  observe: function() {
+    Event.observe.apply(Event, arguments);
+    return $A(arguments).first();
+  },
+
+  stopObserving: function() {
+    Event.stopObserving.apply(Event, arguments);
+    return $A(arguments).first();
+  },
+
+  // removes whitespace-only text node children
+  cleanWhitespace: function(element) {
+    element = $(element);
+    var node = element.firstChild;
+    while (node) {
+      var nextNode = node.nextSibling;
+      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+        element.removeChild(node);
+      node = nextNode;
+    }
+    return element;
+  },
+
+  empty: function(element) {
+    return $(element).innerHTML.match(/^\s*$/);
+  },
+
+  descendantOf: function(element, ancestor) {
+    element = $(element), ancestor = $(ancestor);
+    while (element = element.parentNode)
+      if (element == ancestor) return true;
+    return false;
+  },
+
+  scrollTo: function(element) {
+    element = $(element);
+    var pos = Position.cumulativeOffset(element);
+    window.scrollTo(pos[0], pos[1]);
+    return element;
+  },
+
+  getStyle: function(element, style) {
+    element = $(element);
+    if (['float','cssFloat'].include(style))
+      style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
+    style = style.camelize();
+    var value = element.style[style];
+    if (!value) {
+      if (document.defaultView && document.defaultView.getComputedStyle) {
+        var css = document.defaultView.getComputedStyle(element, null);
+        value = css ? css[style] : null;
+      } else if (element.currentStyle) {
+        value = element.currentStyle[style];
+      }
+    }
+
+    if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))
+      value = element['offset'+style.capitalize()] + 'px';
+
+    if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
+      if (Element.getStyle(element, 'position') == 'static') value = 'auto';
+    if(style == 'opacity') {
+      if(value) return parseFloat(value);
+      if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
+        if(value[1]) return parseFloat(value[1]) / 100;
+      return 1.0;
+    }
+    return value == 'auto' ? null : value;
+  },
+
+  setStyle: function(element, style) {
+    element = $(element);
+    for (var name in style) {
+      var value = style[name];
+      if(name == 'opacity') {
+        if (value == 1) {
+          value = (/Gecko/.test(navigator.userAgent) &&
+            !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
+          if(/MSIE/.test(navigator.userAgent) && !window.opera)
+            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
+        } else if(value === '') {
+          if(/MSIE/.test(navigator.userAgent) && !window.opera)
+            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
+        } else {
+          if(value < 0.00001) value = 0;
+          if(/MSIE/.test(navigator.userAgent) && !window.opera)
+            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
+              'alpha(opacity='+value*100+')';
+        }
+      } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
+      element.style[name.camelize()] = value;
+    }
+    return element;
+  },
+
+  getDimensions: function(element) {
+    element = $(element);
+    var display = $(element).getStyle('display');
+    if (display != 'none' && display != null) // Safari bug
+      return {width: element.offsetWidth, height: element.offsetHeight};
+
+    // All *Width and *Height properties give 0 on elements with display none,
+    // so enable the element temporarily
+    var els = element.style;
+    var originalVisibility = els.visibility;
+    var originalPosition = els.position;
+    var originalDisplay = els.display;
+    els.visibility = 'hidden';
+    els.position = 'absolute';
+    els.display = 'block';
+    var originalWidth = element.clientWidth;
+    var originalHeight = element.clientHeight;
+    els.display = originalDisplay;
+    els.position = originalPosition;
+    els.visibility = originalVisibility;
+    return {width: originalWidth, height: originalHeight};
+  },
+
+  makePositioned: function(element) {
+    element = $(element);
+    var pos = Element.getStyle(element, 'position');
+    if (pos == 'static' || !pos) {
+      element._madePositioned = true;
+      element.style.position = 'relative';
+      // Opera returns the offset relative to the positioning context, when an
+      // element is position relative but top and left have not been defined
+      if (window.opera) {
+        element.style.top = 0;
+        element.style.left = 0;
+      }
+    }
+    return element;
+  },
+
+  undoPositioned: function(element) {
+    element = $(element);
+    if (element._madePositioned) {
+      element._madePositioned = undefined;
+      element.style.position =
+        element.style.top =
+        element.style.left =
+        element.style.bottom =
+        element.style.right = '';
+    }
+    return element;
+  },
+
+  makeClipping: function(element) {
+    element = $(element);
+    if (element._overflow) return element;
+    element._overflow = element.style.overflow || 'auto';
+    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
+      element.style.overflow = 'hidden';
+    return element;
+  },
+
+  undoClipping: function(element) {
+    element = $(element);
+    if (!element._overflow) return element;
+    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
+    element._overflow = null;
+    return element;
+  }
+};
+
+Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});
+
+Element._attributeTranslations = {};
+
+Element._attributeTranslations.names = {
+  colspan:   "colSpan",
+  rowspan:   "rowSpan",
+  valign:    "vAlign",
+  datetime:  "dateTime",
+  accesskey: "accessKey",
+  tabindex:  "tabIndex",
+  enctype:   "encType",
+  maxlength: "maxLength",
+  readonly:  "readOnly",
+  longdesc:  "longDesc"
+};
+
+Element._attributeTranslations.values = {
+  _getAttr: function(element, attribute) {
+    return element.getAttribute(attribute, 2);
+  },
+
+  _flag: function(element, attribute) {
+    return $(element).hasAttribute(attribute) ? attribute : null;
+  },
+
+  style: function(element) {
+    return element.style.cssText.toLowerCase();
+  },
+
+  title: function(element) {
+    var node = element.getAttributeNode('title');
+    return node.specified ? node.nodeValue : null;
+  }
+};
+
+Object.extend(Element._attributeTranslations.values, {
+  href: Element._attributeTranslations.values._getAttr,
+  src:  Element._attributeTranslations.values._getAttr,
+  disabled: Element._attributeTranslations.values._flag,
+  checked:  Element._attributeTranslations.values._flag,
+  readonly: Element._attributeTranslations.values._flag,
+  multiple: Element._attributeTranslations.values._flag
+});
+
+Element.Methods.Simulated = {
+  hasAttribute: function(element, attribute) {
+    var t = Element._attributeTranslations;
+    attribute = t.names[attribute] || attribute;
+    return $(element).getAttributeNode(attribute).specified;
+  }
+};
+
+// IE is missing .innerHTML support for TABLE-related elements
+if (document.all && !window.opera){
+  Element.Methods.update = function(element, html) {
+    element = $(element);
+    html = typeof html == 'undefined' ? '' : html.toString();
+    var tagName = element.tagName.toUpperCase();
+    if (['THEAD','TBODY','TR','TD'].include(tagName)) {
+      var div = document.createElement('div');
+      switch (tagName) {
+        case 'THEAD':
+        case 'TBODY':
+          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';
+          depth = 2;
+          break;
+        case 'TR':
+          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';
+          depth = 3;
+          break;
+        case 'TD':
+          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';
+          depth = 4;
+      }
+      $A(element.childNodes).each(function(node){
+        element.removeChild(node)
+      });
+      depth.times(function(){ div = div.firstChild });
+
+      $A(div.childNodes).each(
+        function(node){ element.appendChild(node) });
+    } else {
+      element.innerHTML = html.stripScripts();
+    }
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  }
+};
+
+Object.extend(Element, Element.Methods);
+
+var _nativeExtensions = false;
+
+if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
+  ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
+    var className = 'HTML' + tag + 'Element';
+    if(window[className]) return;
+    var klass = window[className] = {};
+    klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
+  });
+
+Element.addMethods = function(methods) {
+  Object.extend(Element.Methods, methods || {});
+
+  function copy(methods, destination, onlyIfAbsent) {
+    onlyIfAbsent = onlyIfAbsent || false;
+    var cache = Element.extend.cache;
+    for (var property in methods) {
+      var value = methods[property];
+      if (!onlyIfAbsent || !(property in destination))
+        destination[property] = cache.findOrStore(value);
+    }
+  }
+
+  if (typeof HTMLElement != 'undefined') {
+    copy(Element.Methods, HTMLElement.prototype);
+    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
+    copy(Form.Methods, HTMLFormElement.prototype);
+    [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
+      copy(Form.Element.Methods, klass.prototype);
+    });
+    _nativeExtensions = true;
+  }
+}
+
+var Toggle = new Object();
+Toggle.display = Element.toggle;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.Insertion = function(adjacency) {
+  this.adjacency = adjacency;
+}
+
+Abstract.Insertion.prototype = {
+  initialize: function(element, content) {
+    this.element = $(element);
+    this.content = content.stripScripts();
+
+    if (this.adjacency && this.element.insertAdjacentHTML) {
+      try {
+        this.element.insertAdjacentHTML(this.adjacency, this.content);
+      } catch (e) {
+        var tagName = this.element.tagName.toUpperCase();
+        if (['TBODY', 'TR'].include(tagName)) {
+          this.insertContent(this.contentFromAnonymousTable());
+        } else {
+          throw e;
+        }
+      }
+    } else {
+      this.range = this.element.ownerDocument.createRange();
+      if (this.initializeRange) this.initializeRange();
+      this.insertContent([this.range.createContextualFragment(this.content)]);
+    }
+
+    setTimeout(function() {content.evalScripts()}, 10);
+  },
+
+  contentFromAnonymousTable: function() {
+    var div = document.createElement('div');
+    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
+    return $A(div.childNodes[0].childNodes[0].childNodes);
+  }
+}
+
+var Insertion = new Object();
+
+Insertion.Before = Class.create();
+Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
+  initializeRange: function() {
+    this.range.setStartBefore(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.parentNode.insertBefore(fragment, this.element);
+    }).bind(this));
+  }
+});
+
+Insertion.Top = Class.create();
+Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(true);
+  },
+
+  insertContent: function(fragments) {
+    fragments.reverse(false).each((function(fragment) {
+      this.element.insertBefore(fragment, this.element.firstChild);
+    }).bind(this));
+  }
+});
+
+Insertion.Bottom = Class.create();
+Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.appendChild(fragment);
+    }).bind(this));
+  }
+});
+
+Insertion.After = Class.create();
+Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
+  initializeRange: function() {
+    this.range.setStartAfter(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.parentNode.insertBefore(fragment,
+        this.element.nextSibling);
+    }).bind(this));
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+  initialize: function(element) {
+    this.element = $(element);
+  },
+
+  _each: function(iterator) {
+    this.element.className.split(/\s+/).select(function(name) {
+      return name.length > 0;
+    })._each(iterator);
+  },
+
+  set: function(className) {
+    this.element.className = className;
+  },
+
+  add: function(classNameToAdd) {
+    if (this.include(classNameToAdd)) return;
+    this.set($A(this).concat(classNameToAdd).join(' '));
+  },
+
+  remove: function(classNameToRemove) {
+    if (!this.include(classNameToRemove)) return;
+    this.set($A(this).without(classNameToRemove).join(' '));
+  },
+
+  toString: function() {
+    return $A(this).join(' ');
+  }
+};
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+var Selector = Class.create();
+Selector.prototype = {
+  initialize: function(expression) {
+    this.params = {classNames: []};
+    this.expression = expression.toString().strip();
+    this.parseExpression();
+    this.compileMatcher();
+  },
+
+  parseExpression: function() {
+    function abort(message) { throw 'Parse error in selector: ' + message; }
+
+    if (this.expression == '')  abort('empty expression');
+
+    var params = this.params, expr = this.expression, match, modifier, clause, rest;
+    while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
+      params.attributes = params.attributes || [];
+      params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
+      expr = match[1];
+    }
+
+    if (expr == '*') return this.params.wildcard = true;
+
+    while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
+      modifier = match[1], clause = match[2], rest = match[3];
+      switch (modifier) {
+        case '#':       params.id = clause; break;
+        case '.':       params.classNames.push(clause); break;
+        case '':
+        case undefined: params.tagName = clause.toUpperCase(); break;
+        default:        abort(expr.inspect());
+      }
+      expr = rest;
+    }
+
+    if (expr.length > 0) abort(expr.inspect());
+  },
+
+  buildMatchExpression: function() {
+    var params = this.params, conditions = [], clause;
+
+    if (params.wildcard)
+      conditions.push('true');
+    if (clause = params.id)
+      conditions.push('element.readAttribute("id") == ' + clause.inspect());
+    if (clause = params.tagName)
+      conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
+    if ((clause = params.classNames).length > 0)
+      for (var i = 0, length = clause.length; i < length; i++)
+        conditions.push('element.hasClassName(' + clause[i].inspect() + ')');
+    if (clause = params.attributes) {
+      clause.each(function(attribute) {
+        var value = 'element.readAttribute(' + attribute.name.inspect() + ')';
+        var splitValueBy = function(delimiter) {
+          return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
+        }
+
+        switch (attribute.operator) {
+          case '=':       conditions.push(value + ' == ' + attribute.value.inspect()); break;
+          case '~=':      conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
+          case '|=':      conditions.push(
+                            splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
+                          ); break;
+          case '!=':      conditions.push(value + ' != ' + attribute.value.inspect()); break;
+          case '':
+          case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break;
+          default:        throw 'Unknown operator ' + attribute.operator + ' in selector';
+        }
+      });
+    }
+
+    return conditions.join(' && ');
+  },
+
+  compileMatcher: function() {
+    this.match = new Function('element', 'if (!element.tagName) return false; \
+      element = $(element); \
+      return ' + this.buildMatchExpression());
+  },
+
+  findElements: function(scope) {
+    var element;
+
+    if (element = $(this.params.id))
+      if (this.match(element))
+        if (!scope || Element.childOf(element, scope))
+          return [element];
+
+    scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
+
+    var results = [];
+    for (var i = 0, length = scope.length; i < length; i++)
+      if (this.match(element = scope[i]))
+        results.push(Element.extend(element));
+
+    return results;
+  },
+
+  toString: function() {
+    return this.expression;
+  }
+}
+
+Object.extend(Selector, {
+  matchElements: function(elements, expression) {
+    var selector = new Selector(expression);
+    return elements.select(selector.match.bind(selector)).map(Element.extend);
+  },
+
+  findElement: function(elements, expression, index) {
+    if (typeof expression == 'number') index = expression, expression = false;
+    return Selector.matchElements(elements, expression || '*')[index || 0];
+  },
+
+  findChildElements: function(element, expressions) {
+    return expressions.map(function(expression) {
+      return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) {
+        var selector = new Selector(expr);
+        return results.inject([], function(elements, result) {
+          return elements.concat(selector.findElements(result || element));
+        });
+      });
+    }).flatten();
+  }
+});
+
+function $$() {
+  return Selector.findChildElements(document, $A(arguments));
+}
+var Form = {
+  reset: function(form) {
+    $(form).reset();
+    return form;
+  },
+
+  serializeElements: function(elements, getHash) {
+    var data = elements.inject({}, function(result, element) {
+      if (!element.disabled && element.name) {
+        var key = element.name, value = $(element).getValue();
+        if (value != undefined) {
+          if (result[key]) {
+            if (result[key].constructor != Array) result[key] = [result[key]];
+            result[key].push(value);
+          }
+          else result[key] = value;
+        }
+      }
+      return result;
+    });
+
+    return getHash ? data : Hash.toQueryString(data);
+  }
+};
+
+Form.Methods = {
+  serialize: function(form, getHash) {
+    return Form.serializeElements(Form.getElements(form), getHash);
+  },
+
+  getElements: function(form) {
+    return $A($(form).getElementsByTagName('*')).inject([],
+      function(elements, child) {
+        if (Form.Element.Serializers[child.tagName.toLowerCase()])
+          elements.push(Element.extend(child));
+        return elements;
+      }
+    );
+  },
+
+  getInputs: function(form, typeName, name) {
+    form = $(form);
+    var inputs = form.getElementsByTagName('input');
+
+    if (!typeName && !name) return $A(inputs).map(Element.extend);
+
+    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
+      var input = inputs[i];
+      if ((typeName && input.type != typeName) || (name && input.name != name))
+        continue;
+      matchingInputs.push(Element.extend(input));
+    }
+
+    return matchingInputs;
+  },
+
+  disable: function(form) {
+    form = $(form);
+    form.getElements().each(function(element) {
+      element.blur();
+      element.disabled = 'true';
+    });
+    return form;
+  },
+
+  enable: function(form) {
+    form = $(form);
+    form.getElements().each(function(element) {
+      element.disabled = '';
+    });
+    return form;
+  },
+
+  findFirstElement: function(form) {
+    return $(form).getElements().find(function(element) {
+      return element.type != 'hidden' && !element.disabled &&
+        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+    });
+  },
+
+  focusFirstElement: function(form) {
+    form = $(form);
+    form.findFirstElement().activate();
+    return form;
+  }
+}
+
+Object.extend(Form, Form.Methods);
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element = {
+  focus: function(element) {
+    $(element).focus();
+    return element;
+  },
+
+  select: function(element) {
+    $(element).select();
+    return element;
+  }
+}
+
+Form.Element.Methods = {
+  serialize: function(element) {
+    element = $(element);
+    if (!element.disabled && element.name) {
+      var value = element.getValue();
+      if (value != undefined) {
+        var pair = {};
+        pair[element.name] = value;
+        return Hash.toQueryString(pair);
+      }
+    }
+    return '';
+  },
+
+  getValue: function(element) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    return Form.Element.Serializers[method](element);
+  },
+
+  clear: function(element) {
+    $(element).value = '';
+    return element;
+  },
+
+  present: function(element) {
+    return $(element).value != '';
+  },
+
+  activate: function(element) {
+    element = $(element);
+    element.focus();
+    if (element.select && ( element.tagName.toLowerCase() != 'input' ||
+      !['button', 'reset', 'submit'].include(element.type) ) )
+      element.select();
+    return element;
+  },
+
+  disable: function(element) {
+    element = $(element);
+    element.disabled = true;
+    return element;
+  },
+
+  enable: function(element) {
+    element = $(element);
+    element.blur();
+    element.disabled = false;
+    return element;
+  }
+}
+
+Object.extend(Form.Element, Form.Element.Methods);
+var Field = Form.Element;
+var $F = Form.Element.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element.Serializers = {
+  input: function(element) {
+    switch (element.type.toLowerCase()) {
+      case 'checkbox':
+      case 'radio':
+        return Form.Element.Serializers.inputSelector(element);
+      default:
+        return Form.Element.Serializers.textarea(element);
+    }
+  },
+
+  inputSelector: function(element) {
+    return element.checked ? element.value : null;
+  },
+
+  textarea: function(element) {
+    return element.value;
+  },
+
+  select: function(element) {
+    return this[element.type == 'select-one' ?
+      'selectOne' : 'selectMany'](element);
+  },
+
+  selectOne: function(element) {
+    var index = element.selectedIndex;
+    return index >= 0 ? this.optionValue(element.options[index]) : null;
+  },
+
+  selectMany: function(element) {
+    var values, length = element.length;
+    if (!length) return null;
+
+    for (var i = 0, values = []; i < length; i++) {
+      var opt = element.options[i];
+      if (opt.selected) values.push(this.optionValue(opt));
+    }
+    return values;
+  },
+
+  optionValue: function(opt) {
+    // extend element because hasAttribute may not be native
+    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.TimedObserver = function() {}
+Abstract.TimedObserver.prototype = {
+  initialize: function(element, frequency, callback) {
+    this.frequency = frequency;
+    this.element   = $(element);
+    this.callback  = callback;
+
+    this.lastValue = this.getValue();
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    var value = this.getValue();
+    var changed = ('string' == typeof this.lastValue && 'string' == typeof value
+      ? this.lastValue != value : String(this.lastValue) != String(value));
+    if (changed) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+}
+
+Form.Element.Observer = Class.create();
+Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create();
+Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = function() {}
+Abstract.EventObserver.prototype = {
+  initialize: function(element, callback) {
+    this.element  = $(element);
+    this.callback = callback;
+
+    this.lastValue = this.getValue();
+    if (this.element.tagName.toLowerCase() == 'form')
+      this.registerFormCallbacks();
+    else
+      this.registerCallback(this.element);
+  },
+
+  onElementEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  },
+
+  registerFormCallbacks: function() {
+    Form.getElements(this.element).each(this.registerCallback.bind(this));
+  },
+
+  registerCallback: function(element) {
+    if (element.type) {
+      switch (element.type.toLowerCase()) {
+        case 'checkbox':
+        case 'radio':
+          Event.observe(element, 'click', this.onElementEvent.bind(this));
+          break;
+        default:
+          Event.observe(element, 'change', this.onElementEvent.bind(this));
+          break;
+      }
+    }
+  }
+}
+
+Form.Element.EventObserver = Class.create();
+Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.EventObserver = Class.create();
+Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+if (!window.Event) {
+  var Event = new Object();
+}
+
+Object.extend(Event, {
+  KEY_BACKSPACE: 8,
+  KEY_TAB:       9,
+  KEY_RETURN:   13,
+  KEY_ESC:      27,
+  KEY_LEFT:     37,
+  KEY_UP:       38,
+  KEY_RIGHT:    39,
+  KEY_DOWN:     40,
+  KEY_DELETE:   46,
+  KEY_HOME:     36,
+  KEY_END:      35,
+  KEY_PAGEUP:   33,
+  KEY_PAGEDOWN: 34,
+
+  element: function(event) {
+    return event.target || event.srcElement;
+  },
+
+  isLeftClick: function(event) {
+    return (((event.which) && (event.which == 1)) ||
+            ((event.button) && (event.button == 1)));
+  },
+
+  pointerX: function(event) {
+    return event.pageX || (event.clientX +
+      (document.documentElement.scrollLeft || document.body.scrollLeft));
+  },
+
+  pointerY: function(event) {
+    return event.pageY || (event.clientY +
+      (document.documentElement.scrollTop || document.body.scrollTop));
+  },
+
+  stop: function(event) {
+    if (event.preventDefault) {
+      event.preventDefault();
+      event.stopPropagation();
+    } else {
+      event.returnValue = false;
+      event.cancelBubble = true;
+    }
+  },
+
+  // find the first node with the given tagName, starting from the
+  // node the event was triggered on; traverses the DOM upwards
+  findElement: function(event, tagName) {
+    var element = Event.element(event);
+    while (element.parentNode && (!element.tagName ||
+        (element.tagName.toUpperCase() != tagName.toUpperCase())))
+      element = element.parentNode;
+    return element;
+  },
+
+  observers: false,
+
+  _observeAndCache: function(element, name, observer, useCapture) {
+    if (!this.observers) this.observers = [];
+    if (element.addEventListener) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.addEventListener(name, observer, useCapture);
+    } else if (element.attachEvent) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.attachEvent('on' + name, observer);
+    }
+  },
+
+  unloadCache: function() {
+    if (!Event.observers) return;
+    for (var i = 0, length = Event.observers.length; i < length; i++) {
+      Event.stopObserving.apply(this, Event.observers[i]);
+      Event.observers[i][0] = null;
+    }
+    Event.observers = false;
+  },
+
+  observe: function(element, name, observer, useCapture) {
+    element = $(element);
+    useCapture = useCapture || false;
+
+    if (name == 'keypress' &&
+        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+        || element.attachEvent))
+      name = 'keydown';
+
+    Event._observeAndCache(element, name, observer, useCapture);
+  },
+
+  stopObserving: function(element, name, observer, useCapture) {
+    element = $(element);
+    useCapture = useCapture || false;
+
+    if (name == 'keypress' &&
+        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+        || element.detachEvent))
+      name = 'keydown';
+
+    if (element.removeEventListener) {
+      element.removeEventListener(name, observer, useCapture);
+    } else if (element.detachEvent) {
+      try {
+        element.detachEvent('on' + name, observer);
+      } catch (e) {}
+    }
+  }
+});
+
+/* prevent memory leaks in IE */
+if (navigator.appVersion.match(/\bMSIE\b/))
+  Event.observe(window, 'unload', Event.unloadCache, false);
+var Position = {
+  // set to true if needed, warning: firefox performance problems
+  // NOT neeeded for page scrolling, only if draggable contained in
+  // scrollable elements
+  includeScrollOffsets: false,
+
+  // must be called before calling withinIncludingScrolloffset, every time the
+  // page is scrolled
+  prepare: function() {
+    this.deltaX =  window.pageXOffset
+                || document.documentElement.scrollLeft
+                || document.body.scrollLeft
+                || 0;
+    this.deltaY =  window.pageYOffset
+                || document.documentElement.scrollTop
+                || document.body.scrollTop
+                || 0;
+  },
+
+  realOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0;
+      element = element.parentNode;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  cumulativeOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  positionedOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+      if (element) {
+        if(element.tagName=='BODY') break;
+        var p = Element.getStyle(element, 'position');
+        if (p == 'relative' || p == 'absolute') break;
+      }
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  offsetParent: function(element) {
+    if (element.offsetParent) return element.offsetParent;
+    if (element == document.body) return element;
+
+    while ((element = element.parentNode) && element != document.body)
+      if (Element.getStyle(element, 'position') != 'static')
+        return element;
+
+    return document.body;
+  },
+
+  // caches x/y coordinate pair to use with overlap
+  within: function(element, x, y) {
+    if (this.includeScrollOffsets)
+      return this.withinIncludingScrolloffsets(element, x, y);
+    this.xcomp = x;
+    this.ycomp = y;
+    this.offset = this.cumulativeOffset(element);
+
+    return (y >= this.offset[1] &&
+            y <  this.offset[1] + element.offsetHeight &&
+            x >= this.offset[0] &&
+            x <  this.offset[0] + element.offsetWidth);
+  },
+
+  withinIncludingScrolloffsets: function(element, x, y) {
+    var offsetcache = this.realOffset(element);
+
+    this.xcomp = x + offsetcache[0] - this.deltaX;
+    this.ycomp = y + offsetcache[1] - this.deltaY;
+    this.offset = this.cumulativeOffset(element);
+
+    return (this.ycomp >= this.offset[1] &&
+            this.ycomp <  this.offset[1] + element.offsetHeight &&
+            this.xcomp >= this.offset[0] &&
+            this.xcomp <  this.offset[0] + element.offsetWidth);
+  },
+
+  // within must be called directly before
+  overlap: function(mode, element) {
+    if (!mode) return 0;
+    if (mode == 'vertical')
+      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+        element.offsetHeight;
+    if (mode == 'horizontal')
+      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+        element.offsetWidth;
+  },
+
+  page: function(forElement) {
+    var valueT = 0, valueL = 0;
+
+    var element = forElement;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+
+      // Safari fix
+      if (element.offsetParent==document.body)
+        if (Element.getStyle(element,'position')=='absolute') break;
+
+    } while (element = element.offsetParent);
+
+    element = forElement;
+    do {
+      if (!window.opera || element.tagName=='BODY') {
+        valueT -= element.scrollTop  || 0;
+        valueL -= element.scrollLeft || 0;
+      }
+    } while (element = element.parentNode);
+
+    return [valueL, valueT];
+  },
+
+  clone: function(source, target) {
+    var options = Object.extend({
+      setLeft:    true,
+      setTop:     true,
+      setWidth:   true,
+      setHeight:  true,
+      offsetTop:  0,
+      offsetLeft: 0
+    }, arguments[2] || {})
+
+    // find page position of source
+    source = $(source);
+    var p = Position.page(source);
+
+    // find coordinate system to use
+    target = $(target);
+    var delta = [0, 0];
+    var parent = null;
+    // delta [0,0] will do fine with position: fixed elements,
+    // position:absolute needs offsetParent deltas
+    if (Element.getStyle(target,'position') == 'absolute') {
+      parent = Position.offsetParent(target);
+      delta = Position.page(parent);
+    }
+
+    // correct by body offsets (fixes Safari)
+    if (parent == document.body) {
+      delta[0] -= document.body.offsetLeft;
+      delta[1] -= document.body.offsetTop;
+    }
+
+    // set position
+    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
+    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
+    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
+    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
+  },
+
+  absolutize: function(element) {
+    element = $(element);
+    if (element.style.position == 'absolute') return;
+    Position.prepare();
+
+    var offsets = Position.positionedOffset(element);
+    var top     = offsets[1];
+    var left    = offsets[0];
+    var width   = element.clientWidth;
+    var height  = element.clientHeight;
+
+    element._originalLeft   = left - parseFloat(element.style.left  || 0);
+    element._originalTop    = top  - parseFloat(element.style.top || 0);
+    element._originalWidth  = element.style.width;
+    element._originalHeight = element.style.height;
+
+    element.style.position = 'absolute';
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.width  = width + 'px';
+    element.style.height = height + 'px';
+  },
+
+  relativize: function(element) {
+    element = $(element);
+    if (element.style.position == 'relative') return;
+    Position.prepare();
+
+    element.style.position = 'relative';
+    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
+    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
+
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.height = element._originalHeight;
+    element.style.width  = element._originalWidth;
+  }
+}
+
+// Safari returns margins on body which is incorrect if the child is absolutely
+// positioned.  For performance reasons, redefine Position.cumulativeOffset for
+// KHTML/WebKit only.
+if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
+  Position.cumulativeOffset = function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      if (element.offsetParent == document.body)
+        if (Element.getStyle(element, 'position') == 'absolute') break;
+
+      element = element.offsetParent;
+    } while (element);
+
+    return [valueL, valueT];
+  }
+}
+
+Element.addMethods();
Index: /ether_2012/web/resources/js/autocomplete/javascript/scriptaculous.js
===================================================================
--- /ether_2012/web/resources/js/autocomplete/javascript/scriptaculous.js	(revision 319)
+++ /ether_2012/web/resources/js/autocomplete/javascript/scriptaculous.js	(revision 319)
@@ -0,0 +1,51 @@
+// script.aculo.us scriptaculous.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+
+// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// 
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+var Scriptaculous = {
+  Version: '1.7.0',
+  require: function(libraryName) {
+    // inserting via DOM fails in Safari 2.0, so brute force approach
+    document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
+  },
+  load: function() {
+    if((typeof Prototype=='undefined') || 
+       (typeof Element == 'undefined') || 
+       (typeof Element.Methods=='undefined') ||
+       parseFloat(Prototype.Version.split(".")[0] + "." +
+                  Prototype.Version.split(".")[1]) < 1.5)
+       throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
+    
+    $A(document.getElementsByTagName("script")).findAll( function(s) {
+      return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
+    }).each( function(s) {
+      var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
+      var includes = s.src.match(/\?.*load=([a-z,]*)/);
+      (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(
+       function(include) { Scriptaculous.require(path+include+'.js') });
+    });
+  }
+}
+
+Scriptaculous.load();
Index: /ether_2012/web/resources/js/autocomplete/response.php
===================================================================
--- /ether_2012/web/resources/js/autocomplete/response.php	(revision 319)
+++ /ether_2012/web/resources/js/autocomplete/response.php	(revision 319)
@@ -0,0 +1,17 @@
+<?php
+	require_once('http://localhost:8080/Project_source/resources/js/autocomplete/db.php');
+
+  $aCountries = explode(',', $string);
+  $search = @$_POST['search'];
+  
+  if($search) {
+  	$search = preg_replace("/[^a-z0-9 ]/si","", $search);
+  	//$res = mysql_query("select ID,countryName from ajax_countries where countryName like '".$letters."%'") or die(mysql_error());
+    foreach($aCountries as $key => $country) {
+      $country = strtolower($country);
+      if(strpos($country, $search)!==false)
+        $li .= "<li>$country</li>"."\n";
+    }
+  }
+  print "<ul>$li</ul>";
+?>
Index: /ether_2012/web/resources/js/autocomplete/test.js
===================================================================
--- /ether_2012/web/resources/js/autocomplete/test.js	(revision 319)
+++ /ether_2012/web/resources/js/autocomplete/test.js	(revision 319)
@@ -0,0 +1,1 @@
+alert('hello');
Index: /ether_2012/web/resources/js/calendarview-1.2/ChangeLog
===================================================================
--- /ether_2012/web/resources/js/calendarview-1.2/ChangeLog	(revision 319)
+++ /ether_2012/web/resources/js/calendarview-1.2/ChangeLog	(revision 319)
@@ -0,0 +1,32 @@
+
+Version 1.2 - May 13th, 2009
+
+ - Fixed some CSS rules in the packaged stylesheet so that days from other
+   months and the current date are styled the way they were intended.
+
+ - Reorganized the repository a bit and added an example to the downloadable
+   package.
+
+ - Added some release packaging scripts to ease distribution of new releases.
+
+ - Fixed the display of days from other months in the default CSS. Thanks to
+   Corie Slate for reporting this issue.
+
+ - Fixed a compatibility issue with Internet Explorer 8. Thanks to Gabriel
+   Engel for this fix.
+
+Version 1.1 - October 19th, 2008
+
+ - Upgraded to Prototype 1.6 and cleaned up code to take full advantage of its
+   new API features.
+
+ - Removed our dependency on Builder from script.aculo.us, as Prototype 1.6
+   has its own DOM Builder now.
+
+ - Fixed a bug where navigating through months of the calendar would display
+   the wrong year when you reached December. Thanks to Dirk Koritnik for the
+   fix and for everyone who reported the issue.
+
+Version 1.0 - March 12th, 2007
+
+ - Initial release
Index: /ether_2012/web/resources/js/calendarview-1.2/examples/calendarview.html
===================================================================
--- /ether_2012/web/resources/js/calendarview-1.2/examples/calendarview.html	(revision 319)
+++ /ether_2012/web/resources/js/calendarview-1.2/examples/calendarview.html	(revision 319)
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="UTF-8">
+    <title>CalendarView â JavaScript Calendar Widget</title>
+    <link rel="stylesheet" href="../stylesheets/calendarview.css">
+    <style>
+      body {
+        font-family: Trebuchet MS;
+      }
+      div.calendar {
+        max-width: 240px;
+        margin-left: auto;
+        margin-right: auto;
+      }
+      div.calendar table {
+        width: 100%;
+      }
+      div.dateField {
+        width: 140px;
+        padding: 6px;
+        -webkit-border-radius: 6px;
+        -moz-border-radius: 6px;
+        color: #555;
+        background-color: white;
+        margin-left: auto;
+        margin-right: auto;
+        text-align: center;
+      }
+      div#popupDateField:hover {
+        background-color: #cde;
+        cursor: pointer;
+      }
+    </style>
+    <script src="../javascripts/prototype.js"></script>
+    <script src="../javascripts/calendarview.js"></script>
+    <script>
+      function setupCalendars() {
+        // Embedded Calendar
+        Calendar.setup(
+          {
+            dateField: 'embeddedDateField',
+            parentElement: 'embeddedCalendar'
+          }
+        )
+
+        // Popup Calendar
+        Calendar.setup(
+          {
+            dateField: 'popupDateField',
+            triggerElement: 'popupDateField'
+          }
+        )
+      }
+
+      Event.observe(window, 'load', function() { setupCalendars() })
+    </script>
+  </head>
+  <body>
+
+    <div style="float: left; width: 50%">
+      <div style="height: 400px; background-color: #efefef; padding: 10px; -webkit-border-radius: 12px; -moz-border-radius: 12px; margin-right: 10px">
+        <h3 style="text-align: center; background-color: white; -webkit-border-radius: 10px; -moz-border-radius: 10px; margin-top: 0px; margin-bottom: 20px; padding: 8px">
+          Embedded Calendar
+        </h3>
+        <div id="embeddedExample" style="">
+          <div id="embeddedCalendar" style="margin-left: auto; margin-right: auto">
+          </div>
+          <br />
+          <div id="embeddedDateField" class="dateField">
+            Select Date
+          </div>
+          <br />
+        </div>
+      </div>
+    </div>
+    <div style="float: right; width: 50%">
+      <div style="height: 400px; background-color: #efefef; padding: 10px; -webkit-border-radius: 12px; -moz-border-radius: 12px; margin-left: 10px">
+        <h3 style="text-align: center; background-color: white; -webkit-border-radius: 10px; -moz-border-radius: 10px; margin-top: 0px; margin-bottom: 20px; padding: 8px">
+          Popup Calendar
+        </h3>
+        <div id="popupExample">
+          <div id="popupDateField" class="dateField" style="margin-top: 160px">
+            Show Calendar
+          </div>
+        </div>
+      </div>
+    </div>
+
+  </body>
+</html>
Index: /ether_2012/web/resources/js/calendarview-1.2/javascripts/calendarview.js
===================================================================
--- /ether_2012/web/resources/js/calendarview-1.2/javascripts/calendarview.js	(revision 319)
+++ /ether_2012/web/resources/js/calendarview-1.2/javascripts/calendarview.js	(revision 319)
@@ -0,0 +1,870 @@
+//
+// CalendarView (for Prototype)
+// calendarview.org
+//
+// Maintained by Justin Mecham <justin@aspect.net>
+//
+// Portions Copyright 2002-2005 Mihai Bazon
+//
+// This calendar is based very loosely on the Dynarch Calendar in that it was
+// used as a base, but completely gutted and more or less rewritten in place
+// to use the Prototype JavaScript library.
+//
+// As such, CalendarView is licensed under the terms of the GNU Lesser General
+// Public License (LGPL). More information on the Dynarch Calendar can be
+// found at:
+//
+//   www.dynarch.com/projects/calendar
+//
+
+var Calendar = Class.create()
+
+//------------------------------------------------------------------------------
+// Constants
+//------------------------------------------------------------------------------
+
+Calendar.VERSION = '1.2'
+
+Calendar.DAY_NAMES = new Array(
+  'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday',
+  'Sunday'
+)
+
+Calendar.SHORT_DAY_NAMES = new Array(
+  'S', 'M', 'T', 'W', 'T', 'F', 'S', 'S'
+)
+
+Calendar.MONTH_NAMES = new Array(
+  'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
+  'September', 'October', 'November', 'December'
+)
+
+Calendar.SHORT_MONTH_NAMES = new Array(
+  'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov',
+  'Dec' 
+)
+
+Calendar.NAV_PREVIOUS_YEAR  = -2
+Calendar.NAV_PREVIOUS_MONTH = -1
+Calendar.NAV_TODAY          =  0
+Calendar.NAV_NEXT_MONTH     =  1
+Calendar.NAV_NEXT_YEAR      =  2
+
+//------------------------------------------------------------------------------
+// Static Methods
+//------------------------------------------------------------------------------
+
+// This gets called when the user presses a mouse button anywhere in the
+// document, if the calendar is shown. If the click was outside the open
+// calendar this function closes it.
+Calendar._checkCalendar = function(event) {
+  if (!window._popupCalendar)
+    return false
+  if (Element.descendantOf(Event.element(event), window._popupCalendar.container))
+    return
+  window._popupCalendar.callCloseHandler()
+  return Event.stop(event)
+}
+
+//------------------------------------------------------------------------------
+// Event Handlers
+//------------------------------------------------------------------------------
+
+Calendar.handleMouseDownEvent = function(event)
+{
+  Event.observe(document, 'mouseup', Calendar.handleMouseUpEvent)
+  Event.stop(event)
+}
+
+// XXX I am not happy with how clicks of different actions are handled. Need to
+// clean this up!
+Calendar.handleMouseUpEvent = function(event)
+{
+  var el        = Event.element(event)
+  var calendar  = el.calendar
+  var isNewDate = false
+
+  // If the element that was clicked on does not have an associated Calendar
+  // object, return as we have nothing to do.
+  if (!calendar) return false
+
+  // Clicked on a day
+  if (typeof el.navAction == 'undefined')
+  {
+    if (calendar.currentDateElement) {
+      Element.removeClassName(calendar.currentDateElement, 'selected')
+      Element.addClassName(el, 'selected')
+      calendar.shouldClose = (calendar.currentDateElement == el)
+      if (!calendar.shouldClose) calendar.currentDateElement = el
+    }
+    calendar.date.setDateOnly(el.date)
+    isNewDate = true
+    calendar.shouldClose = !el.hasClassName('otherDay')
+    var isOtherMonth     = !calendar.shouldClose
+    if (isOtherMonth) calendar.update(calendar.date)
+  }
+
+  // Clicked on an action button
+  else
+  {
+    var date = new Date(calendar.date)
+
+    if (el.navAction == Calendar.NAV_TODAY)
+      date.setDateOnly(new Date())
+
+    var year = date.getFullYear()
+    var mon = date.getMonth()
+    function setMonth(m) {
+      var day = date.getDate()
+      var max = date.getMonthDays(m)
+      if (day > max) date.setDate(max)
+      date.setMonth(m)
+    }
+    switch (el.navAction) {
+
+      // Previous Year
+      case Calendar.NAV_PREVIOUS_YEAR:
+        if (year > calendar.minYear)
+          date.setFullYear(year - 1)
+        break
+
+      // Previous Month
+      case Calendar.NAV_PREVIOUS_MONTH:
+        if (mon > 0) {
+          setMonth(mon - 1)
+        }
+        else if (year-- > calendar.minYear) {
+          date.setFullYear(year)
+          setMonth(11)
+        }
+        break
+
+      // Today
+      case Calendar.NAV_TODAY:
+        break
+
+      // Next Month
+      case Calendar.NAV_NEXT_MONTH:
+        if (mon < 11) {
+          setMonth(mon + 1)
+        }
+        else if (year < calendar.maxYear) {
+          date.setFullYear(year + 1)
+          setMonth(0)
+        }
+        break
+
+      // Next Year
+      case Calendar.NAV_NEXT_YEAR:
+        if (year < calendar.maxYear)
+          date.setFullYear(year + 1)
+        break
+
+    }
+
+    if (!date.equalsTo(calendar.date)) {
+      calendar.setDate(date)
+      isNewDate = true
+    } else if (el.navAction == 0) {
+      isNewDate = (calendar.shouldClose = true)
+    }
+  }
+
+  if (isNewDate) event && calendar.callSelectHandler()
+  if (calendar.shouldClose) event && calendar.callCloseHandler()
+
+  Event.stopObserving(document, 'mouseup', Calendar.handleMouseUpEvent)
+
+  return Event.stop(event)
+}
+
+Calendar.defaultSelectHandler = function(calendar)
+{
+  if (!calendar.dateField) return false
+
+  // Update dateField value
+  if (calendar.dateField.tagName == 'DIV')
+  {
+	  if(calendar.clickToDateField)
+	    Element.update(calendar.dateField, calendar.date.print(calendar.dateFormat))
+	  else
+		Element.update(calendar.endDateField, calendar.date.print(calendar.dateFormat))
+	  calendar.setClickToDateField(!calendar.clickToDateField);
+	  calendar.testPeriod(calendar.dateField.innerHTML,calendar.endDateField.innerHTML);
+  }
+  else if (calendar.dateField.tagName == 'INPUT') {
+    calendar.dateField.value = calendar.date.print(calendar.dateFormat) }
+
+  // Trigger the onchange callback on the dateField, if one has been defined
+  if (typeof calendar.dateField.onchange == 'function')
+    calendar.dateField.onchange()
+
+  // Call the close handler, if necessary
+  if (calendar.shouldClose) calendar.callCloseHandler()
+}
+
+Calendar.defaultCloseHandler = function(calendar)
+{
+  calendar.hide()
+}
+
+
+//------------------------------------------------------------------------------
+// Calendar Setup
+//------------------------------------------------------------------------------
+
+Calendar.setup = function(params)
+{
+
+  function param_default(name, def) {
+    if (!params[name]) params[name] = def
+  }
+
+  param_default('dateField', null)
+  param_default('endDateField', null)  
+  param_default('triggerElement', null)
+  param_default('parentElement', null)
+  param_default('selectHandler',  null)
+  param_default('closeHandler', null)
+
+  // In-Page Calendar
+  if (params.parentElement)
+  {
+    var calendar = new Calendar(params.parentElement)
+    calendar.setSelectHandler(params.selectHandler || Calendar.defaultSelectHandler)
+    if (params.dateFormat)
+      calendar.setDateFormat(params.dateFormat)
+    if (params.dateField) {
+      calendar.setDateField(params.dateField)
+      calendar.parseDate(calendar.dateField.innerHTML || calendar.dateField.value)
+    }
+
+    if (params.endDateField) {
+        calendar.setEndDateField(params.endDateField)
+        calendar.parseDate(calendar.endDateField.innerHTML || calendar.endDateField.value)
+      }
+    calendar.show()
+    return calendar
+  }
+
+  // Popup Calendars
+  //
+  // XXX There is significant optimization to be had here by creating the
+  // calendar and storing it on the page, but then you will have issues with
+  // multiple calendars on the same page.
+  else
+  {
+    var triggerElement = $(params.triggerElement || params.dateField)
+    triggerElement.onclick = function() {
+      var calendar = new Calendar()
+      calendar.setSelectHandler(params.selectHandler || Calendar.defaultSelectHandler)
+      calendar.setCloseHandler(params.closeHandler || Calendar.defaultCloseHandler)
+      if (params.dateFormat)
+        calendar.setDateFormat(params.dateFormat)
+      if (params.dateField) {
+        calendar.setDateField(params.dateField)
+        calendar.parseDate(calendar.dateField.innerHTML || calendar.dateField.value)
+      }
+      if (params.endDateField) {
+          calendar.setEndDateField(params.endDateField)
+          calendar.parseDate(calendar.endDateField.innerHTML || calendar.endDateField.value)
+      }
+
+      if (params.dateField)
+        Date.parseDate(calendar.dateField.value || calendar.dateField.innerHTML, calendar.dateFormat)
+      if (params.endDateField)
+        Date.parseDate(calendar.endDateField.value || calendar.endDateField.innerHTML, calendar.dateFormat)
+
+        calendar.showAtElement(triggerElement)
+      return calendar
+    }
+  }
+
+}
+
+
+
+//------------------------------------------------------------------------------
+// Calendar Instance
+//------------------------------------------------------------------------------
+
+Calendar.prototype = {
+
+  // The HTML Container Element
+  container: null,
+
+  // Callbacks
+  selectHandler: null,
+  closeHandler: null,
+
+  // Configuration
+  minYear: 1900,
+  maxYear: 2100,
+  dateFormat: '%Y-%m-%d',
+
+  // Dates
+  date: new Date(),
+  currentDateElement: null,
+
+  // Status
+  shouldClose: false,
+  isPopup: true,
+
+  dateField: null,
+  endDateField: null,
+  clickToDateField: true,
+
+  //----------------------------------------------------------------------------
+  // Initialize
+  //----------------------------------------------------------------------------
+
+  initialize: function(parent)
+  {
+    if (parent)
+      this.create($(parent))
+    else
+      this.create()
+  },
+
+
+
+  //----------------------------------------------------------------------------
+  // Update / (Re)initialize Calendar
+  //----------------------------------------------------------------------------
+
+  update: function(date)
+  {
+    var calendar   = this
+    var today      = new Date()
+    var thisYear   = today.getFullYear()
+    var thisMonth  = today.getMonth()
+    var thisDay    = today.getDate()
+    var month      = date.getMonth();
+    var dayOfMonth = date.getDate();
+
+    // Ensure date is within the defined range
+    if (date.getFullYear() < this.minYear)
+      date.setFullYear(this.minYear)
+    else if (date.getFullYear() > this.maxYear)
+      date.setFullYear(this.maxYear)
+
+    this.date = new Date(date)
+
+    // Calculate the first day to display (including the previous month)
+    date.setDate(1)
+    date.setDate(-(date.getDay()) + 1)
+
+    // Fill in the days of the month
+    Element.getElementsBySelector(this.container, 'tbody tr').each(
+      function(row, i) {
+        var rowHasDays = false
+        row.immediateDescendants().each(
+          function(cell, j) {
+            var day            = date.getDate()
+            var dayOfWeek      = date.getDay()
+            var isCurrentMonth = (date.getMonth() == month)
+
+            // Reset classes on the cell
+            cell.className = ''
+            cell.date = new Date(date)
+            cell.update(day)
+
+            // Account for days of the month other than the current month
+            if (!isCurrentMonth)
+              cell.addClassName('otherDay')
+            else
+              rowHasDays = true
+
+            // Ensure the current day is selected
+            if (isCurrentMonth && day == dayOfMonth) {
+              cell.addClassName('selected')
+              calendar.currentDateElement = cell
+            }
+
+            // Today
+            if (date.getFullYear() == thisYear && date.getMonth() == thisMonth && day == thisDay)
+              cell.addClassName('today')
+
+            // Weekend
+            if ([0, 6].indexOf(dayOfWeek) != -1)
+              cell.addClassName('weekend')
+
+            // Set the date to tommorrow
+            date.setDate(day + 1)
+          }
+        )
+        // Hide the extra row if it contains only days from another month
+        !rowHasDays ? row.hide() : row.show()
+      }
+    )
+
+    this.container.getElementsBySelector('td.title')[0].update(
+      Calendar.MONTH_NAMES[month] + ' ' + this.date.getFullYear()
+    )
+  },
+
+
+
+  //----------------------------------------------------------------------------
+  // Create/Draw the Calendar HTML Elements
+  //----------------------------------------------------------------------------
+
+  create: function(parent)
+  {
+
+    // If no parent was specified, assume that we are creating a popup calendar.
+    if (!parent) {
+      parent = document.getElementsByTagName('body')[0]
+      this.isPopup = true
+    } else {
+      this.isPopup = false
+    }
+
+    // Calendar Table
+    var table = new Element('table')
+
+    // Calendar Header
+    var thead = new Element('thead')
+    table.appendChild(thead)
+
+    // Title Placeholder
+    var row  = new Element('tr')
+    var cell = new Element('td', { colSpan: 7 } )
+    cell.addClassName('title')
+    row.appendChild(cell)
+    thead.appendChild(row)
+
+    // Calendar Navigation
+    row = new Element('tr')
+    this._drawButtonCell(row, '&#x00ab;', 1, Calendar.NAV_PREVIOUS_YEAR)
+    this._drawButtonCell(row, '&#x2039;', 1, Calendar.NAV_PREVIOUS_MONTH)
+    this._drawButtonCell(row, 'Today',    3, Calendar.NAV_TODAY)
+    this._drawButtonCell(row, '&#x203a;', 1, Calendar.NAV_NEXT_MONTH)
+    this._drawButtonCell(row, '&#x00bb;', 1, Calendar.NAV_NEXT_YEAR)
+    thead.appendChild(row)
+
+    // Day Names
+    row = new Element('tr')
+    for (var i = 0; i < 7; ++i) {
+      cell = new Element('th').update(Calendar.SHORT_DAY_NAMES[i])
+      if (i == 0 || i == 6)
+        cell.addClassName('weekend')
+      row.appendChild(cell)
+    }
+    thead.appendChild(row)
+
+    // Calendar Days
+    var tbody = table.appendChild(new Element('tbody'))
+    for (i = 6; i > 0; --i) {
+      row = tbody.appendChild(new Element('tr'))
+      row.addClassName('days')
+      for (var j = 7; j > 0; --j) {
+        cell = row.appendChild(new Element('td'))
+        cell.calendar = this
+      }
+    }
+
+    // Calendar Container (div)
+    this.container = new Element('div')
+    this.container.addClassName('calendar')
+    if (this.isPopup) {
+      this.container.setStyle({ position: 'absolute', display: 'none' })
+      this.container.addClassName('popup')
+    }
+    this.container.appendChild(table)
+
+    // Initialize Calendar
+    this.update(this.date)
+
+    // Observe the container for mousedown events
+    Event.observe(this.container, 'mousedown', Calendar.handleMouseDownEvent)
+
+    // Append to parent element
+    parent.appendChild(this.container)
+
+  },
+
+  _drawButtonCell: function(parent, text, colSpan, navAction)
+  {
+    var cell          = new Element('td')
+    if (colSpan > 1) cell.colSpan = colSpan
+    cell.className    = 'button'
+    cell.calendar     = this
+    cell.navAction    = navAction
+    cell.innerHTML    = text
+    cell.unselectable = 'on' // IE
+    parent.appendChild(cell)
+    return cell
+  },
+
+
+
+  //------------------------------------------------------------------------------
+  // Callbacks
+  //------------------------------------------------------------------------------
+
+  // Calls the Select Handler (if defined)
+  callSelectHandler: function()
+  {
+    if (this.selectHandler)
+      this.selectHandler(this, this.date.print(this.dateFormat))
+  },
+
+  // Calls the Close Handler (if defined)
+  callCloseHandler: function()
+  {
+    if (this.closeHandler)
+      this.closeHandler(this)
+  },
+
+
+
+  //------------------------------------------------------------------------------
+  // Calendar Display Functions
+  //------------------------------------------------------------------------------
+
+  // Shows the Calendar
+  show: function()
+  {
+    this.container.show()
+    if (this.isPopup) {
+      window._popupCalendar = this
+      Event.observe(document, 'mousedown', Calendar._checkCalendar)
+    }
+  },
+
+  // Shows the calendar at the given absolute position
+  showAt: function (x, y)
+  {
+    this.container.setStyle({ left: x + 'px', top: y + 'px' })
+    this.show()
+  },
+
+  // Shows the Calendar at the coordinates of the provided element
+  showAtElement: function(element)
+  {
+    var pos = Position.cumulativeOffset(element)
+    this.showAt(pos[0], pos[1])
+  },
+
+  // Hides the Calendar
+  hide: function()
+  {
+    if (this.isPopup)
+      Event.stopObserving(document, 'mousedown', Calendar._checkCalendar)
+    this.container.hide()
+  },
+
+
+
+  //------------------------------------------------------------------------------
+  // Miscellaneous
+  //------------------------------------------------------------------------------
+
+  // Tries to identify the date represented in a string.  If successful it also
+  // calls this.setDate which moves the calendar to the given date.
+  parseDate: function(str, format)
+  {
+    if (!format)
+      format = this.dateFormat
+    this.setDate(Date.parseDate(str, format))
+  },
+
+
+
+  //------------------------------------------------------------------------------
+  // Getters/Setters
+  //------------------------------------------------------------------------------
+
+  setSelectHandler: function(selectHandler)
+  {
+    this.selectHandler = selectHandler
+  },
+
+  setCloseHandler: function(closeHandler)
+  {
+    this.closeHandler = closeHandler
+  },
+
+  setDate: function(date)
+  {
+    if (!date.equalsTo(this.date))
+      this.update(date)
+  },
+
+  setDateFormat: function(format)
+  {
+    this.dateFormat = format
+  },
+
+  setDateField: function(field)
+  {
+    this.dateField = $(field)
+  },
+
+  setEndDateField: function(endField)
+  {
+    this.endDateField = $(endField)
+  },
+
+  setRange: function(minYear, maxYear)
+  {
+    this.minYear = minYear
+    this.maxYear = maxYear
+  },
+  
+  setClickToDateField: function(isClickToDateField)
+  {
+	  this.clickToDateField = isClickToDateField;
+  }
+}
+
+// global object that remembers the calendar
+window._popupCalendar = null
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//==============================================================================
+//
+// Date Object Patches
+//
+// This is pretty much untouched from the original. I really would like to get
+// rid of these patches if at all possible and find a cleaner way of
+// accomplishing the same things. It's a shame Prototype doesn't extend Date at
+// all.
+//
+//==============================================================================
+
+Date.DAYS_IN_MONTH = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
+Date.SECOND        = 1000 /* milliseconds */
+Date.MINUTE        = 60 * Date.SECOND
+Date.HOUR          = 60 * Date.MINUTE
+Date.DAY           = 24 * Date.HOUR
+Date.WEEK          =  7 * Date.DAY
+
+// Parses Date
+Date.parseDate = function(str, fmt) {
+  var today = new Date();
+  var y     = 0;
+  var m     = -1;
+  var d     = 0;
+  var a     = str.split(/\W+/);
+  var b     = fmt.match(/%./g);
+  var i     = 0, j = 0;
+  var hr    = 0;
+  var min   = 0;
+
+  for (i = 0; i < a.length; ++i) {
+    if (!a[i]) continue;
+    switch (b[i]) {
+      case "%d":
+      case "%e":
+        d = parseInt(a[i], 10);
+        break;
+      case "%m":
+        m = parseInt(a[i], 10) - 1;
+        break;
+      case "%Y":
+      case "%y":
+        y = parseInt(a[i], 10);
+        (y < 100) && (y += (y > 29) ? 1900 : 2000);
+        break;
+      case "%b":
+      case "%B":
+        for (j = 0; j < 12; ++j) {
+          if (Calendar.MONTH_NAMES[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) {
+            m = j;
+            break;
+          }
+        }
+        break;
+      case "%H":
+      case "%I":
+      case "%k":
+      case "%l":
+        hr = parseInt(a[i], 10);
+        break;
+      case "%P":
+      case "%p":
+        if (/pm/i.test(a[i]) && hr < 12)
+          hr += 12;
+        else if (/am/i.test(a[i]) && hr >= 12)
+          hr -= 12;
+        break;
+      case "%M":
+        min = parseInt(a[i], 10);
+        break;
+    }
+  }
+  if (isNaN(y)) y = today.getFullYear();
+  if (isNaN(m)) m = today.getMonth();
+  if (isNaN(d)) d = today.getDate();
+  if (isNaN(hr)) hr = today.getHours();
+  if (isNaN(min)) min = today.getMinutes();
+  if (y != 0 && m != -1 && d != 0)
+    return new Date(y, m, d, hr, min, 0);
+  y = 0; m = -1; d = 0;
+  for (i = 0; i < a.length; ++i) {
+    if (a[i].search(/[a-zA-Z]+/) != -1) {
+      var t = -1;
+      for (j = 0; j < 12; ++j) {
+        if (Calendar.MONTH_NAMES[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; }
+      }
+      if (t != -1) {
+        if (m != -1) {
+          d = m+1;
+        }
+        m = t;
+      }
+    } else if (parseInt(a[i], 10) <= 12 && m == -1) {
+      m = a[i]-1;
+    } else if (parseInt(a[i], 10) > 31 && y == 0) {
+      y = parseInt(a[i], 10);
+      (y < 100) && (y += (y > 29) ? 1900 : 2000);
+    } else if (d == 0) {
+      d = a[i];
+    }
+  }
+  if (y == 0)
+    y = today.getFullYear();
+  if (m != -1 && d != 0)
+    return new Date(y, m, d, hr, min, 0);
+  return today;
+};
+
+// Returns the number of days in the current month
+Date.prototype.getMonthDays = function(month) {
+  var year = this.getFullYear()
+  if (typeof month == "undefined")
+    month = this.getMonth()
+  if (((0 == (year % 4)) && ( (0 != (year % 100)) || (0 == (year % 400)))) && month == 1)
+    return 29
+  else
+    return Date.DAYS_IN_MONTH[month]
+};
+
+// Returns the number of day in the year
+Date.prototype.getDayOfYear = function() {
+  var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
+  var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
+  var time = now - then;
+  return Math.floor(time / Date.DAY);
+};
+
+/** Returns the number of the week in year, as defined in ISO 8601. */
+Date.prototype.getWeekNumber = function() {
+  var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
+  var DoW = d.getDay();
+  d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
+  var ms = d.valueOf(); // GMT
+  d.setMonth(0);
+  d.setDate(4); // Thu in Week 1
+  return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
+};
+
+/** Checks date and time equality */
+Date.prototype.equalsTo = function(date) {
+  return ((this.getFullYear() == date.getFullYear()) &&
+   (this.getMonth() == date.getMonth()) &&
+   (this.getDate() == date.getDate()) &&
+   (this.getHours() == date.getHours()) &&
+   (this.getMinutes() == date.getMinutes()));
+};
+
+/** Set only the year, month, date parts (keep existing time) */
+Date.prototype.setDateOnly = function(date) {
+  var tmp = new Date(date);
+  this.setDate(1);
+  this.setFullYear(tmp.getFullYear());
+  this.setMonth(tmp.getMonth());
+  this.setDate(tmp.getDate());
+};
+
+/** Prints the date in a string according to the given format. */
+Date.prototype.print = function (str) {
+  var m = this.getMonth();
+  var d = this.getDate();
+  var y = this.getFullYear();
+  var wn = this.getWeekNumber();
+  var w = this.getDay();
+  var s = {};
+  var hr = this.getHours();
+  var pm = (hr >= 12);
+  var ir = (pm) ? (hr - 12) : hr;
+  var dy = this.getDayOfYear();
+  if (ir == 0)
+    ir = 12;
+  var min = this.getMinutes();
+  var sec = this.getSeconds();
+  s["%a"] = Calendar.SHORT_DAY_NAMES[w]; // abbreviated weekday name [FIXME: I18N]
+  s["%A"] = Calendar.DAY_NAMES[w]; // full weekday name
+  s["%b"] = Calendar.SHORT_MONTH_NAMES[m]; // abbreviated month name [FIXME: I18N]
+  s["%B"] = Calendar.MONTH_NAMES[m]; // full month name
+  // FIXME: %c : preferred date and time representation for the current locale
+  s["%C"] = 1 + Math.floor(y / 100); // the century number
+  s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31)
+  s["%e"] = d; // the day of the month (range 1 to 31)
+  // FIXME: %D : american date style: %m/%d/%y
+  // FIXME: %E, %F, %G, %g, %h (man strftime)
+  s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format)
+  s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format)
+  s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366)
+  s["%k"] = hr;   // hour, range 0 to 23 (24h format)
+  s["%l"] = ir;   // hour, range 1 to 12 (12h format)
+  s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m); // month, range 01 to 12
+  s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59
+  s["%n"] = "\n";   // a newline character
+  s["%p"] = pm ? "PM" : "AM";
+  s["%P"] = pm ? "pm" : "am";
+  // FIXME: %r : the time in am/pm notation %I:%M:%S %p
+  // FIXME: %R : the time in 24-hour notation %H:%M
+  s["%s"] = Math.floor(this.getTime() / 1000);
+  s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59
+  s["%t"] = "\t";   // a tab character
+  // FIXME: %T : the time in 24-hour notation (%H:%M:%S)
+  s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn;
+  s["%u"] = w + 1;  // the day of the week (range 1 to 7, 1 = MON)
+  s["%w"] = w;    // the day of the week (range 0 to 6, 0 = SUN)
+  // FIXME: %x : preferred date representation for the current locale without the time
+  // FIXME: %X : preferred time representation for the current locale without the date
+  s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99)
+  s["%Y"] = y;    // year with the century
+  s["%%"] = "%";    // a literal '%' character
+
+  return str.gsub(/%./, function(match) { return s[match] || match });
+};
+
+Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear;
+Date.prototype.setFullYear = function(y) {
+  var d = new Date(this);
+  d.__msh_oldSetFullYear(y);
+  if (d.getMonth() != this.getMonth())
+    this.setDate(28);
+  this.__msh_oldSetFullYear(y);
+}
Index: /ether_2012/web/resources/js/etherClasses.js
===================================================================
--- /ether_2012/web/resources/js/etherClasses.js	(revision 319)
+++ /ether_2012/web/resources/js/etherClasses.js	(revision 319)
@@ -0,0 +1,187 @@
+/* ************************************************* */
+/* ****************** LIST ************************* */
+/* ************************************************* */
+var ListItem = Class.create({
+
+    initialize: function( plateforms, objectParameter )
+    {
+        this.array = $A();
+        $A(plateforms).each(function( jsonObject )
+        {
+            this.addItem(jsonObject, objectParameter);
+        }.bind(this));
+    },
+
+    addItem:function( jsonElement, objectParameter )
+    {
+        var divItem = false;
+
+        var objectItemNew = new Object();
+        objectItemNew.jsonElement = jsonElement;
+        objectItemNew.divItem = this.createItemDiv(objectItemNew.jsonElement, objectParameter);
+
+        this.array.push(objectItemNew);
+    },
+
+    createItemDiv: function( itemHash, objectParameter )
+    {
+        return new Plateform(itemHash, objectParameter);
+    },
+
+    addOpenListener : function( func )
+    {
+        this.array.each(function( objectItem )
+        {
+            objectItem.divItem.addOpenListener(func);
+        });
+    },
+
+    display : function( parentNode, idIfNoItem, textIfNoItem )
+    {
+        if( 0 >= this.array.size() )
+        {
+            var divNoItem = $(document.createElement("div"));
+            divNoItem.id = idIfNoItem;
+            divNoItem.textContent = textIfNoItem;
+            parentNode.appendChild(divNoItem);
+        }
+        else
+            this.array.each(function( item )
+            {
+                item.divItem.display(parentNode);
+            });
+    },
+
+    displayWithPairImpair : function( parentNode, idIfNoItem, textIfNoItem )
+    {
+    	Dom.clearContainer(parentNode);
+        if( 0 >= this.array.size() )
+        {
+            var divNoItem = $(document.createElement("div"));
+            divNoItem.id = idIfNoItem;
+            divNoItem.textContent = textIfNoItem;
+            parentNode.appendChild(divNoItem);
+        }
+        else
+        {
+        	var rowNumber = 0;
+            this.array.each(function( item )
+            {
+            	if(rowNumber % 2 == 0)
+                    item.divItem.display(parentNode,"pair");
+            	else
+                    item.divItem.display(parentNode,"impair");
+            	rowNumber++;
+            });
+        }
+    },
+
+    getItemById: function( itemId )
+    {
+        var returnObj = false;
+        this.array.each(function( objItem )
+        {
+            if( objItem.jsonElement.id == itemId )
+                returnObj = objItem;
+        }.bind(this));
+
+        return returnObj;
+    }
+
+});
+
+/* ************************************************* */
+/* ****************** ITEM ************************* */
+/* ************************************************* */
+var Item = Class.create({
+
+    initialize: function( jsonElement, objectParameter )
+    {
+        this.jsonElement = Object.clone(jsonElement); // Warning: This is only a shallow copy
+        this.listeners = $A();
+
+        // HACK: No deep copy in Javascript
+        if( objectParameter )
+        {
+            this.language = objectParameter.language || "fr";
+            if( objectParameter.currentTitleId )
+                this.currentTitleId = objectParameter.currentTitleId;
+            if( objectParameter.isExpiredTitle )
+                this.isExpiredTitle = objectParameter.isExpiredTitle;
+        }
+    },
+
+    getId : function()
+    {
+        return this.jsonElement.id;
+    },
+
+    getContentType: function()
+    {
+        return this.jsonElement.contentType;
+    },
+
+    createContainer: function ( containerName, classNameValue )
+    {
+        this.divContainer = $(document.createElement("div"));
+        this.divContainer.item = this;
+        if(classNameValue)
+        this.divContainer.className = classNameValue;
+        this.divContainer.id = containerName + "_" + this.jsonElement.id;
+    },
+
+    appendContainer: function ( parentNode )
+    {
+        this.parentNode = parentNode;
+        parentNode.appendChild(this.divContainer);
+    },
+
+    onClickContainer: function( event )
+    {
+        if( !event || (event.detail == undefined || 1 == event.detail) )
+            this.executeListenersFunction();
+    },
+
+    selectWithParameter: function( classNameValue )
+    {
+        if( classNameValue )
+            this.divContainer.addClassName(classNameValue);
+    },
+
+    unselectWithParameter: function( classNameValue )
+    {
+        if( classNameValue )
+            this.divContainer.removeClassName(classNameValue);
+    },
+
+    executeListenersFunction: function()
+    {
+        this.listeners.each(function ( func )
+        {
+            func(this);
+        }.bind(this));
+    },
+
+    addObservers: function ()
+    {
+        if( this.divContainer )
+            Event.observe(this.divContainer, 'click', this.onClickContainer.bindAsEventListener(this));
+    },
+
+    addOpenListener: function( func )
+    {
+        this.listeners.push(func);
+    },
+
+    addName: function ( classNameValue )
+    {
+        if( !this.divContainer )
+            return;
+
+        this.divName = $(document.createElement("div"));
+        this.divName.className = classNameValue;
+        this.divName.innerHTML = this.jsonElement.name;
+
+        this.divContainer.appendChild(this.divName);
+    }
+});
Index: /ether_2012/web/resources/js/etherHelper.js
===================================================================
--- /ether_2012/web/resources/js/etherHelper.js	(revision 319)
+++ /ether_2012/web/resources/js/etherHelper.js	(revision 319)
@@ -0,0 +1,15 @@
+///
+// Requires prototype and DomHelper.js
+
+function disableContainer(containerId)
+{
+	var container = Dom.getContainer(containerId);
+	container.addClassName("disable");
+}
+
+function enableContainer(containerId)
+{
+	var container = Dom.getContainer(containerId);
+	container.removeClassName("disable");
+}
+
Index: /ether_2012/web/resources/js/library/prototype/prototype.js
===================================================================
--- /ether_2012/web/resources/js/library/prototype/prototype.js	(revision 319)
+++ /ether_2012/web/resources/js/library/prototype/prototype.js	(revision 319)
@@ -0,0 +1,4320 @@
+/*  Prototype JavaScript framework, version 1.6.0.3
+ *  (c) 2005-2008 Sam Stephenson
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *  For details, see the Prototype web site: http://www.prototypejs.org/
+ *
+ *--------------------------------------------------------------------------*/
+
+var Prototype = {
+  Version: '1.6.0.3',
+
+  Browser: {
+    IE:     !!(window.attachEvent &&
+      navigator.userAgent.indexOf('Opera') === -1),
+    Opera:  navigator.userAgent.indexOf('Opera') > -1,
+    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
+    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 &&
+      navigator.userAgent.indexOf('KHTML') === -1,
+    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
+  },
+
+  BrowserFeatures: {
+    XPath: !!document.evaluate,
+    SelectorsAPI: !!document.querySelector,
+    ElementExtensions: !!window.HTMLElement,
+    SpecificElementExtensions:
+      document.createElement('div')['__proto__'] &&
+      document.createElement('div')['__proto__'] !==
+        document.createElement('form')['__proto__']
+  },
+
+  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
+  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
+
+  emptyFunction: function() { },
+  K: function(x) { return x }
+};
+
+if (Prototype.Browser.MobileSafari)
+  Prototype.BrowserFeatures.SpecificElementExtensions = false;
+
+
+/* Based on Alex Arnell's inheritance implementation. */
+var Class = {
+  create: function() {
+    var parent = null, properties = $A(arguments);
+    if (Object.isFunction(properties[0]))
+      parent = properties.shift();
+
+    function klass() {
+      this.initialize.apply(this, arguments);
+    }
+
+    Object.extend(klass, Class.Methods);
+    klass.superclass = parent;
+    klass.subclasses = [];
+
+    if (parent) {
+      var subclass = function() { };
+      subclass.prototype = parent.prototype;
+      klass.prototype = new subclass;
+      parent.subclasses.push(klass);
+    }
+
+    for (var i = 0; i < properties.length; i++)
+      klass.addMethods(properties[i]);
+
+    if (!klass.prototype.initialize)
+      klass.prototype.initialize = Prototype.emptyFunction;
+
+    klass.prototype.constructor = klass;
+
+    return klass;
+  }
+};
+
+Class.Methods = {
+  addMethods: function(source) {
+    var ancestor   = this.superclass && this.superclass.prototype;
+    var properties = Object.keys(source);
+
+    if (!Object.keys({ toString: true }).length)
+      properties.push("toString", "valueOf");
+
+    for (var i = 0, length = properties.length; i < length; i++) {
+      var property = properties[i], value = source[property];
+      if (ancestor && Object.isFunction(value) &&
+          value.argumentNames().first() == "$super") {
+        var method = value;
+        value = (function(m) {
+          return function() { return ancestor[m].apply(this, arguments) };
+        })(property).wrap(method);
+
+        value.valueOf = method.valueOf.bind(method);
+        value.toString = method.toString.bind(method);
+      }
+      this.prototype[property] = value;
+    }
+
+    return this;
+  }
+};
+
+var Abstract = { };
+
+Object.extend = function(destination, source) {
+  for (var property in source)
+    destination[property] = source[property];
+  return destination;
+};
+
+Object.extend(Object, {
+  inspect: function(object) {
+    try {
+      if (Object.isUndefined(object)) return 'undefined';
+      if (object === null) return 'null';
+      return object.inspect ? object.inspect() : String(object);
+    } catch (e) {
+      if (e instanceof RangeError) return '...';
+      throw e;
+    }
+  },
+
+  toJSON: function(object) {
+    var type = typeof object;
+    switch (type) {
+      case 'undefined':
+      case 'function':
+      case 'unknown': return;
+      case 'boolean': return object.toString();
+    }
+
+    if (object === null) return 'null';
+    if (object.toJSON) return object.toJSON();
+    if (Object.isElement(object)) return;
+
+    var results = [];
+    for (var property in object) {
+      var value = Object.toJSON(object[property]);
+      if (!Object.isUndefined(value))
+        results.push(property.toJSON() + ': ' + value);
+    }
+
+    return '{' + results.join(', ') + '}';
+  },
+
+  toQueryString: function(object) {
+    return $H(object).toQueryString();
+  },
+
+  toHTML: function(object) {
+    return object && object.toHTML ? object.toHTML() : String.interpret(object);
+  },
+
+  keys: function(object) {
+    var keys = [];
+    for (var property in object)
+      keys.push(property);
+    return keys;
+  },
+
+  values: function(object) {
+    var values = [];
+    for (var property in object)
+      values.push(object[property]);
+    return values;
+  },
+
+  clone: function(object) {
+    return Object.extend({ }, object);
+  },
+
+  isElement: function(object) {
+    return !!(object && object.nodeType == 1);
+  },
+
+  isArray: function(object) {
+    return object != null && typeof object == "object" &&
+      'splice' in object && 'join' in object;
+  },
+
+  isHash: function(object) {
+    return object instanceof Hash;
+  },
+
+  isFunction: function(object) {
+    return typeof object == "function";
+  },
+
+  isString: function(object) {
+    return typeof object == "string";
+  },
+
+  isNumber: function(object) {
+    return typeof object == "number";
+  },
+
+  isUndefined: function(object) {
+    return typeof object == "undefined";
+  }
+});
+
+Object.extend(Function.prototype, {
+  argumentNames: function() {
+    var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1]
+      .replace(/\s+/g, '').split(',');
+    return names.length == 1 && !names[0] ? [] : names;
+  },
+
+  bind: function() {
+    if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
+    var __method = this, args = $A(arguments), object = args.shift();
+    return function() {
+      return __method.apply(object, args.concat($A(arguments)));
+    }
+  },
+
+  bindAsEventListener: function() {
+    var __method = this, args = $A(arguments), object = args.shift();
+    return function(event) {
+      return __method.apply(object, [event || window.event].concat(args));
+    }
+  },
+
+  curry: function() {
+    if (!arguments.length) return this;
+    var __method = this, args = $A(arguments);
+    return function() {
+      return __method.apply(this, args.concat($A(arguments)));
+    }
+  },
+
+  delay: function() {
+    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
+    return window.setTimeout(function() {
+      return __method.apply(__method, args);
+    }, timeout);
+  },
+
+  defer: function() {
+    var args = [0.01].concat($A(arguments));
+    return this.delay.apply(this, args);
+  },
+
+  wrap: function(wrapper) {
+    var __method = this;
+    return function() {
+      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
+    }
+  },
+
+  methodize: function() {
+    if (this._methodized) return this._methodized;
+    var __method = this;
+    return this._methodized = function() {
+      return __method.apply(null, [this].concat($A(arguments)));
+    };
+  }
+});
+
+Date.prototype.toJSON = function() {
+  return '"' + this.getUTCFullYear() + '-' +
+    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
+    this.getUTCDate().toPaddedString(2) + 'T' +
+    this.getUTCHours().toPaddedString(2) + ':' +
+    this.getUTCMinutes().toPaddedString(2) + ':' +
+    this.getUTCSeconds().toPaddedString(2) + 'Z"';
+};
+
+var Try = {
+  these: function() {
+    var returnValue;
+
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      var lambda = arguments[i];
+      try {
+        returnValue = lambda();
+        break;
+      } catch (e) { }
+    }
+
+    return returnValue;
+  }
+};
+
+RegExp.prototype.match = RegExp.prototype.test;
+
+RegExp.escape = function(str) {
+  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+};
+
+/*--------------------------------------------------------------------------*/
+
+var PeriodicalExecuter = Class.create({
+  initialize: function(callback, frequency) {
+    this.callback = callback;
+    this.frequency = frequency;
+    this.currentlyExecuting = false;
+
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  execute: function() {
+    this.callback(this);
+  },
+
+  stop: function() {
+    if (!this.timer) return;
+    clearInterval(this.timer);
+    this.timer = null;
+  },
+
+  onTimerEvent: function() {
+    if (!this.currentlyExecuting) {
+      try {
+        this.currentlyExecuting = true;
+        this.execute();
+      } finally {
+        this.currentlyExecuting = false;
+      }
+    }
+  }
+});
+Object.extend(String, {
+  interpret: function(value) {
+    return value == null ? '' : String(value);
+  },
+  specialChar: {
+    '\b': '\\b',
+    '\t': '\\t',
+    '\n': '\\n',
+    '\f': '\\f',
+    '\r': '\\r',
+    '\\': '\\\\'
+  }
+});
+
+Object.extend(String.prototype, {
+  gsub: function(pattern, replacement) {
+    var result = '', source = this, match;
+    replacement = arguments.callee.prepareReplacement(replacement);
+
+    while (source.length > 0) {
+      if (match = source.match(pattern)) {
+        result += source.slice(0, match.index);
+        result += String.interpret(replacement(match));
+        source  = source.slice(match.index + match[0].length);
+      } else {
+        result += source, source = '';
+      }
+    }
+    return result;
+  },
+
+  sub: function(pattern, replacement, count) {
+    replacement = this.gsub.prepareReplacement(replacement);
+    count = Object.isUndefined(count) ? 1 : count;
+
+    return this.gsub(pattern, function(match) {
+      if (--count < 0) return match[0];
+      return replacement(match);
+    });
+  },
+
+  scan: function(pattern, iterator) {
+    this.gsub(pattern, iterator);
+    return String(this);
+  },
+
+  truncate: function(length, truncation) {
+    length = length || 30;
+    truncation = Object.isUndefined(truncation) ? '...' : truncation;
+    return this.length > length ?
+      this.slice(0, length - truncation.length) + truncation : String(this);
+  },
+
+  strip: function() {
+    return this.replace(/^\s+/, '').replace(/\s+$/, '');
+  },
+
+  stripTags: function() {
+    return this.replace(/<\/?[^>]+>/gi, '');
+  },
+
+  stripScripts: function() {
+    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
+  },
+
+  extractScripts: function() {
+    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
+    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
+    return (this.match(matchAll) || []).map(function(scriptTag) {
+      return (scriptTag.match(matchOne) || ['', ''])[1];
+    });
+  },
+
+  evalScripts: function() {
+    return this.extractScripts().map(function(script) { return eval(script) });
+  },
+
+  escapeHTML: function() {
+    var self = arguments.callee;
+    self.text.data = this;
+    return self.div.innerHTML;
+  },
+
+  unescapeHTML: function() {
+    var div = new Element('div');
+    div.innerHTML = this.stripTags();
+    return div.childNodes[0] ? (div.childNodes.length > 1 ?
+      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
+      div.childNodes[0].nodeValue) : '';
+  },
+
+  toQueryParams: function(separator) {
+    var match = this.strip().match(/([^?#]*)(#.*)?$/);
+    if (!match) return { };
+
+    return match[1].split(separator || '&').inject({ }, function(hash, pair) {
+      if ((pair = pair.split('='))[0]) {
+        var key = decodeURIComponent(pair.shift());
+        var value = pair.length > 1 ? pair.join('=') : pair[0];
+        if (value != undefined) value = decodeURIComponent(value);
+
+        if (key in hash) {
+          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
+          hash[key].push(value);
+        }
+        else hash[key] = value;
+      }
+      return hash;
+    });
+  },
+
+  toArray: function() {
+    return this.split('');
+  },
+
+  succ: function() {
+    return this.slice(0, this.length - 1) +
+      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
+  },
+
+  times: function(count) {
+    return count < 1 ? '' : new Array(count + 1).join(this);
+  },
+
+  camelize: function() {
+    var parts = this.split('-'), len = parts.length;
+    if (len == 1) return parts[0];
+
+    var camelized = this.charAt(0) == '-'
+      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
+      : parts[0];
+
+    for (var i = 1; i < len; i++)
+      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
+
+    return camelized;
+  },
+
+  capitalize: function() {
+    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
+  },
+
+  underscore: function() {
+    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
+  },
+
+  dasherize: function() {
+    return this.gsub(/_/,'-');
+  },
+
+  inspect: function(useDoubleQuotes) {
+    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
+      var character = String.specialChar[match[0]];
+      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
+    });
+    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
+    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+  },
+
+  toJSON: function() {
+    return this.inspect(true);
+  },
+
+  unfilterJSON: function(filter) {
+    return this.sub(filter || Prototype.JSONFilter, '#{1}');
+  },
+
+  isJSON: function() {
+    var str = this;
+    if (str.blank()) return false;
+    str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
+    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
+  },
+
+  evalJSON: function(sanitize) {
+    var json = this.unfilterJSON();
+    try {
+      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
+    } catch (e) { }
+    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
+  },
+
+  include: function(pattern) {
+    return this.indexOf(pattern) > -1;
+  },
+
+  startsWith: function(pattern) {
+    return this.indexOf(pattern) === 0;
+  },
+
+  endsWith: function(pattern) {
+    var d = this.length - pattern.length;
+    return d >= 0 && this.lastIndexOf(pattern) === d;
+  },
+
+  empty: function() {
+    return this == '';
+  },
+
+  blank: function() {
+    return /^\s*$/.test(this);
+  },
+
+  interpolate: function(object, pattern) {
+    return new Template(this, pattern).evaluate(object);
+  }
+});
+
+if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
+  escapeHTML: function() {
+    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+  },
+  unescapeHTML: function() {
+    return this.stripTags().replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
+  }
+});
+
+String.prototype.gsub.prepareReplacement = function(replacement) {
+  if (Object.isFunction(replacement)) return replacement;
+  var template = new Template(replacement);
+  return function(match) { return template.evaluate(match) };
+};
+
+String.prototype.parseQuery = String.prototype.toQueryParams;
+
+Object.extend(String.prototype.escapeHTML, {
+  div:  document.createElement('div'),
+  text: document.createTextNode('')
+});
+
+String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text);
+
+var Template = Class.create({
+  initialize: function(template, pattern) {
+    this.template = template.toString();
+    this.pattern = pattern || Template.Pattern;
+  },
+
+  evaluate: function(object) {
+    if (Object.isFunction(object.toTemplateReplacements))
+      object = object.toTemplateReplacements();
+
+    return this.template.gsub(this.pattern, function(match) {
+      if (object == null) return '';
+
+      var before = match[1] || '';
+      if (before == '\\') return match[2];
+
+      var ctx = object, expr = match[3];
+      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
+      match = pattern.exec(expr);
+      if (match == null) return before;
+
+      while (match != null) {
+        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
+        ctx = ctx[comp];
+        if (null == ctx || '' == match[3]) break;
+        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
+        match = pattern.exec(expr);
+      }
+
+      return before + String.interpret(ctx);
+    });
+  }
+});
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+
+var $break = { };
+
+var Enumerable = {
+  each: function(iterator, context) {
+    var index = 0;
+    try {
+      this._each(function(value) {
+        iterator.call(context, value, index++);
+      });
+    } catch (e) {
+      if (e != $break) throw e;
+    }
+    return this;
+  },
+
+  eachSlice: function(number, iterator, context) {
+    var index = -number, slices = [], array = this.toArray();
+    if (number < 1) return array;
+    while ((index += number) < array.length)
+      slices.push(array.slice(index, index+number));
+    return slices.collect(iterator, context);
+  },
+
+  all: function(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var result = true;
+    this.each(function(value, index) {
+      result = result && !!iterator.call(context, value, index);
+      if (!result) throw $break;
+    });
+    return result;
+  },
+
+  any: function(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var result = false;
+    this.each(function(value, index) {
+      if (result = !!iterator.call(context, value, index))
+        throw $break;
+    });
+    return result;
+  },
+
+  collect: function(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var results = [];
+    this.each(function(value, index) {
+      results.push(iterator.call(context, value, index));
+    });
+    return results;
+  },
+
+  detect: function(iterator, context) {
+    var result;
+    this.each(function(value, index) {
+      if (iterator.call(context, value, index)) {
+        result = value;
+        throw $break;
+      }
+    });
+    return result;
+  },
+
+  findAll: function(iterator, context) {
+    var results = [];
+    this.each(function(value, index) {
+      if (iterator.call(context, value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  grep: function(filter, iterator, context) {
+    iterator = iterator || Prototype.K;
+    var results = [];
+
+    if (Object.isString(filter))
+      filter = new RegExp(filter);
+
+    this.each(function(value, index) {
+      if (filter.match(value))
+        results.push(iterator.call(context, value, index));
+    });
+    return results;
+  },
+
+  include: function(object) {
+    if (Object.isFunction(this.indexOf))
+      if (this.indexOf(object) != -1) return true;
+
+    var found = false;
+    this.each(function(value) {
+      if (value == object) {
+        found = true;
+        throw $break;
+      }
+    });
+    return found;
+  },
+
+  inGroupsOf: function(number, fillWith) {
+    fillWith = Object.isUndefined(fillWith) ? null : fillWith;
+    return this.eachSlice(number, function(slice) {
+      while(slice.length < number) slice.push(fillWith);
+      return slice;
+    });
+  },
+
+  inject: function(memo, iterator, context) {
+    this.each(function(value, index) {
+      memo = iterator.call(context, memo, value, index);
+    });
+    return memo;
+  },
+
+  invoke: function(method) {
+    var args = $A(arguments).slice(1);
+    return this.map(function(value) {
+      return value[method].apply(value, args);
+    });
+  },
+
+  max: function(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var result;
+    this.each(function(value, index) {
+      value = iterator.call(context, value, index);
+      if (result == null || value >= result)
+        result = value;
+    });
+    return result;
+  },
+
+  min: function(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var result;
+    this.each(function(value, index) {
+      value = iterator.call(context, value, index);
+      if (result == null || value < result)
+        result = value;
+    });
+    return result;
+  },
+
+  partition: function(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var trues = [], falses = [];
+    this.each(function(value, index) {
+      (iterator.call(context, value, index) ?
+        trues : falses).push(value);
+    });
+    return [trues, falses];
+  },
+
+  pluck: function(property) {
+    var results = [];
+    this.each(function(value) {
+      results.push(value[property]);
+    });
+    return results;
+  },
+
+  reject: function(iterator, context) {
+    var results = [];
+    this.each(function(value, index) {
+      if (!iterator.call(context, value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  sortBy: function(iterator, context) {
+    return this.map(function(value, index) {
+      return {
+        value: value,
+        criteria: iterator.call(context, value, index)
+      };
+    }).sort(function(left, right) {
+      var a = left.criteria, b = right.criteria;
+      return a < b ? -1 : a > b ? 1 : 0;
+    }).pluck('value');
+  },
+
+  toArray: function() {
+    return this.map();
+  },
+
+  zip: function() {
+    var iterator = Prototype.K, args = $A(arguments);
+    if (Object.isFunction(args.last()))
+      iterator = args.pop();
+
+    var collections = [this].concat(args).map($A);
+    return this.map(function(value, index) {
+      return iterator(collections.pluck(index));
+    });
+  },
+
+  size: function() {
+    return this.toArray().length;
+  },
+
+  inspect: function() {
+    return '#<Enumerable:' + this.toArray().inspect() + '>';
+  }
+};
+
+Object.extend(Enumerable, {
+  map:     Enumerable.collect,
+  find:    Enumerable.detect,
+  select:  Enumerable.findAll,
+  filter:  Enumerable.findAll,
+  member:  Enumerable.include,
+  entries: Enumerable.toArray,
+  every:   Enumerable.all,
+  some:    Enumerable.any
+});
+function $A(iterable) {
+  if (!iterable) return [];
+  if (iterable.toArray) return iterable.toArray();
+  var length = iterable.length || 0, results = new Array(length);
+  while (length--) results[length] = iterable[length];
+  return results;
+}
+
+if (Prototype.Browser.WebKit) {
+  $A = function(iterable) {
+    if (!iterable) return [];
+    // In Safari, only use the `toArray` method if it's not a NodeList.
+    // A NodeList is a function, has an function `item` property, and a numeric
+    // `length` property. Adapted from Google Doctype.
+    if (!(typeof iterable === 'function' && typeof iterable.length ===
+        'number' && typeof iterable.item === 'function') && iterable.toArray)
+      return iterable.toArray();
+    var length = iterable.length || 0, results = new Array(length);
+    while (length--) results[length] = iterable[length];
+    return results;
+  };
+}
+
+Array.from = $A;
+
+Object.extend(Array.prototype, Enumerable);
+
+if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;
+
+Object.extend(Array.prototype, {
+  _each: function(iterator) {
+    for (var i = 0, length = this.length; i < length; i++)
+      iterator(this[i]);
+  },
+
+  clear: function() {
+    this.length = 0;
+    return this;
+  },
+
+  first: function() {
+    return this[0];
+  },
+
+  last: function() {
+    return this[this.length - 1];
+  },
+
+  compact: function() {
+    return this.select(function(value) {
+      return value != null;
+    });
+  },
+
+  flatten: function() {
+    return this.inject([], function(array, value) {
+      return array.concat(Object.isArray(value) ?
+        value.flatten() : [value]);
+    });
+  },
+
+  without: function() {
+    var values = $A(arguments);
+    return this.select(function(value) {
+      return !values.include(value);
+    });
+  },
+
+  reverse: function(inline) {
+    return (inline !== false ? this : this.toArray())._reverse();
+  },
+
+  reduce: function() {
+    return this.length > 1 ? this : this[0];
+  },
+
+  uniq: function(sorted) {
+    return this.inject([], function(array, value, index) {
+      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
+        array.push(value);
+      return array;
+    });
+  },
+
+  intersect: function(array) {
+    return this.uniq().findAll(function(item) {
+      return array.detect(function(value) { return item === value });
+    });
+  },
+
+  clone: function() {
+    return [].concat(this);
+  },
+
+  size: function() {
+    return this.length;
+  },
+
+  inspect: function() {
+    return '[' + this.map(Object.inspect).join(', ') + ']';
+  },
+
+  toJSON: function() {
+    var results = [];
+    this.each(function(object) {
+      var value = Object.toJSON(object);
+      if (!Object.isUndefined(value)) results.push(value);
+    });
+    return '[' + results.join(', ') + ']';
+  }
+});
+
+// use native browser JS 1.6 implementation if available
+if (Object.isFunction(Array.prototype.forEach))
+  Array.prototype._each = Array.prototype.forEach;
+
+if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
+  i || (i = 0);
+  var length = this.length;
+  if (i < 0) i = length + i;
+  for (; i < length; i++)
+    if (this[i] === item) return i;
+  return -1;
+};
+
+if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
+  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
+  var n = this.slice(0, i).reverse().indexOf(item);
+  return (n < 0) ? n : i - n - 1;
+};
+
+Array.prototype.toArray = Array.prototype.clone;
+
+function $w(string) {
+  if (!Object.isString(string)) return [];
+  string = string.strip();
+  return string ? string.split(/\s+/) : [];
+}
+
+if (Prototype.Browser.Opera){
+  Array.prototype.concat = function() {
+    var array = [];
+    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      if (Object.isArray(arguments[i])) {
+        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
+          array.push(arguments[i][j]);
+      } else {
+        array.push(arguments[i]);
+      }
+    }
+    return array;
+  };
+}
+Object.extend(Number.prototype, {
+  toColorPart: function() {
+    return this.toPaddedString(2, 16);
+  },
+
+  succ: function() {
+    return this + 1;
+  },
+
+  times: function(iterator, context) {
+    $R(0, this, true).each(iterator, context);
+    return this;
+  },
+
+  toPaddedString: function(length, radix) {
+    var string = this.toString(radix || 10);
+    return '0'.times(length - string.length) + string;
+  },
+
+  toJSON: function() {
+    return isFinite(this) ? this.toString() : 'null';
+  }
+});
+
+$w('abs round ceil floor').each(function(method){
+  Number.prototype[method] = Math[method].methodize();
+});
+function $H(object) {
+  return new Hash(object);
+};
+
+var Hash = Class.create(Enumerable, (function() {
+
+  function toQueryPair(key, value) {
+    if (Object.isUndefined(value)) return key;
+    return key + '=' + encodeURIComponent(String.interpret(value));
+  }
+
+  return {
+    initialize: function(object) {
+      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
+    },
+
+    _each: function(iterator) {
+      for (var key in this._object) {
+        var value = this._object[key], pair = [key, value];
+        pair.key = key;
+        pair.value = value;
+        iterator(pair);
+      }
+    },
+
+    set: function(key, value) {
+      return this._object[key] = value;
+    },
+
+    get: function(key) {
+      // simulating poorly supported hasOwnProperty
+      if (this._object[key] !== Object.prototype[key])
+        return this._object[key];
+    },
+
+    unset: function(key) {
+      var value = this._object[key];
+      delete this._object[key];
+      return value;
+    },
+
+    toObject: function() {
+      return Object.clone(this._object);
+    },
+
+    keys: function() {
+      return this.pluck('key');
+    },
+
+    values: function() {
+      return this.pluck('value');
+    },
+
+    index: function(value) {
+      var match = this.detect(function(pair) {
+        return pair.value === value;
+      });
+      return match && match.key;
+    },
+
+    merge: function(object) {
+      return this.clone().update(object);
+    },
+
+    update: function(object) {
+      return new Hash(object).inject(this, function(result, pair) {
+        result.set(pair.key, pair.value);
+        return result;
+      });
+    },
+
+    toQueryString: function() {
+      return this.inject([], function(results, pair) {
+        var key = encodeURIComponent(pair.key), values = pair.value;
+
+        if (values && typeof values == 'object') {
+          if (Object.isArray(values))
+            return results.concat(values.map(toQueryPair.curry(key)));
+        } else results.push(toQueryPair(key, values));
+        return results;
+      }).join('&');
+    },
+
+    inspect: function() {
+      return '#<Hash:{' + this.map(function(pair) {
+        return pair.map(Object.inspect).join(': ');
+      }).join(', ') + '}>';
+    },
+
+    toJSON: function() {
+      return Object.toJSON(this.toObject());
+    },
+
+    clone: function() {
+      return new Hash(this);
+    }
+  }
+})());
+
+Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
+Hash.from = $H;
+var ObjectRange = Class.create(Enumerable, {
+  initialize: function(start, end, exclusive) {
+    this.start = start;
+    this.end = end;
+    this.exclusive = exclusive;
+  },
+
+  _each: function(iterator) {
+    var value = this.start;
+    while (this.include(value)) {
+      iterator(value);
+      value = value.succ();
+    }
+  },
+
+  include: function(value) {
+    if (value < this.start)
+      return false;
+    if (this.exclusive)
+      return value < this.end;
+    return value <= this.end;
+  }
+});
+
+var $R = function(start, end, exclusive) {
+  return new ObjectRange(start, end, exclusive);
+};
+
+var Ajax = {
+  getTransport: function() {
+    return Try.these(
+      function() {return new XMLHttpRequest()},
+      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
+    ) || false;
+  },
+
+  activeRequestCount: 0
+};
+
+Ajax.Responders = {
+  responders: [],
+
+  _each: function(iterator) {
+    this.responders._each(iterator);
+  },
+
+  register: function(responder) {
+    if (!this.include(responder))
+      this.responders.push(responder);
+  },
+
+  unregister: function(responder) {
+    this.responders = this.responders.without(responder);
+  },
+
+  dispatch: function(callback, request, transport, json) {
+    this.each(function(responder) {
+      if (Object.isFunction(responder[callback])) {
+        try {
+          responder[callback].apply(responder, [request, transport, json]);
+        } catch (e) { }
+      }
+    });
+  }
+};
+
+Object.extend(Ajax.Responders, Enumerable);
+
+Ajax.Responders.register({
+  onCreate:   function() { Ajax.activeRequestCount++ },
+  onComplete: function() { Ajax.activeRequestCount-- }
+});
+
+Ajax.Base = Class.create({
+  initialize: function(options) {
+    this.options = {
+      method:       'post',
+      asynchronous: true,
+      contentType:  'application/x-www-form-urlencoded',
+      encoding:     'UTF-8',
+      parameters:   '',
+      evalJSON:     true,
+      evalJS:       true
+    };
+    Object.extend(this.options, options || { });
+
+    this.options.method = this.options.method.toLowerCase();
+
+    if (Object.isString(this.options.parameters))
+      this.options.parameters = this.options.parameters.toQueryParams();
+    else if (Object.isHash(this.options.parameters))
+      this.options.parameters = this.options.parameters.toObject();
+  }
+});
+
+Ajax.Request = Class.create(Ajax.Base, {
+  _complete: false,
+
+  initialize: function($super, url, options) {
+    $super(options);
+    this.transport = Ajax.getTransport();
+    this.request(url);
+  },
+
+  request: function(url) {
+    this.url = url;
+    this.method = this.options.method;
+    var params = Object.clone(this.options.parameters);
+
+    if (!['get', 'post'].include(this.method)) {
+      // simulate other verbs over post
+      params['_method'] = this.method;
+      this.method = 'post';
+    }
+
+    this.parameters = params;
+
+    if (params = Object.toQueryString(params)) {
+      // when GET, append parameters to URL
+      if (this.method == 'get')
+        this.url += (this.url.include('?') ? '&' : '?') + params;
+      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
+        params += '&_=';
+    }
+
+    try {
+      var response = new Ajax.Response(this);
+      if (this.options.onCreate) this.options.onCreate(response);
+      Ajax.Responders.dispatch('onCreate', this, response);
+
+      this.transport.open(this.method.toUpperCase(), this.url,
+        this.options.asynchronous);
+
+      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
+
+      this.transport.onreadystatechange = this.onStateChange.bind(this);
+      this.setRequestHeaders();
+
+      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
+      this.transport.send(this.body);
+
+      /* Force Firefox to handle ready state 4 for synchronous requests */
+      if (!this.options.asynchronous && this.transport.overrideMimeType)
+        this.onStateChange();
+
+    }
+    catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  onStateChange: function() {
+    var readyState = this.transport.readyState;
+    if (readyState > 1 && !((readyState == 4) && this._complete))
+      this.respondToReadyState(this.transport.readyState);
+  },
+
+  setRequestHeaders: function() {
+    var headers = {
+      'X-Requested-With': 'XMLHttpRequest',
+      'X-Prototype-Version': Prototype.Version,
+      'Accept': 'text/javascript, text/html, application/com.medias.xml, text/com.medias.xml, */*'
+    };
+
+    if (this.method == 'post') {
+      headers['Content-type'] = this.options.contentType +
+        (this.options.encoding ? '; charset=' + this.options.encoding : '');
+
+      /* Force "Connection: close" for older Mozilla browsers to work
+       * around a bug where XMLHttpRequest sends an incorrect
+       * Content-length header. See Mozilla Bugzilla #246651.
+       */
+      if (this.transport.overrideMimeType &&
+          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
+            headers['Connection'] = 'close';
+    }
+
+    // user-defined headers
+    if (typeof this.options.requestHeaders == 'object') {
+      var extras = this.options.requestHeaders;
+
+      if (Object.isFunction(extras.push))
+        for (var i = 0, length = extras.length; i < length; i += 2)
+          headers[extras[i]] = extras[i+1];
+      else
+        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
+    }
+
+    for (var name in headers)
+      this.transport.setRequestHeader(name, headers[name]);
+  },
+
+  success: function() {
+    var status = this.getStatus();
+    return !status || (status >= 200 && status < 300);
+  },
+
+  getStatus: function() {
+    try {
+      return this.transport.status || 0;
+    } catch (e) { return 0 }
+  },
+
+  respondToReadyState: function(readyState) {
+    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
+
+    if (state == 'Complete') {
+      try {
+        this._complete = true;
+        (this.options['on' + response.status]
+         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
+         || Prototype.emptyFunction)(response, response.headerJSON);
+      } catch (e) {
+        this.dispatchException(e);
+      }
+
+      var contentType = response.getHeader('Content-type');
+      if (this.options.evalJS == 'force'
+          || (this.options.evalJS && this.isSameOrigin() && contentType
+          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
+        this.evalResponse();
+    }
+
+    try {
+      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
+      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+
+    if (state == 'Complete') {
+      // avoid memory leak in MSIE: clean up
+      this.transport.onreadystatechange = Prototype.emptyFunction;
+    }
+  },
+
+  isSameOrigin: function() {
+    var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
+    return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
+      protocol: location.protocol,
+      domain: document.domain,
+      port: location.port ? ':' + location.port : ''
+    }));
+  },
+
+  getHeader: function(name) {
+    try {
+      return this.transport.getResponseHeader(name) || null;
+    } catch (e) { return null }
+  },
+
+  evalResponse: function() {
+    try {
+      return (this.transport.responseText || '').unfilterJSON().evalJSON();
+    } catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  dispatchException: function(exception) {
+    (this.options.onException || Prototype.emptyFunction)(this, exception);
+    Ajax.Responders.dispatch('onException', this, exception);
+  }
+});
+
+Ajax.Request.Events =
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Response = Class.create({
+  initialize: function(request){
+    this.request = request;
+    var transport  = this.transport  = request.transport,
+        readyState = this.readyState = transport.readyState;
+
+    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
+      this.status       = this.getStatus();
+      this.statusText   = this.getStatusText();
+      this.responseText = String.interpret(transport.responseText);
+      this.headerJSON   = this._getHeaderJSON();
+    }
+
+    if(readyState == 4) {
+      var xml = transport.responseXML;
+      this.responseXML  = Object.isUndefined(xml) ? null : xml;
+      this.responseJSON = this._getResponseJSON();
+    }
+  },
+
+  status:      0,
+  statusText: '',
+
+  getStatus: Ajax.Request.prototype.getStatus,
+
+  getStatusText: function() {
+    try {
+      return this.transport.statusText || '';
+    } catch (e) { return '' }
+  },
+
+  getHeader: Ajax.Request.prototype.getHeader,
+
+  getAllHeaders: function() {
+    try {
+      return this.getAllResponseHeaders();
+    } catch (e) { return null }
+  },
+
+  getResponseHeader: function(name) {
+    return this.transport.getResponseHeader(name);
+  },
+
+  getAllResponseHeaders: function() {
+    return this.transport.getAllResponseHeaders();
+  },
+
+  _getHeaderJSON: function() {
+    var json = this.getHeader('X-JSON');
+    if (!json) return null;
+    json = decodeURIComponent(escape(json));
+    try {
+      return json.evalJSON(this.request.options.sanitizeJSON ||
+        !this.request.isSameOrigin());
+    } catch (e) {
+      this.request.dispatchException(e);
+    }
+  },
+
+  _getResponseJSON: function() {
+    var options = this.request.options;
+    if (!options.evalJSON || (options.evalJSON != 'force' &&
+      !(this.getHeader('Content-type') || '').include('application/json')) ||
+        this.responseText.blank())
+          return null;
+    try {
+      return this.responseText.evalJSON(options.sanitizeJSON ||
+        !this.request.isSameOrigin());
+    } catch (e) {
+      this.request.dispatchException(e);
+    }
+  }
+});
+
+Ajax.Updater = Class.create(Ajax.Request, {
+  initialize: function($super, container, url, options) {
+    this.container = {
+      success: (container.success || container),
+      failure: (container.failure || (container.success ? null : container))
+    };
+
+    options = Object.clone(options);
+    var onComplete = options.onComplete;
+    options.onComplete = (function(response, json) {
+      this.updateContent(response.responseText);
+      if (Object.isFunction(onComplete)) onComplete(response, json);
+    }).bind(this);
+
+    $super(url, options);
+  },
+
+  updateContent: function(responseText) {
+    var receiver = this.container[this.success() ? 'success' : 'failure'],
+        options = this.options;
+
+    if (!options.evalScripts) responseText = responseText.stripScripts();
+
+    if (receiver = $(receiver)) {
+      if (options.insertion) {
+        if (Object.isString(options.insertion)) {
+          var insertion = { }; insertion[options.insertion] = responseText;
+          receiver.insert(insertion);
+        }
+        else options.insertion(receiver, responseText);
+      }
+      else receiver.update(responseText);
+    }
+  }
+});
+
+Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
+  initialize: function($super, container, url, options) {
+    $super(options);
+    this.onComplete = this.options.onComplete;
+
+    this.frequency = (this.options.frequency || 2);
+    this.decay = (this.options.decay || 1);
+
+    this.updater = { };
+    this.container = container;
+    this.url = url;
+
+    this.start();
+  },
+
+  start: function() {
+    this.options.onComplete = this.updateComplete.bind(this);
+    this.onTimerEvent();
+  },
+
+  stop: function() {
+    this.updater.options.onComplete = undefined;
+    clearTimeout(this.timer);
+    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
+  },
+
+  updateComplete: function(response) {
+    if (this.options.decay) {
+      this.decay = (response.responseText == this.lastText ?
+        this.decay * this.options.decay : 1);
+
+      this.lastText = response.responseText;
+    }
+    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
+  },
+
+  onTimerEvent: function() {
+    this.updater = new Ajax.Updater(this.container, this.url, this.options);
+  }
+});
+function $(element) {
+  if (arguments.length > 1) {
+    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
+      elements.push($(arguments[i]));
+    return elements;
+  }
+  if (Object.isString(element))
+    element = document.getElementById(element);
+  return Element.extend(element);
+}
+
+if (Prototype.BrowserFeatures.XPath) {
+  document._getElementsByXPath = function(expression, parentElement) {
+    var results = [];
+    var query = document.evaluate(expression, $(parentElement) || document,
+      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    for (var i = 0, length = query.snapshotLength; i < length; i++)
+      results.push(Element.extend(query.snapshotItem(i)));
+    return results;
+  };
+}
+
+/*--------------------------------------------------------------------------*/
+
+if (!window.Node) var Node = { };
+
+if (!Node.ELEMENT_NODE) {
+  // DOM level 2 ECMAScript Language Binding
+  Object.extend(Node, {
+    ELEMENT_NODE: 1,
+    ATTRIBUTE_NODE: 2,
+    TEXT_NODE: 3,
+    CDATA_SECTION_NODE: 4,
+    ENTITY_REFERENCE_NODE: 5,
+    ENTITY_NODE: 6,
+    PROCESSING_INSTRUCTION_NODE: 7,
+    COMMENT_NODE: 8,
+    DOCUMENT_NODE: 9,
+    DOCUMENT_TYPE_NODE: 10,
+    DOCUMENT_FRAGMENT_NODE: 11,
+    NOTATION_NODE: 12
+  });
+}
+
+(function() {
+  var element = this.Element;
+  this.Element = function(tagName, attributes) {
+    attributes = attributes || { };
+    tagName = tagName.toLowerCase();
+    var cache = Element.cache;
+    if (Prototype.Browser.IE && attributes.name) {
+      tagName = '<' + tagName + ' name="' + attributes.name + '">';
+      delete attributes.name;
+      return Element.writeAttribute(document.createElement(tagName), attributes);
+    }
+    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
+    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
+  };
+  Object.extend(this.Element, element || { });
+  if (element) this.Element.prototype = element.prototype;
+}).call(window);
+
+Element.cache = { };
+
+Element.Methods = {
+  visible: function(element) {
+    return $(element).style.display != 'none';
+  },
+
+  toggle: function(element) {
+    element = $(element);
+    Element[Element.visible(element) ? 'hide' : 'show'](element);
+    return element;
+  },
+
+  hide: function(element) {
+    element = $(element);
+    element.style.display = 'none';
+    return element;
+  },
+
+  show: function(element) {
+    element = $(element);
+    element.style.display = '';
+    return element;
+  },
+
+  remove: function(element) {
+    element = $(element);
+    element.parentNode.removeChild(element);
+    return element;
+  },
+
+  update: function(element, content) {
+    element = $(element);
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) return element.update().insert(content);
+    content = Object.toHTML(content);
+    element.innerHTML = content.stripScripts();
+    content.evalScripts.bind(content).defer();
+    return element;
+  },
+
+  replace: function(element, content) {
+    element = $(element);
+    if (content && content.toElement) content = content.toElement();
+    else if (!Object.isElement(content)) {
+      content = Object.toHTML(content);
+      var range = element.ownerDocument.createRange();
+      range.selectNode(element);
+      content.evalScripts.bind(content).defer();
+      content = range.createContextualFragment(content.stripScripts());
+    }
+    element.parentNode.replaceChild(content, element);
+    return element;
+  },
+
+  insert: function(element, insertions) {
+    element = $(element);
+
+    if (Object.isString(insertions) || Object.isNumber(insertions) ||
+        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
+          insertions = {bottom:insertions};
+
+    var content, insert, tagName, childNodes;
+
+    for (var position in insertions) {
+      content  = insertions[position];
+      position = position.toLowerCase();
+      insert = Element._insertionTranslations[position];
+
+      if (content && content.toElement) content = content.toElement();
+      if (Object.isElement(content)) {
+        insert(element, content);
+        continue;
+      }
+
+      content = Object.toHTML(content);
+
+      tagName = ((position == 'before' || position == 'after')
+        ? element.parentNode : element).tagName.toUpperCase();
+
+      childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+
+      if (position == 'top' || position == 'after') childNodes.reverse();
+      childNodes.each(insert.curry(element));
+
+      content.evalScripts.bind(content).defer();
+    }
+
+    return element;
+  },
+
+  wrap: function(element, wrapper, attributes) {
+    element = $(element);
+    if (Object.isElement(wrapper))
+      $(wrapper).writeAttribute(attributes || { });
+    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
+    else wrapper = new Element('div', wrapper);
+    if (element.parentNode)
+      element.parentNode.replaceChild(wrapper, element);
+    wrapper.appendChild(element);
+    return wrapper;
+  },
+
+  inspect: function(element) {
+    element = $(element);
+    var result = '<' + element.tagName.toLowerCase();
+    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
+      var property = pair.first(), attribute = pair.last();
+      var value = (element[property] || '').toString();
+      if (value) result += ' ' + attribute + '=' + value.inspect(true);
+    });
+    return result + '>';
+  },
+
+  recursivelyCollect: function(element, property) {
+    element = $(element);
+    var elements = [];
+    while (element = element[property])
+      if (element.nodeType == 1)
+        elements.push(Element.extend(element));
+    return elements;
+  },
+
+  ancestors: function(element) {
+    return $(element).recursivelyCollect('parentNode');
+  },
+
+  descendants: function(element) {
+    return $(element).select("*");
+  },
+
+  firstDescendant: function(element) {
+    element = $(element).firstChild;
+    while (element && element.nodeType != 1) element = element.nextSibling;
+    return $(element);
+  },
+
+  immediateDescendants: function(element) {
+    if (!(element = $(element).firstChild)) return [];
+    while (element && element.nodeType != 1) element = element.nextSibling;
+    if (element) return [element].concat($(element).nextSiblings());
+    return [];
+  },
+
+  previousSiblings: function(element) {
+    return $(element).recursivelyCollect('previousSibling');
+  },
+
+  nextSiblings: function(element) {
+    return $(element).recursivelyCollect('nextSibling');
+  },
+
+  siblings: function(element) {
+    element = $(element);
+    return element.previousSiblings().reverse().concat(element.nextSiblings());
+  },
+
+  match: function(element, selector) {
+    if (Object.isString(selector))
+      selector = new Selector(selector);
+    return selector.match($(element));
+  },
+
+  up: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return $(element.parentNode);
+    var ancestors = element.ancestors();
+    return Object.isNumber(expression) ? ancestors[expression] :
+      Selector.findElement(ancestors, expression, index);
+  },
+
+  down: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return element.firstDescendant();
+    return Object.isNumber(expression) ? element.descendants()[expression] :
+      Element.select(element, expression)[index || 0];
+  },
+
+  previous: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
+    var previousSiblings = element.previousSiblings();
+    return Object.isNumber(expression) ? previousSiblings[expression] :
+      Selector.findElement(previousSiblings, expression, index);
+  },
+
+  next: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
+    var nextSiblings = element.nextSiblings();
+    return Object.isNumber(expression) ? nextSiblings[expression] :
+      Selector.findElement(nextSiblings, expression, index);
+  },
+
+  select: function() {
+    var args = $A(arguments), element = $(args.shift());
+    return Selector.findChildElements(element, args);
+  },
+
+  adjacent: function() {
+    var args = $A(arguments), element = $(args.shift());
+    return Selector.findChildElements(element.parentNode, args).without(element);
+  },
+
+  identify: function(element) {
+    element = $(element);
+    var id = element.readAttribute('id'), self = arguments.callee;
+    if (id) return id;
+    do { id = 'anonymous_element_' + self.counter++ } while ($(id));
+    element.writeAttribute('id', id);
+    return id;
+  },
+
+  readAttribute: function(element, name) {
+    element = $(element);
+    if (Prototype.Browser.IE) {
+      var t = Element._attributeTranslations.read;
+      if (t.values[name]) return t.values[name](element, name);
+      if (t.names[name]) name = t.names[name];
+      if (name.include(':')) {
+        return (!element.attributes || !element.attributes[name]) ? null :
+         element.attributes[name].value;
+      }
+    }
+    return element.getAttribute(name);
+  },
+
+  writeAttribute: function(element, name, value) {
+    element = $(element);
+    var attributes = { }, t = Element._attributeTranslations.write;
+
+    if (typeof name == 'object') attributes = name;
+    else attributes[name] = Object.isUndefined(value) ? true : value;
+
+    for (var attr in attributes) {
+      name = t.names[attr] || attr;
+      value = attributes[attr];
+      if (t.values[attr]) name = t.values[attr](element, value);
+      if (value === false || value === null)
+        element.removeAttribute(name);
+      else if (value === true)
+        element.setAttribute(name, name);
+      else element.setAttribute(name, value);
+    }
+    return element;
+  },
+
+  getHeight: function(element) {
+    return $(element).getDimensions().height;
+  },
+
+  getWidth: function(element) {
+    return $(element).getDimensions().width;
+  },
+
+  classNames: function(element) {
+    return new Element.ClassNames(element);
+  },
+
+  hasClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    var elementClassName = element.className;
+    return (elementClassName.length > 0 && (elementClassName == className ||
+      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
+  },
+
+  addClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    if (!element.hasClassName(className))
+      element.className += (element.className ? ' ' : '') + className;
+    return element;
+  },
+
+  removeClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    element.className = element.className.replace(
+      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
+    return element;
+  },
+
+  toggleClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    return element[element.hasClassName(className) ?
+      'removeClassName' : 'addClassName'](className);
+  },
+
+  // removes whitespace-only text node children
+  cleanWhitespace: function(element) {
+    element = $(element);
+    var node = element.firstChild;
+    while (node) {
+      var nextNode = node.nextSibling;
+      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+        element.removeChild(node);
+      node = nextNode;
+    }
+    return element;
+  },
+
+  empty: function(element) {
+    return $(element).innerHTML.blank();
+  },
+
+  descendantOf: function(element, ancestor) {
+    element = $(element), ancestor = $(ancestor);
+
+    if (element.compareDocumentPosition)
+      return (element.compareDocumentPosition(ancestor) & 8) === 8;
+
+    if (ancestor.contains)
+      return ancestor.contains(element) && ancestor !== element;
+
+    while (element = element.parentNode)
+      if (element == ancestor) return true;
+
+    return false;
+  },
+
+  scrollTo: function(element) {
+    element = $(element);
+    var pos = element.cumulativeOffset();
+    window.scrollTo(pos[0], pos[1]);
+    return element;
+  },
+
+  getStyle: function(element, style) {
+    element = $(element);
+    style = style == 'float' ? 'cssFloat' : style.camelize();
+    var value = element.style[style];
+    if (!value || value == 'auto') {
+      var css = document.defaultView.getComputedStyle(element, null);
+      value = css ? css[style] : null;
+    }
+    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
+    return value == 'auto' ? null : value;
+  },
+
+  getOpacity: function(element) {
+    return $(element).getStyle('opacity');
+  },
+
+  setStyle: function(element, styles) {
+    element = $(element);
+    var elementStyle = element.style, match;
+    if (Object.isString(styles)) {
+      element.style.cssText += ';' + styles;
+      return styles.include('opacity') ?
+        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
+    }
+    for (var property in styles)
+      if (property == 'opacity') element.setOpacity(styles[property]);
+      else
+        elementStyle[(property == 'float' || property == 'cssFloat') ?
+          (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
+            property] = styles[property];
+
+    return element;
+  },
+
+  setOpacity: function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1 || value === '') ? '' :
+      (value < 0.00001) ? 0 : value;
+    return element;
+  },
+
+  getDimensions: function(element) {
+    element = $(element);
+    var display = element.getStyle('display');
+    if (display != 'none' && display != null) // Safari bug
+      return {width: element.offsetWidth, height: element.offsetHeight};
+
+    // All *Width and *Height properties give 0 on elements with display none,
+    // so enable the element temporarily
+    var els = element.style;
+    var originalVisibility = els.visibility;
+    var originalPosition = els.position;
+    var originalDisplay = els.display;
+    els.visibility = 'hidden';
+    els.position = 'absolute';
+    els.display = 'block';
+    var originalWidth = element.clientWidth;
+    var originalHeight = element.clientHeight;
+    els.display = originalDisplay;
+    els.position = originalPosition;
+    els.visibility = originalVisibility;
+    return {width: originalWidth, height: originalHeight};
+  },
+
+  makePositioned: function(element) {
+    element = $(element);
+    var pos = Element.getStyle(element, 'position');
+    if (pos == 'static' || !pos) {
+      element._madePositioned = true;
+      element.style.position = 'relative';
+      // Opera returns the offset relative to the positioning context, when an
+      // element is position relative but top and left have not been defined
+      if (Prototype.Browser.Opera) {
+        element.style.top = 0;
+        element.style.left = 0;
+      }
+    }
+    return element;
+  },
+
+  undoPositioned: function(element) {
+    element = $(element);
+    if (element._madePositioned) {
+      element._madePositioned = undefined;
+      element.style.position =
+        element.style.top =
+        element.style.left =
+        element.style.bottom =
+        element.style.right = '';
+    }
+    return element;
+  },
+
+  makeClipping: function(element) {
+    element = $(element);
+    if (element._overflow) return element;
+    element._overflow = Element.getStyle(element, 'overflow') || 'auto';
+    if (element._overflow !== 'hidden')
+      element.style.overflow = 'hidden';
+    return element;
+  },
+
+  undoClipping: function(element) {
+    element = $(element);
+    if (!element._overflow) return element;
+    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
+    element._overflow = null;
+    return element;
+  },
+
+  cumulativeOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
+  },
+
+  positionedOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+      if (element) {
+        if (element.tagName.toUpperCase() == 'BODY') break;
+        var p = Element.getStyle(element, 'position');
+        if (p !== 'static') break;
+      }
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
+  },
+
+  absolutize: function(element) {
+    element = $(element);
+    if (element.getStyle('position') == 'absolute') return element;
+    // Position.prepare(); // To be done manually by Scripty when it needs it.
+
+    var offsets = element.positionedOffset();
+    var top     = offsets[1];
+    var left    = offsets[0];
+    var width   = element.clientWidth;
+    var height  = element.clientHeight;
+
+    element._originalLeft   = left - parseFloat(element.style.left  || 0);
+    element._originalTop    = top  - parseFloat(element.style.top || 0);
+    element._originalWidth  = element.style.width;
+    element._originalHeight = element.style.height;
+
+    element.style.position = 'absolute';
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.width  = width + 'px';
+    element.style.height = height + 'px';
+    return element;
+  },
+
+  relativize: function(element) {
+    element = $(element);
+    if (element.getStyle('position') == 'relative') return element;
+    // Position.prepare(); // To be done manually by Scripty when it needs it.
+
+    element.style.position = 'relative';
+    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
+    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
+
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.height = element._originalHeight;
+    element.style.width  = element._originalWidth;
+    return element;
+  },
+
+  cumulativeScrollOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0;
+      element = element.parentNode;
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
+  },
+
+  getOffsetParent: function(element) {
+    if (element.offsetParent) return $(element.offsetParent);
+    if (element == document.body) return $(element);
+
+    while ((element = element.parentNode) && element != document.body)
+      if (Element.getStyle(element, 'position') != 'static')
+        return $(element);
+
+    return $(document.body);
+  },
+
+  viewportOffset: function(forElement) {
+    var valueT = 0, valueL = 0;
+
+    var element = forElement;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+
+      // Safari fix
+      if (element.offsetParent == document.body &&
+        Element.getStyle(element, 'position') == 'absolute') break;
+
+    } while (element = element.offsetParent);
+
+    element = forElement;
+    do {
+      if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) {
+        valueT -= element.scrollTop  || 0;
+        valueL -= element.scrollLeft || 0;
+      }
+    } while (element = element.parentNode);
+
+    return Element._returnOffset(valueL, valueT);
+  },
+
+  clonePosition: function(element, source) {
+    var options = Object.extend({
+      setLeft:    true,
+      setTop:     true,
+      setWidth:   true,
+      setHeight:  true,
+      offsetTop:  0,
+      offsetLeft: 0
+    }, arguments[2] || { });
+
+    // find page position of source
+    source = $(source);
+    var p = source.viewportOffset();
+
+    // find coordinate system to use
+    element = $(element);
+    var delta = [0, 0];
+    var parent = null;
+    // delta [0,0] will do fine with position: fixed elements,
+    // position:absolute needs offsetParent deltas
+    if (Element.getStyle(element, 'position') == 'absolute') {
+      parent = element.getOffsetParent();
+      delta = parent.viewportOffset();
+    }
+
+    // correct by body offsets (fixes Safari)
+    if (parent == document.body) {
+      delta[0] -= document.body.offsetLeft;
+      delta[1] -= document.body.offsetTop;
+    }
+
+    // set position
+    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
+    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
+    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
+    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
+    return element;
+  }
+};
+
+Element.Methods.identify.counter = 1;
+
+Object.extend(Element.Methods, {
+  getElementsBySelector: Element.Methods.select,
+  childElements: Element.Methods.immediateDescendants
+});
+
+Element._attributeTranslations = {
+  write: {
+    names: {
+      className: 'class',
+      htmlFor:   'for'
+    },
+    values: { }
+  }
+};
+
+if (Prototype.Browser.Opera) {
+  Element.Methods.getStyle = Element.Methods.getStyle.wrap(
+    function(proceed, element, style) {
+      switch (style) {
+        case 'left': case 'top': case 'right': case 'bottom':
+          if (proceed(element, 'position') === 'static') return null;
+        case 'height': case 'width':
+          // returns '0px' for hidden elements; we want it to return null
+          if (!Element.visible(element)) return null;
+
+          // returns the border-box dimensions rather than the content-box
+          // dimensions, so we subtract padding and borders from the value
+          var dim = parseInt(proceed(element, style), 10);
+
+          if (dim !== element['offset' + style.capitalize()])
+            return dim + 'px';
+
+          var properties;
+          if (style === 'height') {
+            properties = ['border-top-width', 'padding-top',
+             'padding-bottom', 'border-bottom-width'];
+          }
+          else {
+            properties = ['border-left-width', 'padding-left',
+             'padding-right', 'border-right-width'];
+          }
+          return properties.inject(dim, function(memo, property) {
+            var val = proceed(element, property);
+            return val === null ? memo : memo - parseInt(val, 10);
+          }) + 'px';
+        default: return proceed(element, style);
+      }
+    }
+  );
+
+  Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
+    function(proceed, element, attribute) {
+      if (attribute === 'title') return element.title;
+      return proceed(element, attribute);
+    }
+  );
+}
+
+else if (Prototype.Browser.IE) {
+  // IE doesn't report offsets correctly for static elements, so we change them
+  // to "relative" to get the values, then change them back.
+  Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
+    function(proceed, element) {
+      element = $(element);
+      // IE throws an error if element is not in document
+      try { element.offsetParent }
+      catch(e) { return $(document.body) }
+      var position = element.getStyle('position');
+      if (position !== 'static') return proceed(element);
+      element.setStyle({ position: 'relative' });
+      var value = proceed(element);
+      element.setStyle({ position: position });
+      return value;
+    }
+  );
+
+  $w('positionedOffset viewportOffset').each(function(method) {
+    Element.Methods[method] = Element.Methods[method].wrap(
+      function(proceed, element) {
+        element = $(element);
+        try { element.offsetParent }
+        catch(e) { return Element._returnOffset(0,0) }
+        var position = element.getStyle('position');
+        if (position !== 'static') return proceed(element);
+        // Trigger hasLayout on the offset parent so that IE6 reports
+        // accurate offsetTop and offsetLeft values for position: fixed.
+        var offsetParent = element.getOffsetParent();
+        if (offsetParent && offsetParent.getStyle('position') === 'fixed')
+          offsetParent.setStyle({ zoom: 1 });
+        element.setStyle({ position: 'relative' });
+        var value = proceed(element);
+        element.setStyle({ position: position });
+        return value;
+      }
+    );
+  });
+
+  Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap(
+    function(proceed, element) {
+      try { element.offsetParent }
+      catch(e) { return Element._returnOffset(0,0) }
+      return proceed(element);
+    }
+  );
+
+  Element.Methods.getStyle = function(element, style) {
+    element = $(element);
+    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
+    var value = element.style[style];
+    if (!value && element.currentStyle) value = element.currentStyle[style];
+
+    if (style == 'opacity') {
+      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
+        if (value[1]) return parseFloat(value[1]) / 100;
+      return 1.0;
+    }
+
+    if (value == 'auto') {
+      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
+        return element['offset' + style.capitalize()] + 'px';
+      return null;
+    }
+    return value;
+  };
+
+  Element.Methods.setOpacity = function(element, value) {
+    function stripAlpha(filter){
+      return filter.replace(/alpha\([^\)]*\)/gi,'');
+    }
+    element = $(element);
+    var currentStyle = element.currentStyle;
+    if ((currentStyle && !currentStyle.hasLayout) ||
+      (!currentStyle && element.style.zoom == 'normal'))
+        element.style.zoom = 1;
+
+    var filter = element.getStyle('filter'), style = element.style;
+    if (value == 1 || value === '') {
+      (filter = stripAlpha(filter)) ?
+        style.filter = filter : style.removeAttribute('filter');
+      return element;
+    } else if (value < 0.00001) value = 0;
+    style.filter = stripAlpha(filter) +
+      'alpha(opacity=' + (value * 100) + ')';
+    return element;
+  };
+
+  Element._attributeTranslations = {
+    read: {
+      names: {
+        'class': 'className',
+        'for':   'htmlFor'
+      },
+      values: {
+        _getAttr: function(element, attribute) {
+          return element.getAttribute(attribute, 2);
+        },
+        _getAttrNode: function(element, attribute) {
+          var node = element.getAttributeNode(attribute);
+          return node ? node.value : "";
+        },
+        _getEv: function(element, attribute) {
+          attribute = element.getAttribute(attribute);
+          return attribute ? attribute.toString().slice(23, -2) : null;
+        },
+        _flag: function(element, attribute) {
+          return $(element).hasAttribute(attribute) ? attribute : null;
+        },
+        style: function(element) {
+          return element.style.cssText.toLowerCase();
+        },
+        title: function(element) {
+          return element.title;
+        }
+      }
+    }
+  };
+
+  Element._attributeTranslations.write = {
+    names: Object.extend({
+      cellpadding: 'cellPadding',
+      cellspacing: 'cellSpacing'
+    }, Element._attributeTranslations.read.names),
+    values: {
+      checked: function(element, value) {
+        element.checked = !!value;
+      },
+
+      style: function(element, value) {
+        element.style.cssText = value ? value : '';
+      }
+    }
+  };
+
+  Element._attributeTranslations.has = {};
+
+  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
+      'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
+    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
+    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
+  });
+
+  (function(v) {
+    Object.extend(v, {
+      href:        v._getAttr,
+      src:         v._getAttr,
+      type:        v._getAttr,
+      action:      v._getAttrNode,
+      disabled:    v._flag,
+      checked:     v._flag,
+      readonly:    v._flag,
+      multiple:    v._flag,
+      onload:      v._getEv,
+      onunload:    v._getEv,
+      onclick:     v._getEv,
+      ondblclick:  v._getEv,
+      onmousedown: v._getEv,
+      onmouseup:   v._getEv,
+      onmouseover: v._getEv,
+      onmousemove: v._getEv,
+      onmouseout:  v._getEv,
+      onfocus:     v._getEv,
+      onblur:      v._getEv,
+      onkeypress:  v._getEv,
+      onkeydown:   v._getEv,
+      onkeyup:     v._getEv,
+      onsubmit:    v._getEv,
+      onreset:     v._getEv,
+      onselect:    v._getEv,
+      onchange:    v._getEv
+    });
+  })(Element._attributeTranslations.read.values);
+}
+
+else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
+  Element.Methods.setOpacity = function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1) ? 0.999999 :
+      (value === '') ? '' : (value < 0.00001) ? 0 : value;
+    return element;
+  };
+}
+
+else if (Prototype.Browser.WebKit) {
+  Element.Methods.setOpacity = function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1 || value === '') ? '' :
+      (value < 0.00001) ? 0 : value;
+
+    if (value == 1)
+      if(element.tagName.toUpperCase() == 'IMG' && element.width) {
+        element.width++; element.width--;
+      } else try {
+        var n = document.createTextNode(' ');
+        element.appendChild(n);
+        element.removeChild(n);
+      } catch (e) { }
+
+    return element;
+  };
+
+  // Safari returns margins on body which is incorrect if the child is absolutely
+  // positioned.  For performance reasons, redefine Element#cumulativeOffset for
+  // KHTML/WebKit only.
+  Element.Methods.cumulativeOffset = function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      if (element.offsetParent == document.body)
+        if (Element.getStyle(element, 'position') == 'absolute') break;
+
+      element = element.offsetParent;
+    } while (element);
+
+    return Element._returnOffset(valueL, valueT);
+  };
+}
+
+if (Prototype.Browser.IE || Prototype.Browser.Opera) {
+  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
+  Element.Methods.update = function(element, content) {
+    element = $(element);
+
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) return element.update().insert(content);
+
+    content = Object.toHTML(content);
+    var tagName = element.tagName.toUpperCase();
+
+    if (tagName in Element._insertionTranslations.tags) {
+      $A(element.childNodes).each(function(node) { element.removeChild(node) });
+      Element._getContentFromAnonymousElement(tagName, content.stripScripts())
+        .each(function(node) { element.appendChild(node) });
+    }
+    else element.innerHTML = content.stripScripts();
+
+    content.evalScripts.bind(content).defer();
+    return element;
+  };
+}
+
+if ('outerHTML' in document.createElement('div')) {
+  Element.Methods.replace = function(element, content) {
+    element = $(element);
+
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) {
+      element.parentNode.replaceChild(content, element);
+      return element;
+    }
+
+    content = Object.toHTML(content);
+    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
+
+    if (Element._insertionTranslations.tags[tagName]) {
+      var nextSibling = element.next();
+      var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+      parent.removeChild(element);
+      if (nextSibling)
+        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
+      else
+        fragments.each(function(node) { parent.appendChild(node) });
+    }
+    else element.outerHTML = content.stripScripts();
+
+    content.evalScripts.bind(content).defer();
+    return element;
+  };
+}
+
+Element._returnOffset = function(l, t) {
+  var result = [l, t];
+  result.left = l;
+  result.top = t;
+  return result;
+};
+
+Element._getContentFromAnonymousElement = function(tagName, html) {
+  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
+  if (t) {
+    div.innerHTML = t[0] + html + t[1];
+    t[2].times(function() { div = div.firstChild });
+  } else div.innerHTML = html;
+  return $A(div.childNodes);
+};
+
+Element._insertionTranslations = {
+  before: function(element, node) {
+    element.parentNode.insertBefore(node, element);
+  },
+  top: function(element, node) {
+    element.insertBefore(node, element.firstChild);
+  },
+  bottom: function(element, node) {
+    element.appendChild(node);
+  },
+  after: function(element, node) {
+    element.parentNode.insertBefore(node, element.nextSibling);
+  },
+  tags: {
+    TABLE:  ['<table>',                '</table>',                   1],
+    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
+    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
+    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
+    SELECT: ['<select>',               '</select>',                  1]
+  }
+};
+
+(function() {
+  Object.extend(this.tags, {
+    THEAD: this.tags.TBODY,
+    TFOOT: this.tags.TBODY,
+    TH:    this.tags.TD
+  });
+}).call(Element._insertionTranslations);
+
+Element.Methods.Simulated = {
+  hasAttribute: function(element, attribute) {
+    attribute = Element._attributeTranslations.has[attribute] || attribute;
+    var node = $(element).getAttributeNode(attribute);
+    return !!(node && node.specified);
+  }
+};
+
+Element.Methods.ByTag = { };
+
+Object.extend(Element, Element.Methods);
+
+if (!Prototype.BrowserFeatures.ElementExtensions &&
+    document.createElement('div')['__proto__']) {
+  window.HTMLElement = { };
+  window.HTMLElement.prototype = document.createElement('div')['__proto__'];
+  Prototype.BrowserFeatures.ElementExtensions = true;
+}
+
+Element.extend = (function() {
+  if (Prototype.BrowserFeatures.SpecificElementExtensions)
+    return Prototype.K;
+
+  var Methods = { }, ByTag = Element.Methods.ByTag;
+
+  var extend = Object.extend(function(element) {
+    if (!element || element._extendedByPrototype ||
+        element.nodeType != 1 || element == window) return element;
+
+    var methods = Object.clone(Methods),
+      tagName = element.tagName.toUpperCase(), property, value;
+
+    // extend methods for specific tags
+    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
+
+    for (property in methods) {
+      value = methods[property];
+      if (Object.isFunction(value) && !(property in element))
+        element[property] = value.methodize();
+    }
+
+    element._extendedByPrototype = Prototype.emptyFunction;
+    return element;
+
+  }, {
+    refresh: function() {
+      // extend methods for all tags (Safari doesn't need this)
+      if (!Prototype.BrowserFeatures.ElementExtensions) {
+        Object.extend(Methods, Element.Methods);
+        Object.extend(Methods, Element.Methods.Simulated);
+      }
+    }
+  });
+
+  extend.refresh();
+  return extend;
+})();
+
+Element.hasAttribute = function(element, attribute) {
+  if (element.hasAttribute) return element.hasAttribute(attribute);
+  return Element.Methods.Simulated.hasAttribute(element, attribute);
+};
+
+Element.addMethods = function(methods) {
+  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
+
+  if (!methods) {
+    Object.extend(Form, Form.Methods);
+    Object.extend(Form.Element, Form.Element.Methods);
+    Object.extend(Element.Methods.ByTag, {
+      "FORM":     Object.clone(Form.Methods),
+      "INPUT":    Object.clone(Form.Element.Methods),
+      "SELECT":   Object.clone(Form.Element.Methods),
+      "TEXTAREA": Object.clone(Form.Element.Methods)
+    });
+  }
+
+  if (arguments.length == 2) {
+    var tagName = methods;
+    methods = arguments[1];
+  }
+
+  if (!tagName) Object.extend(Element.Methods, methods || { });
+  else {
+    if (Object.isArray(tagName)) tagName.each(extend);
+    else extend(tagName);
+  }
+
+  function extend(tagName) {
+    tagName = tagName.toUpperCase();
+    if (!Element.Methods.ByTag[tagName])
+      Element.Methods.ByTag[tagName] = { };
+    Object.extend(Element.Methods.ByTag[tagName], methods);
+  }
+
+  function copy(methods, destination, onlyIfAbsent) {
+    onlyIfAbsent = onlyIfAbsent || false;
+    for (var property in methods) {
+      var value = methods[property];
+      if (!Object.isFunction(value)) continue;
+      if (!onlyIfAbsent || !(property in destination))
+        destination[property] = value.methodize();
+    }
+  }
+
+  function findDOMClass(tagName) {
+    var klass;
+    var trans = {
+      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
+      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
+      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
+      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
+      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
+      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
+      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
+      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
+      "FrameSet", "IFRAME": "IFrame"
+    };
+    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
+    if (window[klass]) return window[klass];
+    klass = 'HTML' + tagName + 'Element';
+    if (window[klass]) return window[klass];
+    klass = 'HTML' + tagName.capitalize() + 'Element';
+    if (window[klass]) return window[klass];
+
+    window[klass] = { };
+    window[klass].prototype = document.createElement(tagName)['__proto__'];
+    return window[klass];
+  }
+
+  if (F.ElementExtensions) {
+    copy(Element.Methods, HTMLElement.prototype);
+    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
+  }
+
+  if (F.SpecificElementExtensions) {
+    for (var tag in Element.Methods.ByTag) {
+      var klass = findDOMClass(tag);
+      if (Object.isUndefined(klass)) continue;
+      copy(T[tag], klass.prototype);
+    }
+  }
+
+  Object.extend(Element, Element.Methods);
+  delete Element.ByTag;
+
+  if (Element.extend.refresh) Element.extend.refresh();
+  Element.cache = { };
+};
+
+document.viewport = {
+  getDimensions: function() {
+    var dimensions = { }, B = Prototype.Browser;
+    $w('width height').each(function(d) {
+      var D = d.capitalize();
+      if (B.WebKit && !document.evaluate) {
+        // Safari <3.0 needs self.innerWidth/Height
+        dimensions[d] = self['inner' + D];
+      } else if (B.Opera && parseFloat(window.opera.version()) < 9.5) {
+        // Opera <9.5 needs document.body.clientWidth/Height
+        dimensions[d] = document.body['client' + D]
+      } else {
+        dimensions[d] = document.documentElement['client' + D];
+      }
+    });
+    return dimensions;
+  },
+
+  getWidth: function() {
+    return this.getDimensions().width;
+  },
+
+  getHeight: function() {
+    return this.getDimensions().height;
+  },
+
+  getScrollOffsets: function() {
+    return Element._returnOffset(
+      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
+      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
+  }
+};
+/* Portions of the Selector class are derived from Jack Slocum's DomQuery,
+ * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
+ * license.  Please see http://www.yui-ext.com/ for more information. */
+
+var Selector = Class.create({
+  initialize: function(expression) {
+    this.expression = expression.strip();
+
+    if (this.shouldUseSelectorsAPI()) {
+      this.mode = 'selectorsAPI';
+    } else if (this.shouldUseXPath()) {
+      this.mode = 'xpath';
+      this.compileXPathMatcher();
+    } else {
+      this.mode = "normal";
+      this.compileMatcher();
+    }
+
+  },
+
+  shouldUseXPath: function() {
+    if (!Prototype.BrowserFeatures.XPath) return false;
+
+    var e = this.expression;
+
+    // Safari 3 chokes on :*-of-type and :empty
+    if (Prototype.Browser.WebKit &&
+     (e.include("-of-type") || e.include(":empty")))
+      return false;
+
+    // XPath can't do namespaced attributes, nor can it read
+    // the "checked" property from DOM nodes
+    if ((/(\[[\w-]*?:|:checked)/).test(e))
+      return false;
+
+    return true;
+  },
+
+  shouldUseSelectorsAPI: function() {
+    if (!Prototype.BrowserFeatures.SelectorsAPI) return false;
+
+    if (!Selector._div) Selector._div = new Element('div');
+
+    // Make sure the browser treats the selector as valid. Test on an
+    // isolated element to minimize cost of this check.
+    try {
+      Selector._div.querySelector(this.expression);
+    } catch(e) {
+      return false;
+    }
+
+    return true;
+  },
+
+  compileMatcher: function() {
+    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
+        c = Selector.criteria, le, p, m;
+
+    if (Selector._cache[e]) {
+      this.matcher = Selector._cache[e];
+      return;
+    }
+
+    this.matcher = ["this.matcher = function(root) {",
+                    "var r = root, h = Selector.handlers, c = false, n;"];
+
+    while (e && le != e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        p = ps[i];
+        if (m = e.match(p)) {
+          this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
+            new Template(c[i]).evaluate(m));
+          e = e.replace(m[0], '');
+          break;
+        }
+      }
+    }
+
+    this.matcher.push("return h.unique(n);\n}");
+    eval(this.matcher.join('\n'));
+    Selector._cache[this.expression] = this.matcher;
+  },
+
+  compileXPathMatcher: function() {
+    var e = this.expression, ps = Selector.patterns,
+        x = Selector.xpath, le, m;
+
+    if (Selector._cache[e]) {
+      this.xpath = Selector._cache[e]; return;
+    }
+
+    this.matcher = ['.//*'];
+    while (e && le != e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        if (m = e.match(ps[i])) {
+          this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
+            new Template(x[i]).evaluate(m));
+          e = e.replace(m[0], '');
+          break;
+        }
+      }
+    }
+
+    this.xpath = this.matcher.join('');
+    Selector._cache[this.expression] = this.xpath;
+  },
+
+  findElements: function(root) {
+    root = root || document;
+    var e = this.expression, results;
+
+    switch (this.mode) {
+      case 'selectorsAPI':
+        // querySelectorAll queries document-wide, then filters to descendants
+        // of the context element. That's not what we want.
+        // Add an explicit context to the selector if necessary.
+        if (root !== document) {
+          var oldId = root.id, id = $(root).identify();
+          e = "#" + id + " " + e;
+        }
+
+        results = $A(root.querySelectorAll(e)).map(Element.extend);
+        root.id = oldId;
+
+        return results;
+      case 'xpath':
+        return document._getElementsByXPath(this.xpath, root);
+      default:
+       return this.matcher(root);
+    }
+  },
+
+  match: function(element) {
+    this.tokens = [];
+
+    var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
+    var le, p, m;
+
+    while (e && le !== e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        p = ps[i];
+        if (m = e.match(p)) {
+          // use the Selector.assertions methods unless the selector
+          // is too complex.
+          if (as[i]) {
+            this.tokens.push([i, Object.clone(m)]);
+            e = e.replace(m[0], '');
+          } else {
+            // reluctantly do a document-wide search
+            // and look for a match in the array
+            return this.findElements(document).include(element);
+          }
+        }
+      }
+    }
+
+    var match = true, name, matches;
+    for (var i = 0, token; token = this.tokens[i]; i++) {
+      name = token[0], matches = token[1];
+      if (!Selector.assertions[name](element, matches)) {
+        match = false; break;
+      }
+    }
+
+    return match;
+  },
+
+  toString: function() {
+    return this.expression;
+  },
+
+  inspect: function() {
+    return "#<Selector:" + this.expression.inspect() + ">";
+  }
+});
+
+Object.extend(Selector, {
+  _cache: { },
+
+  xpath: {
+    descendant:   "//*",
+    child:        "/*",
+    adjacent:     "/following-sibling::*[1]",
+    laterSibling: '/following-sibling::*',
+    tagName:      function(m) {
+      if (m[1] == '*') return '';
+      return "[local-name()='" + m[1].toLowerCase() +
+             "' or local-name()='" + m[1].toUpperCase() + "']";
+    },
+    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
+    id:           "[@id='#{1}']",
+    attrPresence: function(m) {
+      m[1] = m[1].toLowerCase();
+      return new Template("[@#{1}]").evaluate(m);
+    },
+    attr: function(m) {
+      m[1] = m[1].toLowerCase();
+      m[3] = m[5] || m[6];
+      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
+    },
+    pseudo: function(m) {
+      var h = Selector.xpath.pseudos[m[1]];
+      if (!h) return '';
+      if (Object.isFunction(h)) return h(m);
+      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
+    },
+    operators: {
+      '=':  "[@#{1}='#{3}']",
+      '!=': "[@#{1}!='#{3}']",
+      '^=': "[starts-with(@#{1}, '#{3}')]",
+      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
+      '*=': "[contains(@#{1}, '#{3}')]",
+      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
+      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
+    },
+    pseudos: {
+      'first-child': '[not(preceding-sibling::*)]',
+      'last-child':  '[not(following-sibling::*)]',
+      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
+      'empty':       "[count(*) = 0 and (count(text()) = 0)]",
+      'checked':     "[@checked]",
+      'disabled':    "[(@disabled) and (@type!='hidden')]",
+      'enabled':     "[not(@disabled) and (@type!='hidden')]",
+      'not': function(m) {
+        var e = m[6], p = Selector.patterns,
+            x = Selector.xpath, le, v;
+
+        var exclusion = [];
+        while (e && le != e && (/\S/).test(e)) {
+          le = e;
+          for (var i in p) {
+            if (m = e.match(p[i])) {
+              v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
+              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
+              e = e.replace(m[0], '');
+              break;
+            }
+          }
+        }
+        return "[not(" + exclusion.join(" and ") + ")]";
+      },
+      'nth-child':      function(m) {
+        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
+      },
+      'nth-last-child': function(m) {
+        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
+      },
+      'nth-of-type':    function(m) {
+        return Selector.xpath.pseudos.nth("position() ", m);
+      },
+      'nth-last-of-type': function(m) {
+        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
+      },
+      'first-of-type':  function(m) {
+        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
+      },
+      'last-of-type':   function(m) {
+        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
+      },
+      'only-of-type':   function(m) {
+        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
+      },
+      nth: function(fragment, m) {
+        var mm, formula = m[6], predicate;
+        if (formula == 'even') formula = '2n+0';
+        if (formula == 'odd')  formula = '2n+1';
+        if (mm = formula.match(/^(\d+)$/)) // digit only
+          return '[' + fragment + "= " + mm[1] + ']';
+        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
+          if (mm[1] == "-") mm[1] = -1;
+          var a = mm[1] ? Number(mm[1]) : 1;
+          var b = mm[2] ? Number(mm[2]) : 0;
+          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
+          "((#{fragment} - #{b}) div #{a} >= 0)]";
+          return new Template(predicate).evaluate({
+            fragment: fragment, a: a, b: b });
+        }
+      }
+    }
+  },
+
+  criteria: {
+    tagName:      'n = h.tagName(n, r, "#{1}", c);      c = false;',
+    className:    'n = h.className(n, r, "#{1}", c);    c = false;',
+    id:           'n = h.id(n, r, "#{1}", c);           c = false;',
+    attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
+    attr: function(m) {
+      m[3] = (m[5] || m[6]);
+      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m);
+    },
+    pseudo: function(m) {
+      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
+      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
+    },
+    descendant:   'c = "descendant";',
+    child:        'c = "child";',
+    adjacent:     'c = "adjacent";',
+    laterSibling: 'c = "laterSibling";'
+  },
+
+  patterns: {
+    // combinators must be listed first
+    // (and descendant needs to be last combinator)
+    laterSibling: /^\s*~\s*/,
+    child:        /^\s*>\s*/,
+    adjacent:     /^\s*\+\s*/,
+    descendant:   /^\s/,
+
+    // selectors follow
+    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
+    id:           /^#([\w\-\*]+)(\b|$)/,
+    className:    /^\.([\w\-\*]+)(\b|$)/,
+    pseudo:
+/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
+    attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/,
+    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
+  },
+
+  // for Selector.match and Element#match
+  assertions: {
+    tagName: function(element, matches) {
+      return matches[1].toUpperCase() == element.tagName.toUpperCase();
+    },
+
+    className: function(element, matches) {
+      return Element.hasClassName(element, matches[1]);
+    },
+
+    id: function(element, matches) {
+      return element.id === matches[1];
+    },
+
+    attrPresence: function(element, matches) {
+      return Element.hasAttribute(element, matches[1]);
+    },
+
+    attr: function(element, matches) {
+      var nodeValue = Element.readAttribute(element, matches[1]);
+      return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]);
+    }
+  },
+
+  handlers: {
+    // UTILITY FUNCTIONS
+    // joins two collections
+    concat: function(a, b) {
+      for (var i = 0, node; node = b[i]; i++)
+        a.push(node);
+      return a;
+    },
+
+    // marks an array of nodes for counting
+    mark: function(nodes) {
+      var _true = Prototype.emptyFunction;
+      for (var i = 0, node; node = nodes[i]; i++)
+        node._countedByPrototype = _true;
+      return nodes;
+    },
+
+    unmark: function(nodes) {
+      for (var i = 0, node; node = nodes[i]; i++)
+        node._countedByPrototype = undefined;
+      return nodes;
+    },
+
+    // mark each child node with its position (for nth calls)
+    // "ofType" flag indicates whether we're indexing for nth-of-type
+    // rather than nth-child
+    index: function(parentNode, reverse, ofType) {
+      parentNode._countedByPrototype = Prototype.emptyFunction;
+      if (reverse) {
+        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
+          var node = nodes[i];
+          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
+        }
+      } else {
+        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
+          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
+      }
+    },
+
+    // filters out duplicates and extends all nodes
+    unique: function(nodes) {
+      if (nodes.length == 0) return nodes;
+      var results = [], n;
+      for (var i = 0, l = nodes.length; i < l; i++)
+        if (!(n = nodes[i])._countedByPrototype) {
+          n._countedByPrototype = Prototype.emptyFunction;
+          results.push(Element.extend(n));
+        }
+      return Selector.handlers.unmark(results);
+    },
+
+    // COMBINATOR FUNCTIONS
+    descendant: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        h.concat(results, node.getElementsByTagName('*'));
+      return results;
+    },
+
+    child: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        for (var j = 0, child; child = node.childNodes[j]; j++)
+          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
+      }
+      return results;
+    },
+
+    adjacent: function(nodes) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        var next = this.nextElementSibling(node);
+        if (next) results.push(next);
+      }
+      return results;
+    },
+
+    laterSibling: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        h.concat(results, Element.nextSiblings(node));
+      return results;
+    },
+
+    nextElementSibling: function(node) {
+      while (node = node.nextSibling)
+        if (node.nodeType == 1) return node;
+      return null;
+    },
+
+    previousElementSibling: function(node) {
+      while (node = node.previousSibling)
+        if (node.nodeType == 1) return node;
+      return null;
+    },
+
+    // TOKEN FUNCTIONS
+    tagName: function(nodes, root, tagName, combinator) {
+      var uTagName = tagName.toUpperCase();
+      var results = [], h = Selector.handlers;
+      if (nodes) {
+        if (combinator) {
+          // fastlane for ordinary descendant combinators
+          if (combinator == "descendant") {
+            for (var i = 0, node; node = nodes[i]; i++)
+              h.concat(results, node.getElementsByTagName(tagName));
+            return results;
+          } else nodes = this[combinator](nodes);
+          if (tagName == "*") return nodes;
+        }
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node.tagName.toUpperCase() === uTagName) results.push(node);
+        return results;
+      } else return root.getElementsByTagName(tagName);
+    },
+
+    id: function(nodes, root, id, combinator) {
+      var targetNode = $(id), h = Selector.handlers;
+      if (!targetNode) return [];
+      if (!nodes && root == document) return [targetNode];
+      if (nodes) {
+        if (combinator) {
+          if (combinator == 'child') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (targetNode.parentNode == node) return [targetNode];
+          } else if (combinator == 'descendant') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (Element.descendantOf(targetNode, node)) return [targetNode];
+          } else if (combinator == 'adjacent') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (Selector.handlers.previousElementSibling(targetNode) == node)
+                return [targetNode];
+          } else nodes = h[combinator](nodes);
+        }
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node == targetNode) return [targetNode];
+        return [];
+      }
+      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
+    },
+
+    className: function(nodes, root, className, combinator) {
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      return Selector.handlers.byClassName(nodes, root, className);
+    },
+
+    byClassName: function(nodes, root, className) {
+      if (!nodes) nodes = Selector.handlers.descendant([root]);
+      var needle = ' ' + className + ' ';
+      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
+        nodeClassName = node.className;
+        if (nodeClassName.length == 0) continue;
+        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
+          results.push(node);
+      }
+      return results;
+    },
+
+    attrPresence: function(nodes, root, attr, combinator) {
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      var results = [];
+      for (var i = 0, node; node = nodes[i]; i++)
+        if (Element.hasAttribute(node, attr)) results.push(node);
+      return results;
+    },
+
+    attr: function(nodes, root, attr, value, operator, combinator) {
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      var handler = Selector.operators[operator], results = [];
+      for (var i = 0, node; node = nodes[i]; i++) {
+        var nodeValue = Element.readAttribute(node, attr);
+        if (nodeValue === null) continue;
+        if (handler(nodeValue, value)) results.push(node);
+      }
+      return results;
+    },
+
+    pseudo: function(nodes, name, value, root, combinator) {
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      return Selector.pseudos[name](nodes, value, root);
+    }
+  },
+
+  pseudos: {
+    'first-child': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        if (Selector.handlers.previousElementSibling(node)) continue;
+          results.push(node);
+      }
+      return results;
+    },
+    'last-child': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        if (Selector.handlers.nextElementSibling(node)) continue;
+          results.push(node);
+      }
+      return results;
+    },
+    'only-child': function(nodes, value, root) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
+          results.push(node);
+      return results;
+    },
+    'nth-child':        function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root);
+    },
+    'nth-last-child':   function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, true);
+    },
+    'nth-of-type':      function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, false, true);
+    },
+    'nth-last-of-type': function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, true, true);
+    },
+    'first-of-type':    function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, "1", root, false, true);
+    },
+    'last-of-type':     function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, "1", root, true, true);
+    },
+    'only-of-type':     function(nodes, formula, root) {
+      var p = Selector.pseudos;
+      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
+    },
+
+    // handles the an+b logic
+    getIndices: function(a, b, total) {
+      if (a == 0) return b > 0 ? [b] : [];
+      return $R(1, total).inject([], function(memo, i) {
+        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
+        return memo;
+      });
+    },
+
+    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
+    nth: function(nodes, formula, root, reverse, ofType) {
+      if (nodes.length == 0) return [];
+      if (formula == 'even') formula = '2n+0';
+      if (formula == 'odd')  formula = '2n+1';
+      var h = Selector.handlers, results = [], indexed = [], m;
+      h.mark(nodes);
+      for (var i = 0, node; node = nodes[i]; i++) {
+        if (!node.parentNode._countedByPrototype) {
+          h.index(node.parentNode, reverse, ofType);
+          indexed.push(node.parentNode);
+        }
+      }
+      if (formula.match(/^\d+$/)) { // just a number
+        formula = Number(formula);
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node.nodeIndex == formula) results.push(node);
+      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
+        if (m[1] == "-") m[1] = -1;
+        var a = m[1] ? Number(m[1]) : 1;
+        var b = m[2] ? Number(m[2]) : 0;
+        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
+        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
+          for (var j = 0; j < l; j++)
+            if (node.nodeIndex == indices[j]) results.push(node);
+        }
+      }
+      h.unmark(nodes);
+      h.unmark(indexed);
+      return results;
+    },
+
+    'empty': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        // IE treats comments as element nodes
+        if (node.tagName == '!' || node.firstChild) continue;
+        results.push(node);
+      }
+      return results;
+    },
+
+    'not': function(nodes, selector, root) {
+      var h = Selector.handlers, selectorType, m;
+      var exclusions = new Selector(selector).findElements(root);
+      h.mark(exclusions);
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!node._countedByPrototype) results.push(node);
+      h.unmark(exclusions);
+      return results;
+    },
+
+    'enabled': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!node.disabled && (!node.type || node.type !== 'hidden'))
+          results.push(node);
+      return results;
+    },
+
+    'disabled': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (node.disabled) results.push(node);
+      return results;
+    },
+
+    'checked': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (node.checked) results.push(node);
+      return results;
+    }
+  },
+
+  operators: {
+    '=':  function(nv, v) { return nv == v; },
+    '!=': function(nv, v) { return nv != v; },
+    '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); },
+    '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); },
+    '*=': function(nv, v) { return nv == v || nv && nv.include(v); },
+    '$=': function(nv, v) { return nv.endsWith(v); },
+    '*=': function(nv, v) { return nv.include(v); },
+    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
+    '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() +
+     '-').include('-' + (v || "").toUpperCase() + '-'); }
+  },
+
+  split: function(expression) {
+    var expressions = [];
+    expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
+      expressions.push(m[1].strip());
+    });
+    return expressions;
+  },
+
+  matchElements: function(elements, expression) {
+    var matches = $$(expression), h = Selector.handlers;
+    h.mark(matches);
+    for (var i = 0, results = [], element; element = elements[i]; i++)
+      if (element._countedByPrototype) results.push(element);
+    h.unmark(matches);
+    return results;
+  },
+
+  findElement: function(elements, expression, index) {
+    if (Object.isNumber(expression)) {
+      index = expression; expression = false;
+    }
+    return Selector.matchElements(elements, expression || '*')[index || 0];
+  },
+
+  findChildElements: function(element, expressions) {
+    expressions = Selector.split(expressions.join(','));
+    var results = [], h = Selector.handlers;
+    for (var i = 0, l = expressions.length, selector; i < l; i++) {
+      selector = new Selector(expressions[i].strip());
+      h.concat(results, selector.findElements(element));
+    }
+    return (l > 1) ? h.unique(results) : results;
+  }
+});
+
+if (Prototype.Browser.IE) {
+  Object.extend(Selector.handlers, {
+    // IE returns comment nodes on getElementsByTagName("*").
+    // Filter them out.
+    concat: function(a, b) {
+      for (var i = 0, node; node = b[i]; i++)
+        if (node.tagName !== "!") a.push(node);
+      return a;
+    },
+
+    // IE improperly serializes _countedByPrototype in (inner|outer)HTML.
+    unmark: function(nodes) {
+      for (var i = 0, node; node = nodes[i]; i++)
+        node.removeAttribute('_countedByPrototype');
+      return nodes;
+    }
+  });
+}
+
+function $$() {
+  return Selector.findChildElements(document, $A(arguments));
+}
+var Form = {
+  reset: function(form) {
+    $(form).reset();
+    return form;
+  },
+
+  serializeElements: function(elements, options) {
+    if (typeof options != 'object') options = { hash: !!options };
+    else if (Object.isUndefined(options.hash)) options.hash = true;
+    var key, value, submitted = false, submit = options.submit;
+
+    var data = elements.inject({ }, function(result, element) {
+      if (!element.disabled && element.name) {
+        key = element.name; value = $(element).getValue();
+        if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
+            submit !== false && (!submit || key == submit) && (submitted = true)))) {
+          if (key in result) {
+            // a key is already present; construct an array of values
+            if (!Object.isArray(result[key])) result[key] = [result[key]];
+            result[key].push(value);
+          }
+          else result[key] = value;
+        }
+      }
+      return result;
+    });
+
+    return options.hash ? data : Object.toQueryString(data);
+  }
+};
+
+Form.Methods = {
+  serialize: function(form, options) {
+    return Form.serializeElements(Form.getElements(form), options);
+  },
+
+  getElements: function(form) {
+    return $A($(form).getElementsByTagName('*')).inject([],
+      function(elements, child) {
+        if (Form.Element.Serializers[child.tagName.toLowerCase()])
+          elements.push(Element.extend(child));
+        return elements;
+      }
+    );
+  },
+
+  getInputs: function(form, typeName, name) {
+    form = $(form);
+    var inputs = form.getElementsByTagName('input');
+
+    if (!typeName && !name) return $A(inputs).map(Element.extend);
+
+    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
+      var input = inputs[i];
+      if ((typeName && input.type != typeName) || (name && input.name != name))
+        continue;
+      matchingInputs.push(Element.extend(input));
+    }
+
+    return matchingInputs;
+  },
+
+  disable: function(form) {
+    form = $(form);
+    Form.getElements(form).invoke('disable');
+    return form;
+  },
+
+  enable: function(form) {
+    form = $(form);
+    Form.getElements(form).invoke('enable');
+    return form;
+  },
+
+  findFirstElement: function(form) {
+    var elements = $(form).getElements().findAll(function(element) {
+      return 'hidden' != element.type && !element.disabled;
+    });
+    var firstByIndex = elements.findAll(function(element) {
+      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
+    }).sortBy(function(element) { return element.tabIndex }).first();
+
+    return firstByIndex ? firstByIndex : elements.find(function(element) {
+      return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+    });
+  },
+
+  focusFirstElement: function(form) {
+    form = $(form);
+    form.findFirstElement().activate();
+    return form;
+  },
+
+  request: function(form, options) {
+    form = $(form), options = Object.clone(options || { });
+
+    var params = options.parameters, action = form.readAttribute('action') || '';
+    if (action.blank()) action = window.location.href;
+    options.parameters = form.serialize(true);
+
+    if (params) {
+      if (Object.isString(params)) params = params.toQueryParams();
+      Object.extend(options.parameters, params);
+    }
+
+    if (form.hasAttribute('method') && !options.method)
+      options.method = form.method;
+
+    return new Ajax.Request(action, options);
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element = {
+  focus: function(element) {
+    $(element).focus();
+    return element;
+  },
+
+  select: function(element) {
+    $(element).select();
+    return element;
+  }
+};
+
+Form.Element.Methods = {
+  serialize: function(element) {
+    element = $(element);
+    if (!element.disabled && element.name) {
+      var value = element.getValue();
+      if (value != undefined) {
+        var pair = { };
+        pair[element.name] = value;
+        return Object.toQueryString(pair);
+      }
+    }
+    return '';
+  },
+
+  getValue: function(element) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    return Form.Element.Serializers[method](element);
+  },
+
+  setValue: function(element, value) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    Form.Element.Serializers[method](element, value);
+    return element;
+  },
+
+  clear: function(element) {
+    $(element).value = '';
+    return element;
+  },
+
+  present: function(element) {
+    return $(element).value != '';
+  },
+
+  activate: function(element) {
+    element = $(element);
+    try {
+      element.focus();
+      if (element.select && (element.tagName.toLowerCase() != 'input' ||
+          !['button', 'reset', 'submit'].include(element.type)))
+        element.select();
+    } catch (e) { }
+    return element;
+  },
+
+  disable: function(element) {
+    element = $(element);
+    element.disabled = true;
+    return element;
+  },
+
+  enable: function(element) {
+    element = $(element);
+    element.disabled = false;
+    return element;
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Field = Form.Element;
+var $F = Form.Element.Methods.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element.Serializers = {
+  input: function(element, value) {
+    switch (element.type.toLowerCase()) {
+      case 'checkbox':
+      case 'radio':
+        return Form.Element.Serializers.inputSelector(element, value);
+      default:
+        return Form.Element.Serializers.textarea(element, value);
+    }
+  },
+
+  inputSelector: function(element, value) {
+    if (Object.isUndefined(value)) return element.checked ? element.value : null;
+    else element.checked = !!value;
+  },
+
+  textarea: function(element, value) {
+    if (Object.isUndefined(value)) return element.value;
+    else element.value = value;
+  },
+
+  select: function(element, value) {
+    if (Object.isUndefined(value))
+      return this[element.type == 'select-one' ?
+        'selectOne' : 'selectMany'](element);
+    else {
+      var opt, currentValue, single = !Object.isArray(value);
+      for (var i = 0, length = element.length; i < length; i++) {
+        opt = element.options[i];
+        currentValue = this.optionValue(opt);
+        if (single) {
+          if (currentValue == value) {
+            opt.selected = true;
+            return;
+          }
+        }
+        else opt.selected = value.include(currentValue);
+      }
+    }
+  },
+
+  selectOne: function(element) {
+    var index = element.selectedIndex;
+    return index >= 0 ? this.optionValue(element.options[index]) : null;
+  },
+
+  selectMany: function(element) {
+    var values, length = element.length;
+    if (!length) return null;
+
+    for (var i = 0, values = []; i < length; i++) {
+      var opt = element.options[i];
+      if (opt.selected) values.push(this.optionValue(opt));
+    }
+    return values;
+  },
+
+  optionValue: function(opt) {
+    // extend element because hasAttribute may not be native
+    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
+  initialize: function($super, element, frequency, callback) {
+    $super(callback, frequency);
+    this.element   = $(element);
+    this.lastValue = this.getValue();
+  },
+
+  execute: function() {
+    var value = this.getValue();
+    if (Object.isString(this.lastValue) && Object.isString(value) ?
+        this.lastValue != value : String(this.lastValue) != String(value)) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+});
+
+Form.Element.Observer = Class.create(Abstract.TimedObserver, {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create(Abstract.TimedObserver, {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = Class.create({
+  initialize: function(element, callback) {
+    this.element  = $(element);
+    this.callback = callback;
+
+    this.lastValue = this.getValue();
+    if (this.element.tagName.toLowerCase() == 'form')
+      this.registerFormCallbacks();
+    else
+      this.registerCallback(this.element);
+  },
+
+  onElementEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  },
+
+  registerFormCallbacks: function() {
+    Form.getElements(this.element).each(this.registerCallback, this);
+  },
+
+  registerCallback: function(element) {
+    if (element.type) {
+      switch (element.type.toLowerCase()) {
+        case 'checkbox':
+        case 'radio':
+          Event.observe(element, 'click', this.onElementEvent.bind(this));
+          break;
+        default:
+          Event.observe(element, 'change', this.onElementEvent.bind(this));
+          break;
+      }
+    }
+  }
+});
+
+Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.EventObserver = Class.create(Abstract.EventObserver, {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+if (!window.Event) var Event = { };
+
+Object.extend(Event, {
+  KEY_BACKSPACE: 8,
+  KEY_TAB:       9,
+  KEY_RETURN:   13,
+  KEY_ESC:      27,
+  KEY_LEFT:     37,
+  KEY_UP:       38,
+  KEY_RIGHT:    39,
+  KEY_DOWN:     40,
+  KEY_DELETE:   46,
+  KEY_HOME:     36,
+  KEY_END:      35,
+  KEY_PAGEUP:   33,
+  KEY_PAGEDOWN: 34,
+  KEY_INSERT:   45,
+
+  cache: { },
+
+  relatedTarget: function(event) {
+    var element;
+    switch(event.type) {
+      case 'mouseover': element = event.fromElement; break;
+      case 'mouseout':  element = event.toElement;   break;
+      default: return null;
+    }
+    return Element.extend(element);
+  }
+});
+
+Event.Methods = (function() {
+  var isButton;
+
+  if (Prototype.Browser.IE) {
+    var buttonMap = { 0: 1, 1: 4, 2: 2 };
+    isButton = function(event, code) {
+      return event.button == buttonMap[code];
+    };
+
+  } else if (Prototype.Browser.WebKit) {
+    isButton = function(event, code) {
+      switch (code) {
+        case 0: return event.which == 1 && !event.metaKey;
+        case 1: return event.which == 1 && event.metaKey;
+        default: return false;
+      }
+    };
+
+  } else {
+    isButton = function(event, code) {
+      return event.which ? (event.which === code + 1) : (event.button === code);
+    };
+  }
+
+  return {
+    isLeftClick:   function(event) { return isButton(event, 0) },
+    isMiddleClick: function(event) { return isButton(event, 1) },
+    isRightClick:  function(event) { return isButton(event, 2) },
+
+    element: function(event) {
+      event = Event.extend(event);
+
+      var node          = event.target,
+          type          = event.type,
+          currentTarget = event.currentTarget;
+
+      if (currentTarget && currentTarget.tagName) {
+        // Firefox screws up the "click" event when moving between radio buttons
+        // via arrow keys. It also screws up the "load" and "error" events on images,
+        // reporting the document as the target instead of the original image.
+        if (type === 'load' || type === 'error' ||
+          (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
+            && currentTarget.type === 'radio'))
+              node = currentTarget;
+      }
+      if (node.nodeType == Node.TEXT_NODE) node = node.parentNode;
+      return Element.extend(node);
+    },
+
+    findElement: function(event, expression) {
+      var element = Event.element(event);
+      if (!expression) return element;
+      var elements = [element].concat(element.ancestors());
+      return Selector.findElement(elements, expression, 0);
+    },
+
+    pointer: function(event) {
+      var docElement = document.documentElement,
+      body = document.body || { scrollLeft: 0, scrollTop: 0 };
+      return {
+        x: event.pageX || (event.clientX +
+          (docElement.scrollLeft || body.scrollLeft) -
+          (docElement.clientLeft || 0)),
+        y: event.pageY || (event.clientY +
+          (docElement.scrollTop || body.scrollTop) -
+          (docElement.clientTop || 0))
+      };
+    },
+
+    pointerX: function(event) { return Event.pointer(event).x },
+    pointerY: function(event) { return Event.pointer(event).y },
+
+    stop: function(event) {
+      Event.extend(event);
+      event.preventDefault();
+      event.stopPropagation();
+      event.stopped = true;
+    }
+  };
+})();
+
+Event.extend = (function() {
+  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
+    m[name] = Event.Methods[name].methodize();
+    return m;
+  });
+
+  if (Prototype.Browser.IE) {
+    Object.extend(methods, {
+      stopPropagation: function() { this.cancelBubble = true },
+      preventDefault:  function() { this.returnValue = false },
+      inspect: function() { return "[object Event]" }
+    });
+
+    return function(event) {
+      if (!event) return false;
+      if (event._extendedByPrototype) return event;
+
+      event._extendedByPrototype = Prototype.emptyFunction;
+      var pointer = Event.pointer(event);
+      Object.extend(event, {
+        target: event.srcElement,
+        relatedTarget: Event.relatedTarget(event),
+        pageX:  pointer.x,
+        pageY:  pointer.y
+      });
+      return Object.extend(event, methods);
+    };
+
+  } else {
+    Event.prototype = Event.prototype || document.createEvent("HTMLEvents")['__proto__'];
+    Object.extend(Event.prototype, methods);
+    return Prototype.K;
+  }
+})();
+
+Object.extend(Event, (function() {
+  var cache = Event.cache;
+
+  function getEventID(element) {
+    if (element._prototypeEventID) return element._prototypeEventID[0];
+    arguments.callee.id = arguments.callee.id || 1;
+    return element._prototypeEventID = [++arguments.callee.id];
+  }
+
+  function getDOMEventName(eventName) {
+    if (eventName && eventName.include(':')) return "dataavailable";
+    return eventName;
+  }
+
+  function getCacheForID(id) {
+    return cache[id] = cache[id] || { };
+  }
+
+  function getWrappersForEventName(id, eventName) {
+    var c = getCacheForID(id);
+    return c[eventName] = c[eventName] || [];
+  }
+
+  function createWrapper(element, eventName, handler) {
+    var id = getEventID(element);
+    var c = getWrappersForEventName(id, eventName);
+    if (c.pluck("handler").include(handler)) return false;
+
+    var wrapper = function(event) {
+      if (!Event || !Event.extend ||
+        (event.eventName && event.eventName != eventName))
+          return false;
+
+      Event.extend(event);
+      handler.call(element, event);
+    };
+
+    wrapper.handler = handler;
+    c.push(wrapper);
+    return wrapper;
+  }
+
+  function findWrapper(id, eventName, handler) {
+    var c = getWrappersForEventName(id, eventName);
+    return c.find(function(wrapper) { return wrapper.handler == handler });
+  }
+
+  function destroyWrapper(id, eventName, handler) {
+    var c = getCacheForID(id);
+    if (!c[eventName]) return false;
+    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
+  }
+
+  function destroyCache() {
+    for (var id in cache)
+      for (var eventName in cache[id])
+        cache[id][eventName] = null;
+  }
+
+
+  // Internet Explorer needs to remove event handlers on page unload
+  // in order to avoid memory leaks.
+  if (window.attachEvent) {
+    window.attachEvent("onunload", destroyCache);
+  }
+
+  // Safari has a dummy event handler on page unload so that it won't
+  // use its bfcache. Safari <= 3.1 has an issue with restoring the "document"
+  // object when page is returned to via the back button using its bfcache.
+  if (Prototype.Browser.WebKit) {
+    window.addEventListener('unload', Prototype.emptyFunction, false);
+  }
+
+  return {
+    observe: function(element, eventName, handler) {
+      element = $(element);
+      var name = getDOMEventName(eventName);
+
+      var wrapper = createWrapper(element, eventName, handler);
+      if (!wrapper) return element;
+
+      if (element.addEventListener) {
+        element.addEventListener(name, wrapper, false);
+      } else {
+        element.attachEvent("on" + name, wrapper);
+      }
+
+      return element;
+    },
+
+    stopObserving: function(element, eventName, handler) {
+      element = $(element);
+      var id = getEventID(element), name = getDOMEventName(eventName);
+
+      if (!handler && eventName) {
+        getWrappersForEventName(id, eventName).each(function(wrapper) {
+          element.stopObserving(eventName, wrapper.handler);
+        });
+        return element;
+
+      } else if (!eventName) {
+        Object.keys(getCacheForID(id)).each(function(eventName) {
+          element.stopObserving(eventName);
+        });
+        return element;
+      }
+
+      var wrapper = findWrapper(id, eventName, handler);
+      if (!wrapper) return element;
+
+      if (element.removeEventListener) {
+        element.removeEventListener(name, wrapper, false);
+      } else {
+        element.detachEvent("on" + name, wrapper);
+      }
+
+      destroyWrapper(id, eventName, handler);
+
+      return element;
+    },
+
+    fire: function(element, eventName, memo) {
+      element = $(element);
+      if (element == document && document.createEvent && !element.dispatchEvent)
+        element = document.documentElement;
+
+      var event;
+      if (document.createEvent) {
+        event = document.createEvent("HTMLEvents");
+        event.initEvent("dataavailable", true, true);
+      } else {
+        event = document.createEventObject();
+        event.eventType = "ondataavailable";
+      }
+
+      event.eventName = eventName;
+      event.memo = memo || { };
+
+      if (document.createEvent) {
+        element.dispatchEvent(event);
+      } else {
+        element.fireEvent(event.eventType, event);
+      }
+
+      return Event.extend(event);
+    }
+  };
+})());
+
+Object.extend(Event, Event.Methods);
+
+Element.addMethods({
+  fire:          Event.fire,
+  observe:       Event.observe,
+  stopObserving: Event.stopObserving
+});
+
+Object.extend(document, {
+  fire:          Element.Methods.fire.methodize(),
+  observe:       Element.Methods.observe.methodize(),
+  stopObserving: Element.Methods.stopObserving.methodize(),
+  loaded:        false
+});
+
+(function() {
+  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
+     Matthias Miller, Dean Edwards and John Resig. */
+
+  var timer;
+
+  function fireContentLoadedEvent() {
+    if (document.loaded) return;
+    if (timer) window.clearInterval(timer);
+    document.fire("dom:loaded");
+    document.loaded = true;
+  }
+
+  if (document.addEventListener) {
+    if (Prototype.Browser.WebKit) {
+      timer = window.setInterval(function() {
+        if (/loaded|complete/.test(document.readyState))
+          fireContentLoadedEvent();
+      }, 0);
+
+      Event.observe(window, "load", fireContentLoadedEvent);
+
+    } else {
+      document.addEventListener("DOMContentLoaded",
+        fireContentLoadedEvent, false);
+    }
+
+  } else {
+    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
+    $("__onDOMContentLoaded").onreadystatechange = function() {
+      if (this.readyState == "complete") {
+        this.onreadystatechange = null;
+        fireContentLoadedEvent();
+      }
+    };
+  }
+})();
+/*------------------------------- DEPRECATED -------------------------------*/
+
+Hash.toQueryString = Object.toQueryString;
+
+var Toggle = { display: Element.toggle };
+
+Element.Methods.childOf = Element.Methods.descendantOf;
+
+var Insertion = {
+  Before: function(element, content) {
+    return Element.insert(element, {before:content});
+  },
+
+  Top: function(element, content) {
+    return Element.insert(element, {top:content});
+  },
+
+  Bottom: function(element, content) {
+    return Element.insert(element, {bottom:content});
+  },
+
+  After: function(element, content) {
+    return Element.insert(element, {after:content});
+  }
+};
+
+var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
+
+// This should be moved to script.aculo.us; notice the deprecated methods
+// further below, that map to the newer Element methods.
+var Position = {
+  // set to true if needed, warning: firefox performance problems
+  // NOT neeeded for page scrolling, only if draggable contained in
+  // scrollable elements
+  includeScrollOffsets: false,
+
+  // must be called before calling withinIncludingScrolloffset, every time the
+  // page is scrolled
+  prepare: function() {
+    this.deltaX =  window.pageXOffset
+                || document.documentElement.scrollLeft
+                || document.body.scrollLeft
+                || 0;
+    this.deltaY =  window.pageYOffset
+                || document.documentElement.scrollTop
+                || document.body.scrollTop
+                || 0;
+  },
+
+  // caches x/y coordinate pair to use with overlap
+  within: function(element, x, y) {
+    if (this.includeScrollOffsets)
+      return this.withinIncludingScrolloffsets(element, x, y);
+    this.xcomp = x;
+    this.ycomp = y;
+    this.offset = Element.cumulativeOffset(element);
+
+    return (y >= this.offset[1] &&
+            y <  this.offset[1] + element.offsetHeight &&
+            x >= this.offset[0] &&
+            x <  this.offset[0] + element.offsetWidth);
+  },
+
+  withinIncludingScrolloffsets: function(element, x, y) {
+    var offsetcache = Element.cumulativeScrollOffset(element);
+
+    this.xcomp = x + offsetcache[0] - this.deltaX;
+    this.ycomp = y + offsetcache[1] - this.deltaY;
+    this.offset = Element.cumulativeOffset(element);
+
+    return (this.ycomp >= this.offset[1] &&
+            this.ycomp <  this.offset[1] + element.offsetHeight &&
+            this.xcomp >= this.offset[0] &&
+            this.xcomp <  this.offset[0] + element.offsetWidth);
+  },
+
+  // within must be called directly before
+  overlap: function(mode, element) {
+    if (!mode) return 0;
+    if (mode == 'vertical')
+      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+        element.offsetHeight;
+    if (mode == 'horizontal')
+      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+        element.offsetWidth;
+  },
+
+  // Deprecation layer -- use newer Element methods now (1.5.2).
+
+  cumulativeOffset: Element.Methods.cumulativeOffset,
+
+  positionedOffset: Element.Methods.positionedOffset,
+
+  absolutize: function(element) {
+    Position.prepare();
+    return Element.absolutize(element);
+  },
+
+  relativize: function(element) {
+    Position.prepare();
+    return Element.relativize(element);
+  },
+
+  realOffset: Element.Methods.cumulativeScrollOffset,
+
+  offsetParent: Element.Methods.getOffsetParent,
+
+  page: Element.Methods.viewportOffset,
+
+  clone: function(source, target, options) {
+    options = options || { };
+    return Element.clonePosition(target, source, options);
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
+  function iter(name) {
+    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
+  }
+
+  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
+  function(element, className) {
+    className = className.toString().strip();
+    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
+    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
+  } : function(element, className) {
+    className = className.toString().strip();
+    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
+    if (!classNames && !className) return elements;
+
+    var nodes = $(element).getElementsByTagName('*');
+    className = ' ' + className + ' ';
+
+    for (var i = 0, child, cn; child = nodes[i]; i++) {
+      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
+          (classNames && classNames.all(function(name) {
+            return !name.toString().blank() && cn.include(' ' + name + ' ');
+          }))))
+        elements.push(Element.extend(child));
+    }
+    return elements;
+  };
+
+  return function(className, parentElement) {
+    return $(parentElement || document.body).getElementsByClassName(className);
+  };
+}(Element.Methods);
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+  initialize: function(element) {
+    this.element = $(element);
+  },
+
+  _each: function(iterator) {
+    this.element.className.split(/\s+/).select(function(name) {
+      return name.length > 0;
+    })._each(iterator);
+  },
+
+  set: function(className) {
+    this.element.className = className;
+  },
+
+  add: function(classNameToAdd) {
+    if (this.include(classNameToAdd)) return;
+    this.set($A(this).concat(classNameToAdd).join(' '));
+  },
+
+  remove: function(classNameToRemove) {
+    if (!this.include(classNameToRemove)) return;
+    this.set($A(this).without(classNameToRemove).join(' '));
+  },
+
+  toString: function() {
+    return $A(this).join(' ');
+  }
+};
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+
+/*--------------------------------------------------------------------------*/
+
+Element.addMethods();
Index: /ether_2012/web/resources/js/maj.js
===================================================================
--- /ether_2012/web/resources/js/maj.js	(revision 319)
+++ /ether_2012/web/resources/js/maj.js	(revision 319)
@@ -0,0 +1,266 @@
+/** ***************************************************** **/
+/** ********************** MEDIAS *********************** **/
+/** ***************************************************** **/
+
+// Fonction permettant de mettre Ã  jour la liste des noms de plateforme lors d'une modif du nom d'une plateforme
+function majListPlat(num) {
+	var td = document.getElementById("cadreCapts");
+	var selects = td.getElementsByTagName("select");
+	var noms = document.getElementsByName("metadata.contenuPrevu.plateformes["+num+"].nom");
+	var nomsOth = document.getElementsByName("metadata.contenuPrevu.plateformes["+num+"].nomOth");
+	var nom;
+	for (var numsel = 0; numsel < selects.length ; numsel++) {
+		if (numsel % 2 != 0) {
+			var options = selects[numsel].getElementsByTagName("option");
+			if (noms[0].value == "-")
+				nom = nomsOth[0].value;
+			else
+				nom = noms[0].value;
+			options[num].value = nom;
+			options[num].text = nom;
+		}
+	}
+}
+
+//Fonction permettant de mettre Ã  jour la liste des noms de capteurs lors d'une modif du type/fabriquant/modÃšle/NÂ° de sÃ©rie d'un capteur
+function majListCapt(num) {
+	var td = document.getElementById("cadreParams");
+	var selects = td.getElementsByTagName("select");
+	var types = document.getElementsByName("metadata.contenuPrevu.capteurs["+num+"].type");
+	var typesOth = document.getElementsByName("metadata.contenuPrevu.capteurs["+num+"].typeOth");
+	var fabs = document.getElementsByName("metadata.contenuPrevu.capteurs["+num+"].fabriquant");
+	var mods = document.getElementsByName("metadata.contenuPrevu.capteurs["+num+"].modele");
+	var nums = document.getElementsByName("metadata.contenuPrevu.capteurs["+num+"].num");
+	var type;
+	var mod, fab, numSe;
+	for (var numsel = 0; numsel < selects.length ; numsel++) {
+		if (numsel % 4 == 3) {
+			var options = selects[numsel].getElementsByTagName("option");
+			if (types[0].value == "-")
+				type = typesOth[0].value;
+			else
+				type = types[0].value;
+			if (fabs[0].value == "")
+				fab = "";
+			else
+				fab = " "+fabs[0].value;
+			if (mods[0].value == "")
+				mod = "";
+			else
+				mod = " "+mods[0].value;
+			if (nums[0].value == "")
+				numSe = "";
+			else
+				numSe = " "+nums[0].value;
+			options[num].value = type+fab+mod+numSe;
+			options[num].text = type+fab+mod+numSe;
+		}
+	}
+}
+
+//
+function majListParam(index,num) {
+	var sel = document.getElementById("paramNom_"+num);
+	if (index == 0) {
+		sel.innerHTML = '<option value="-">-</option>';
+	} else if (index == 1) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="222Rn (Radon 222)">222Rn (Radon 222)</option>'+
+						'<option value="CH3OH (Methanol)">CH3OH (Methanol)</option>'+
+						'<option value="CH4 (Methane)">CH4 (Methane)</option>'+
+						'<option value="CO (Carbon Monoxide)">CO (Carbon Monoxide)</option>'+
+						'<option value="CO2 (Carbon Dioxide)">CO2 (Carbon Dioxide)</option>'+
+						'<option value="DMS (Dimethyl Sulfide)">DMS (Dimethyl Sulfide)</option>'+
+						'<option value="H2SO4g (Sulfuric Acid)">H2SO4g (Sulfuric Acid)</option>'+
+						'<option value="HCHO (Formaldehyde)">HCHO (Formaldehyde)</option>'+
+						'<option value="HO2 (Hydroxyl Peroxyl Radical)">HO2 (Hydroxyl Peroxyl Radical)</option>'+
+						'<option value="HONO (Nitrous Oxide)">HONO (Nitrous Oxide)</option>'+
+						'<option value="JNO2 (Photolysis Frequency JNO2)">JNO2 (Photolysis Frequency JNO2)</option>'+
+						'<option value="JO1D (Photolysis Frequency JO1D)">JO1D (Photolysis Frequency JO1D)</option>'+
+						'<option value="NO (Nitrogen Monoxide)">NO (Nitrogen Monoxide)</option>'+
+						'<option value="NO2 (Nitrogen Dioxide)">NO2 (Nitrogen Dioxide)</option>'+
+						'<option value="NOx (Nitrogen Oxides)">NOx (Nitrogen Oxides)</option>'+
+						'<option value="Noy (Sum Reactive Nitrogen)">Noy (Sum Reactive Nitrogen)</option>'+
+						'<option value="O3 (Ozone)">O3 (Ozone)</option>'+
+						'<option value="OH (Hydroxyl Radical)">OH (Hydroxyl Radical)</option>'+
+						'<option value="PAN (Peroxyacetyl Nitrate)">PAN (Peroxyacetyl Nitrate)</option>'+
+						'<option value="RO2 (Peroxyl Radical)">RO2 (Peroxyl Radical)</option>'+
+						'<option value="SF6 (Sulfurhexafluoride)">SF6 (Sulfurhexafluoride)</option>'+
+						'<option value="SO2 (Sulfur Dioxide)">SO2 (Sulfur Dioxide)</option>';
+	} else if (index == 2) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="PM1 (AEROSOL MASS PM1)">PM1 (AEROSOL MASS PM1)</option>'+
+						'<option value="BBOA-PM1 (Biomass Burning Organic Aerosol)">BBOA-PM1 (Biomass Burning Organic Aerosol)</option>'+
+						'<option value="BC-PM1 (Black Carbon)">BC-PM1 (Black Carbon)</option>'+
+						'<option value="Cl-PM1 (Chloride)">Cl-PM1 (Chloride)</option>'+
+						'<option value="HOA-PM1 (Hydrocarbon Like Organic Aerosol)">HOA-PM1 (Hydrocarbon Like Organic Aerosol)</option>'+
+						'<option value="LV-OOA-PM1 (Low Volatility Oxidised Organic Aerosol)">LV-OOA-PM1 (Low Volatility Oxidised Organic Aerosol)</option>'+
+						'<option value="NH4-PM1 (Ammonium)">NH4-PM1 (Ammonium)</option>'+
+						'<option value="NO3-PM1 (Nitrate)">NO3-PM1 (Nitrate)</option>'+
+						'<option value="OA-PM1 (Organic Aerosol)">OA-PM1 (Organic Aerosol)</option>'+
+						'<option value="OOA-PM1 (Oxidised Organic Aerosol)">OOA-PM1 (Oxidised Organic Aerosol)</option>'+
+						'<option value="SO4-PM1 (Sulfate)">SO4-PM1 (Sulfate)</option>'+
+						'<option value="SV-OOA-PM1 (Semivolatile Oxidised Organic Aerosol)">SV-OOA-PM1 (Semivolatile Oxidised Organic Aerosol)</option>'+
+						'<option value="PM2.5 (AEROSOL MASS PM2.5)">PM2.5 (AEROSOL MASS PM2.5)</option>'+
+						'<option value="BC-PM2.5 (Black Carbon)">BC-PM2.5 (Black Carbon)</option>'+
+						'<option value="C14-PM2.5 (Carbon-14)">C14-PM2.5 (Carbon-14)</option>'+
+						'<option value="Ca-PM2.5 (Calcium)">Ca-PM2.5 (Calcium)</option>'+
+						'<option value="Cl-PM2.5 (Chloride)">Cl-PM2.5 (Chloride)</option>'+
+						'<option value="EC-PM2.5 (Elemental Carbon)">EC-PM2.5 (Elemental Carbon)</option>'+
+						'<option value="K-PM2.5 (Potassium)">K-PM2.5 (Potassium)</option>'+
+						'<option value="Levo-PM2.5 (Levoglucosan)">Levo-PM2.5 (Levoglucosan)</option>'+
+						'<option value="Mg-PM2.5 (Magnesium)">Mg-PM2.5 (Magnesium)</option>'+
+						'<option value="Na-PM2.5 (Sodium)">Na-PM2.5 (Sodium)</option>'+
+						'<option value="NH4-PM2.5 (Ammonium)">NH4-PM2.5 (Ammonium)</option>'+
+						'<option value="NO3-PM2.5 (Nitrate)">NO3-PM2.5 (Nitrate)</option>'+
+						'<option value="OC-PM2.5 (Organic Carbon)">OC-PM2.5 (Organic Carbon)</option>'+
+						'<option value="SO4-PM2.5 (Sulfate)">SO4-PM2.5 (Sulfate)</option>'+
+						'<option value="TC-PM2.5 (Total Carbon)">TC-PM2.5 (Total Carbon)</option>'+
+						'<option value="WIOC-PM2.5 (Water Insoluble Organic Carbon)">WIOC-PM2.5 (Water Insoluble Organic Carbon)</option>'+
+						'<option value="WSOC-PM2.5 (Water Soluble Organic Carbon)">WSOC-PM2.5 (Water Soluble Organic Carbon)</option>';
+	} else if (index == 3) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="Bckscat 450 (Backscattering Coefficient 450 nm)">Bckscat 450 (Backscattering Coefficient 450 nm)</option>'+
+						'<option value="Bckscat 550 (Backscattering Coefficient 550 nm)">Bckscat 550 (Backscattering Coefficient 550 nm)</option>'+
+						'<option value="Bckscat 700 (Backscattering Coefficient 700 nm)">Bckscat 700 (Backscattering Coefficient 700 nm)</option>'+
+						'<option value="CCN (Condensation Nuclei Number/Concentration)">CCN (Condensation Nuclei Number/Concentration)</option>'+
+						'<option value="GF (Hygroscopic Growth Factor at 90% Humidity)">GF (Hygroscopic Growth Factor at 90% Humidity)</option>'+
+						'<option value="Lightabs 470 (Light Absorption Coefficient at 470nm)">Lightabs 470 (Light Absorption Coefficient at 470nm)</option>'+
+						'<option value="Lightabs 522 (Light Absorption Coefficient at 522nm)">Lightabs 522 (Light Absorption Coefficient at 522nm)</option>'+
+						'<option value="Lightabs 650 (Light Absorption Coefficient at 650nm)">Lightabs 650 (Light Absorption Coefficient at 650nm)</option>'+
+						'<option value="N (Particle Number / Concentration)">N (Particle Number / Concentration)</option>'+
+						'<option value="Scat 450 (Scattering Coefficient 450 nm)">Scat 450 (Scattering Coefficient 450 nm)</option>'+
+						'<option value="Scat 550 (Scattering Coefficient 550 nm)">Scat 550 (Scattering Coefficient 550 nm)</option>'+
+						'<option value="Scat 700 (Scattering Coefficient 700 nm)">Scat 700 (Scattering Coefficient 700 nm)</option>'+
+						'<option value="VFR (Volume Fraction Remaining at Heater Temperature 100Â°C)">VFR (Volume Fraction Remaining at Heater Temperature 100Â°C)</option>';
+	} else if (index == 4) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="Cloudfrac 0-3 (Cloud Fraction Low Level Clouds from 0 to 3 km)">Cloudfrac 0-3 (Cloud Fraction Low Level Clouds from 0 to 3 km)</option>'+
+						'<option value="Cloudfrac 3-7 (Cloud Fraction Medium Level Clouds from 3 to 7 km)">Cloudfrac 3-7 (Cloud Fraction Medium Level Clouds from 3 to 7 km)</option>'+
+						'<option value="Cloudfrac >7 (Cloud Fraction High Level Clouds >7 km)">Cloudfrac >7 (Cloud Fraction High Level Clouds >7 km)</option>'+
+						'<option value="DP (DewPoint)">DP (DewPoint)</option>'+
+						'<option value="Ext (Aerosol Extinction-Vertical Profile)">Ext (Aerosol Extinction-Vertical Profile)</option>'+
+						'<option value="MLD (Mixing Layer Height)">MLD (Mixing Layer Height)</option>'+
+						'<option value="P (Pressure)">P (Pressure)</option>'+
+						'<option value="P2m (Pressure 2m)">P2m (Pressure 2m)</option>'+
+						'<option value="PC (Cumulated Precipitation)">PC (Cumulated Precipitation)</option>'+
+						'<option value="PR (Precipitation Rate)">PR (Precipitation Rate)</option>'+
+						'<option value="PR-VP (Polarisation Ratio-Vertical Profile)">PR-VP (Polarisation Ratio-Vertical Profile)</option>'+
+						'<option value="R2 (Normalised Backscatter Ratio-Vertical Profile)">R2 (Normalised Backscatter Ratio-Vertical Profile)</option>'+
+						'<option value="RH (Relative Humidity)">RH (Relative Humidity)</option>'+
+						'<option value="RH2m (Relative Humidity 2m)">RH2m (Relative Humidity 2m)</option>'+
+						'<option value="SR (Solar Radiation)">SR (Solar Radiation)</option>'+
+						'<option value="T (Temperature)">T (Temperature)</option>'+
+						'<option value="T2m (Temperature 2m)">T2m (Temperature 2m)</option>'+
+						'<option value="UV (UV_index)">UV (UV_index)</option>'+
+						'<option value="WD (Wind Direction)">WD (Wind Direction)</option>'+
+						'<option value="WD10m (Wind Direction 10m)">WD10m (Wind Direction 10m)</option>'+
+						'<option value="WS (Wind Speed)">WS (Wind Speed)</option>'+
+						'<option value="WS-VP (Wind Speed-Vertical Profile)">WS-VP (Wind Speed-Vertical Profile)</option>'+
+						'<option value="WS10m (Wind Speed 10m)">WS10m (Wind Speed 10m)</option>';
+	} else if (index == 5) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="Alt (Altitude : Derived from pressure assuming Hydrostatic law along aircraft\'s trajectory)">Alt (Altitude : Derived from pressure assuming Hydrostatic law along aircraft\'s trajectory)</option>'+
+						'<option value="CLW (cloud_liquid_water_mixing_ratio : from King-Probe">CLW (cloud_liquid_water_mixing_ratio : from King-Probe</option>'+
+						'<option value="CO (chm_COvrai_Mozart_sync_1 : from Mozart instrument)">CO (chm_COvrai_Mozart_sync_1 : from Mozart instrument)</option>'+
+						'<option value="DSRIA (downwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer, not corrected for attitude angles)">DSRIA (downwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer, not corrected for attitude angles)</option>'+
+						'<option value="EW (eastward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)">EW (eastward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>'+
+						'<option value="Hei (Height : from radar-altimeter, range[0-15000] ft)">Hei (Height : from radar-altimeter, range[0-15000] ft)</option>'+
+						'<option value="Lat (Latitude : from INS)">Lat (Latitude : from INS)</option>'+
+						'<option value="Lon (Longitude : from INS)">Lon (Longitude : from INS)</option>'+
+						'<option value="NW (northward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)">NW (northward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>'+
+						'<option value="O3 (chm_Ozone_Mozart_sync_1 : from Mozart instrument)">O3 (chm_Ozone_Mozart_sync_1 : from Mozart instrument)</option>'+
+						'<option value="P (air_pressure : from first front sensor, corrected for the so-called static defect)">P (air_pressure : from first front sensor, corrected for the so-called static defect)</option>'+
+						'<option value="PO (platform_orientation : Geographic Heading, from INS)">PO (platform_orientation : Geographic Heading, from INS)</option>'+
+						'<option value="PPA (platform_pitch_angle : from INS)">PPA (platform_pitch_angle : from INS)</option>'+
+						'<option value="PRA (platform_roll_angle : from INS)">PRA (platform_roll_angle : from INS)</option>'+
+						'<option value="RH (humidity_mixing_ratio : from bottom dew-point hygrometer)">RH (humidity_mixing_ratio : from bottom dew-point hygrometer)</option>'+
+						'<option value="T (air_temperature : from non-deiced Rosemount 102 E2AL sensor)">T (air_temperature : from non-deiced Rosemount 102 E2AL sensor)</option>'+
+						'<option value="UAV (upward_air_velocity : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)">UAV (upward_air_velocity : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>'+
+						'<option value="USRIA (upwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer)">USRIA (upwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer)</option>'+
+						'<option value="WD (wind_from_direction : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)">WD (wind_from_direction : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>'+
+						'<option value="WS (wind_speed : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)">WS (wind_speed : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>';
+	} else if (index == 6) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="C2Cl4 (Tetrachloroethylene)">C2Cl4 (Tetrachloroethylene)</option>'+
+						'<option value="C2H4 (Ethylene)">C2H4 (Ethylene)</option>'+
+						'<option value="C2H6 (Ethane)">C2H6 (Ethane)</option>'+
+						'<option value="C3H6 (Propylene) ">C3H6 (Propylene) </option>'+
+						'<option value="C3H8 (Propane)">C3H8 (Propane)</option>'+
+						'<option value="i-C4H10 (Iso-butane)">i-C4H10 (Iso-butane)</option>'+
+						'<option value="n-C4H10 (N-butane)">n-C4H10 (N-butane)</option>'+
+						'<option value="C5H8 (Isoprene)">C5H8 (Isoprene)</option>'+
+						'<option value="i-C5H12 (Iso-pentane)">i-C5H12 (Iso-pentane)</option>'+
+						'<option value="n-C5H12 (N-pentane)">n-C5H12 (N-pentane)</option>'+
+						'<option value="C6H3Cl3 (Benzene, 1,2,4-trichloro-)">C6H3Cl3 (Benzene, 1,2,4-trichloro-)</option>'+
+						'<option value="C6H4(CH3)(CH2CH3) (O-ethyltoluene)">C6H4(CH3)(CH2CH3) (O-ethyltoluene)</option>'+
+						'<option value="C6H4Cl2 (Benzene, 1,2-dichloro-)">C6H4Cl2 (Benzene, 1,2-dichloro-)</option>'+
+						'<option value="C6H5CHCH2 (Styrene)">C6H5CHCH2 (Styrene)</option>'+
+						'<option value="C6H5Cl (Benzene, chloro-)">C6H5Cl (Benzene, chloro-)</option>'+
+						'<option value="C6H5(CH2CH2CH3) (N-propylbenzene)">C6H5(CH2CH2CH3) (N-propylbenzene)</option>'+
+						'<option value="C6H5(CH2CH3) (Ethylbenzene)">C6H5(CH2CH3) (Ethylbenzene)</option>'+
+						'<option value="C6H6 (Benzene)">C6H6 (Benzene)</option>'+
+						'<option value="c-C6H12 (Cyclohexane)">c-C6H12 (Cyclohexane)</option>'+
+						'<option value="C6H14 (Hexane)">C6H14 (Hexane)</option>'+
+						'<option value="C7H8 (Toluene)">C7H8 (Toluene)</option>'+
+						'<option value="o-C7H8 (O-xylene)">o-C7H8 (O-xylene)</option>'+
+						'<option value="m+p-C7H8 (M,P-xylenes)">m+p-C7H8 (M,P-xylenes)</option>'+
+						'<option value="n-C7H16 (N-heptane)">n-C7H16 (N-heptane)</option>'+
+						'<option value="n-C8H18 (N-OCTANE)">n-C8H18 (N-OCTANE)</option>'+
+						'<option value="n-C9H20 (Nonane)">n-C9H20 (Nonane)</option>'+
+						'<option value="C10H8 (Naphthalene)">C10H8 (Naphthalene)</option>'+
+						'<option value="C10H16 (A-pinen)">C10H16 (A-pinen)</option>'+
+						'<option value="n-C10H22 (N-decane)">n-C10H22 (N-decane)</option>'+
+						'<option value="CCl4 (Carbon Tetrachloride) ">CCl4 (Carbon Tetrachloride) </option>'+
+						'<option value="CF2Cl2 (Dichlorodifluoromethane)">CF2Cl2 (Dichlorodifluoromethane)</option>'+
+						'<option value="CH2=CHCH=CH2 (1,3-butadiene)">CH2=CHCH=CH2 (1,3-butadiene)</option>'+
+						'<option value="CH2=CHCH2CH2CH2CH3 (1-hexene)">CH2=CHCH2CH2CH2CH3 (1-hexene)</option>'+
+						'<option value="CH2=CHCH2CH2CH3 (1-pentene)">CH2=CHCH2CH2CH3 (1-pentene)</option>'+
+						'<option value="CH2=CHCH2CH3 (1-butene)">CH2=CHCH2CH3 (1-butene)</option>'+
+						'<option value="c-(CH2CH2CH2CH2CH)CH3 (ME-cyclopentane)">c-(CH2CH2CH2CH2CH)CH3 (ME-cyclopentane)</option>'+
+						'<option value="c-(CH2CH2CH2CH2CH2CH)CH3 (ME-cyclohexane)">c-(CH2CH2CH2CH2CH2CH)CH3 (ME-cyclohexane)</option>'+
+						'<option value="CH2ClCHClCH3 (Propane, 1,2-dichloro-)">CH2ClCHClCH3 (Propane, 1,2-dichloro-)</option>'+
+						'<option value="(CH3)2C=CH2 (I-butene)">(CH3)2C=CH2 (I-butene)</option>'+
+						'<option value="(CH3)2CCH(CH3)CH(CH3)2 (2,3,4-TME-pentane)">(CH3)2CCH(CH3)CH(CH3)2 (2,3,4-TME-pentane)</option>'+
+						'<option value="(CH3)2CH=CHCH3 (2-ME-2-butene)">(CH3)2CH=CHCH3 (2-ME-2-butene)</option>'+
+						'<option value="(CH3)2CHCH2CH3 (2-ME pentane)">(CH3)2CHCH2CH3 (2-ME pentane)</option>'+
+						'<option value="(CH3)2CHCH2CH3 (3-ME-pentane)">(CH3)2CHCH2CH3 (3-ME-pentane)</option>'+
+						'<option value="(CH3)2CH(CH3)CHCH2CH3 (2,3-dimethyl pentane)">(CH3)2CH(CH3)CHCH2CH3 (2,3-dimethyl pentane)</option>'+
+						'<option value="(CH3)3CCH2CH(CH3)2 (2,2,4-TM-pentane)">(CH3)3CCH2CH(CH3)2 (2,2,4-TM-pentane)</option>'+
+						'<option value="cis-CH3CH=CHCH3 (CIS-2-butene)">cis-CH3CH=CHCH3 (CIS-2-butene)</option>'+
+						'<option value="t-CH3CH=CHCH2CH3 (Trans-2-pentene)">t-CH3CH=CHCH2CH3 (Trans-2-pentene)</option>'+
+						'<option value="t-CH3CH=CHCH3 (Trans-2-butene)">t-CH3CH=CHCH3 (Trans-2-butene)</option>'+
+						'<option value="CH3CH2CH(CH3)CHCH2CH2CH3 (3-ME-heptane)">CH3CH2CH(CH3)CHCH2CH2CH3 (3-ME-heptane)</option>'+
+						'<option value="CH3CH2CH(CH3)CHCH2CH3 (3-ME-hexane)">CH3CH2CH(CH3)CHCH2CH3 (3-ME-hexane)</option>'+
+						'<option value="CH3CHO (Acetaldehyde)">CH3CHO (Acetaldehyde)</option>'+
+						'<option value="CHCl2CH2Cl (Ethane, 1,1,2-trichloro-)">CHCl2CH2Cl (Ethane, 1,1,2-trichloro-)</option>'+
+						'<option value="CHCl3 (Trichloromethane)">CHCl3 (Trichloromethane)</option>'+
+						'<option value="CH3CN (Acetonitrile)">CH3CN (Acetonitrile)</option>'+
+						'<option value="CH3COOCH2CH3 (Ethyl acetate)">CH3COOCH2CH3 (Ethyl acetate)</option>'+
+						'<option value="1,2,4 TMB (1,2,4-trimethylbenzene)">1,2,4 TMB (1,2,4-trimethylbenzene)</option>'+
+						'<option value="1,3,5 TMB (1,3,5-trimethylbenzene)">1,3,5 TMB (1,3,5-trimethylbenzene)</option>';
+	} else if (index == 7) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="m/z 43 (Sum propene, acetic acid + acetone + PAN + alkanes & alkenes fragments)">m/z 43 (Sum propene, acetic acid + acetone + PAN + alkanes & alkenes fragments)</option>'+
+						'<option value="m/z 47 (Sum formic acid, ethanol)">m/z 47 (Sum formic acid, ethanol)</option>'+
+						'<option value="m/z 57 (Sum mtbe + alkanes + butanol fragments + acrolein + butene isomers)">m/z 57 (Sum mtbe + alkanes + butanol fragments + acrolein + butene isomers)</option>'+
+						'<option value="m/z 59 (Sum acetone + propanal + glyoxal)">m/z 59 (Sum acetone + propanal + glyoxal)</option>'+
+						'<option value="m/z 61 (Sum acetic acid, ethyl acetate fragment)">m/z 61 (Sum acetic acid, ethyl acetate fragment)</option>'+
+						'<option value="m/z 71 (Sum Methacrolein + Methyl vinyl Ketone)">m/z 71 (Sum Methacrolein + Methyl vinyl Ketone)</option>'+
+						'<option value="m/z 73 (Sum Methyl ethyl ketone, butanal, Methyl glyoxal + C5-C9 n-aldehydes)">m/z 73 (Sum Methyl ethyl ketone, butanal, Methyl glyoxal + C5-C9 n-aldehydes)</option>'+
+						'<option value="m/z 75 (Sum butanol, hydroxyacetone)">m/z 75 (Sum butanol, hydroxyacetone)</option>'+
+						'<option value="m/z 77 (Sum peroxyacetic nitric anhydride PAN)">m/z 77 (Sum peroxyacetic nitric anhydride PAN)</option>'+
+						'<option value="m/z 81 (Sum hexenal + monoterpenes fragments)">m/z 81 (Sum hexenal + monoterpenes fragments)</option>'+
+						'<option value="m/z 83 (Sum cis hexenol + hexanal fragments, hexadienes, cyclohexene, methyl furan + C5-C9 n-aldehydes)">m/z 83 (Sum cis hexenol + hexanal fragments, hexadienes, cyclohexene, methyl furan + C5-C9 n-aldehydes)</option>'+
+						'<option value="m/z 85 (Sum ethyl vinyl ketone + alkanes & alkenes fragments)">m/z 85 (Sum ethyl vinyl ketone + alkanes & alkenes fragments)</option>'+
+						'<option value="m/z 87 (Sum 2-methyl-3-butanol, C carbonyls)">m/z 87 (Sum 2-methyl-3-butanol, C carbonyls)</option>'+
+						'<option value="m/z 97 (Sum furan derivatives + C5-C9 n-aldehydes)">m/z 97 (Sum furan derivatives + C5-C9 n-aldehydes)</option>'+
+						'<option value="m/z 101 (Sum isoprene hydroperoxides + hexanal + cis hexenol)">m/z 101 (Sum isoprene hydroperoxides + hexanal + cis hexenol)</option>'+
+						'<option value="m/z 105 (Sum styrene, PiBN)">m/z 105 (Sum styrene, PiBN)</option>'+
+						'<option value="m/z 107 (Sum C8 aromatics + benzaldehyde)">m/z 107 (Sum C8 aromatics + benzaldehyde)</option>'+
+						'<option value="m/z 121 (Sum C9 aromatics + tolualdehyde)">m/z 121 (Sum C9 aromatics + tolualdehyde)</option>'+
+						'<option value="m/z 137 (Sum monoterpenes)">m/z 137 (SUM monoterpenes)</option>'+
+						'<option value="m/z 151 (Pinonaldehyde)">m/z 151 (Pinonaldehyde)</option>'+
+						'<option value="m/z 153 (Vanillin)">m/z 153 (Vanillin)</option>';
+	}
+}
Index: /ether_2012/web/resources/jsp/etherHead.jsp
===================================================================
--- /ether_2012/web/resources/jsp/etherHead.jsp	(revision 319)
+++ /ether_2012/web/resources/jsp/etherHead.jsp	(revision 319)
@@ -0,0 +1,9 @@
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<ether:htmlJs jsFile="library/prototype/prototype"/>
+<ether:htmlJs jsFile="Request"/>
+<ether:htmlJs jsFile="DomHelper"/>
+<ether:htmlJs jsFile="etherHelper"/>
+<ether:htmlJs jsFile="etherClasses"/>
+<ether:htmlJs jsFile="Loading"/>
+
Index: /ether_2012/web/resources/template/templateMegapoli.jsp
===================================================================
--- /ether_2012/web/resources/template/templateMegapoli.jsp	(revision 319)
+++ /ether_2012/web/resources/template/templateMegapoli.jsp	(revision 319)
@@ -0,0 +1,193 @@
+<%@ page language="java" import="com.ether.WebException" %>
+<%@ page import="com.ether.user.UserRole" %>
+<%@ page import="com.medias.Context" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+
+<HTML>
+<HEAD>
+    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+    <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
+
+    <title><tiles:getAsString name="title"/></title>
+    <link rel="shortcut icon" href="<html:rewrite page='/resources/images/megapoli/favicon.ico'/>">
+
+    <ether:htmlCss cssFile="apycom.com-4-steel-blue/menu"/>
+    <ether:htmlCss cssFile="button"/>
+    <ether:htmlCss cssFile="complexButton"/>
+    <ether:htmlCss cssFile="TwitterLogin/front"/>
+    <ether:htmlCss cssFile="jquery-ui-1.8.16.custom/jquery-ui-1.8.16.custom"/>
+    <ether:htmlCss cssFile="ether"/>
+    <ether:htmlCss cssFile="megapoli"/>
+
+    <ether:htmlJs jsFile="library/jquery-1.4.2.min"/>
+    <ether:htmlJs jsFile="library/jquery.class"/>
+    <ether:htmlJs jsFile="library/jquery.protify-0.3"/>
+    <ether:htmlJs jsFile="classesForJQuery/etherHelper"/>
+    <ether:htmlJs jsFile="classesForJQuery/Button"/>
+    <ether:htmlJs jsFile="classesForJQuery/ComplexButton"/>
+    <ether:htmlJs jsFile="classesForJQuery/LoginButton"/>
+    <ether:htmlJs jsFile="classesForJQuery/Slide"/>
+    <ether:htmlJs jsFile="apycom.com-4-steel-blue/menu"/>
+    <ether:htmlJs jsFile="TwitterLogin/javascripts/jquery.tipsy"/>
+    <ether:htmlJs jsFile="jquery-ui-1.8.16.custom/js/jquery-ui-1.8.16.custom.min"/>
+
+    <ether:htmlResourceJsp jspFile="megapoliHead"/>
+
+    <tiles:insert attribute="insertCss"/>
+    <tiles:insert attribute="insertJsOrJsp"/>
+</HEAD>
+
+<BODY>
+<a name="top"></a>
+
+<bean:define id="upload" value="upload"/>
+<bean:define id="access" value="access"/>
+
+<%-- ************************************************************************************************************** --%>
+<%-- *************************************************** LOGO ETHER *********************************************** --%>
+<%-- ************************************************************************************************************** --%>
+<div id="linkLogoEther" class="containerLinkLogoEther"></div>
+
+<div id="logoEther" class="containerLogoEther">
+    <html:link href="http://ether.ipsl.jussieu.fr" target="help"><img src="resources/images/logo_Ether.jpg" width="80px" height="80px"/></html:link>
+</div>
+
+<%-- ************************************************************************************************************** --%>
+<%-- **************************************************** WRAPPER ************************************************* --%>
+<%-- ************************************************************************************************************** --%>
+<div class="pageWrapper">
+
+    <%-- ****************** TITLE & TOOLS ****************** --%>
+    <div id="title_tools" class="containerMegapoli">
+        <div id="title"></div>
+
+        <div id="tools" align="right">
+            <div id="loginModule" align="right"></div>
+        </div>
+
+    </div>
+
+    <%-- ****************** LOGO ****************** --%>
+    <div id="logo" class="containerLogo">
+        <html:link href="http://megapoli.dmi.dk/" target="help" titleKey="app.linkmegapoli">
+            <html:img page="/resources/images/logo_Megapoli_white.png" height="110px" width="110px" altKey="app.home"/>
+        </html:link>
+    </div>
+
+    <%-- ****************** NAV ****************** --%>
+    <div id="nav" class="containerNav"><tiles:insert attribute="nav"/></div>
+
+    <%-- ****************** MENU ****************** --%>
+    <div id="menu" class="containerMenu">
+        <ul class="menu">
+            <li>
+                <html:link page="/data?methodName=viewCatalogResume" paramName="access" paramId="source">
+                    <span><bean:message key="data.access"/></span>
+                </html:link>
+                <div>
+                    <ul>
+                        <li><html:link page="/JeuxAccess.do"><span><bean:message key="data.access.jeux"/></span></html:link></li>
+                        <li><html:link page="/data?methodName=viewParameters"><span><bean:message key="data.access.param"/></span></html:link></li>
+                        <li><html:link page="/CapteursAccess.do"><span><bean:message key="data.access.capt"/></span></html:link></li>
+                        <li><html:link page="/data?methodName=viewPlateforms"><span><bean:message key="data.access.plat"/></span></html:link></li>
+                    </ul>
+                </div>
+            </li>
+
+            <li>
+                <html:link page="/data?methodName=viewDataResume" paramName="access" paramId="source">
+                    <span><bean:message key="app.data"/></span>
+                </html:link>
+                <div id="menuData"></div>
+            </li>
+
+            <li class="last">
+                <html:link page="/visualization?methodName=view"><span><bean:message key="visualization"/></span></html:link>
+                <div>
+                    <ul>
+                        <li><html:link page="/visualization?methodName=viewParametersByPlateform"><span><bean:message key="visualization"/></span></html:link></li>
+                        <li><html:link page="/visualization?methodName=viewInWork"><span><bean:message key="simulation.visualization"/></span></html:link></li>
+                    </ul>
+                </div>
+            </li>
+
+        </ul>
+    </div>
+
+    <%-- ****************** TITLE CONTENT ****************** --%>
+    <div id="titleContent" class="containerTitleContent"><tiles:insert attribute="bodytitle"/>
+        <div id="titleContentBorder" class="containerTitleContentBorder"></div>
+    </div>
+
+    <%-- ****************** CONTENT ****************** --%>
+    <div id="containerCenter" class="containerMegapoli containerCenter">
+        <tiles:insert attribute="body"/>
+    </div>
+
+    <%-- ****************** BOTTOM ****************** --%>
+    <div id="containerBottom" class="containerMegapoli containerBottom" align="right">
+        &copy; 2010-2011 <html:link href="http://ether.ipsl.jussieu.fr" target="help">ETHER&nbsp;</html:link>/ CNRS
+    </div>
+
+</div>
+
+<%-- ************************************************************************************************************** --%>
+<%-- **************************************************** SLIDES ************************************************** --%>
+<%-- ************************************************************************************************************** --%>
+<%--<div id="hideSlide" class="containerSlide"></div>--%>
+<div id="creditSlide" class="containerSlide"></div>
+<div id="mentionSlide" class="containerSlide"></div>
+<div id="infoSlide" class="containerSlide"></div>
+
+<script type="text/javascript">
+    var templateTexts = $A( "" );
+    templateTexts["app.home"] = '<bean:message key="app.home"/>';
+    templateTexts["app.fulltitle"] = '<bean:message key="app.fulltitle"/>';
+    templateTexts["app.en"] = '<bean:message key="app.en"/>';
+    templateTexts["app.fr"] = '<bean:message key="app.fr"/>';
+    templateTexts["data.upload.metadata.contact.mail"] = '<bean:message key="data.upload.metadata.contact.mail"/>';
+    templateTexts["data.access.extract.short"] = '<bean:message key="data.access.extract.short"/>';
+    templateTexts["data.upload.short"] = '<bean:message key="data.upload.short"/>';
+    templateTexts["app.backoffice"] = '<bean:message key="app.backoffice"/>';
+    templateTexts["app.backoffice.help"] = '<bean:message key="app.backoffice.help"/>';
+
+    templateTexts["app.credits"] = '<bean:message key="app.credits"/>';
+    templateTexts["app.mentions"] = '<bean:message key="app.mentions"/>';
+    templateTexts["app.infos"] = '<bean:message key="app.infos"/>';
+    templateTexts["login.dataProtocolAccept"] = "<bean:message key="login.dataProtocolAccept"/>";
+    templateTexts["login.dataProtocolFields"] = "<bean:message key="login.dataProtocolFields"/>";
+    templateTexts["login.dataProtocol.account"] = "<bean:message key="login.dataProtocol.account"/>";
+    templateTexts["<%=WebException.WebCode.USER_ALREADY_EXISTS%>"] = "<bean:message key="login.dataProtocol.alreadyExist"/>";
+
+    // Needed texts if you use the library LoginButton.js
+    var loginTexts = $A( "" );
+    loginTexts["app.connexion"] = '<bean:message key="app.connexion"/>';
+    loginTexts["login"] = '<bean:message key="login"/>';
+    loginTexts["login.password"] = '<bean:message key="login.password"/>';
+    loginTexts["login.sign"] = '<bean:message key="login.sign"/>';
+    loginTexts["login.pwdForget"] = '<bean:message key="login.pwdForget"/>';
+    loginTexts["login.loginForget"] = '<bean:message key="login.loginForget"/>';
+    loginTexts["login.loginForget.help"] = '<bean:message key="login.loginForget.help"/>';
+    loginTexts["login.inscription"] = '<bean:message key="login.inscription"/>';
+    loginTexts["login.error.notFound"] = "<bean:message key='login.error.notFound'/>";
+    loginTexts["login.error.wrongPassword"] = "<bean:message key='login.error.wrongPassword'/>";
+    loginTexts["login.error.failed"] = "<bean:message key='login.error.failed' arg0="<%=Context.getWebmaster( request )%>"/>";
+    loginTexts["login.error.notAccepted"] = "<bean:message key='login.error.notAccepted'/>";
+    loginTexts["login.text"] = "<bean:message key="login.text"/>";
+    loginTexts["<%=UserRole.ADMINISTRATOR%>"] = '<bean:message key="app.administrator"/>';
+    loginTexts["<%=UserRole.TECHNICIEN%>"] = '<bean:message key="app.technician"/>';
+    loginTexts["<%=UserRole.COORDINATOR%>"] = '<bean:message key="app.coordinator"/>';
+
+    var interfaceTemplate = new InterfaceTemplate();
+</script>
+
+<div style="visibility:hidden"><a href="http://apycom.com/">Apycom jQuery Menus</a></div>
+
+</BODY>
+</HTML>
Index: /ether_2012/web/src/com/ether/Controller.java
===================================================================
--- /ether_2012/web/src/com/ether/Controller.java	(revision 319)
+++ /ether_2012/web/src/com/ether/Controller.java	(revision 319)
@@ -0,0 +1,89 @@
+package com.ether;
+
+import com.ether.annotation.ControllerMethod;
+import com.ether.annotation.Mandatory;
+import com.ether.annotation.ParamName;
+import net.sf.json.JSONObject;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Required;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author vmipsl
+ * @date 17 feb 2011
+ */
+public class Controller
+        extends ControllerEther
+{
+    /** *********************************************************** **/
+    /** *********************** VIEWS ***************************** **/
+    /**
+     * ********************************************************** *
+     */
+    // Default view if url's methodName is unknown
+    @ControllerMethod(view = "init")
+    public Map<String, Object> home()
+            throws WebException
+    {
+         return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_VISUALIZATION)
+    public Map<String, Object> view()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_VISUALIZATION_PLATEFORM)
+    public Map<String, Object> viewAllPlateforms()
+            throws ServiceException
+    {
+        final List<Plateform> plateforms = _etherService.getAllPlateforms();
+
+        final Map<String, Object> model = new HashMap<String, Object>();
+        model.put( "plateforms", getJsonHelper().toJSON( plateforms ) );
+        return model;
+    }
+
+    /** *********************************************************** **/
+    /** *********************** CALLS ***************************** **/
+    /**
+     * ********************************************************** *
+     */
+    @ControllerMethod(jsonResult = true)
+    public JSONObject searchParametersByPlateform( @Mandatory @ParamName(ParameterConstants.PARAMETER_ID) final Integer plateformId )
+            throws ServiceException, WebException
+    {
+//        final List<Parameter> parameters = new ArrayList<Parameter>( 3 );
+//        parameters.add( new Parameter( Long.valueOf( 1 ), "parameter1" ) );
+//        parameters.add( new Parameter( Long.valueOf( 2 ), "parameter2" ) );
+//        parameters.add( new Parameter( Long.valueOf( 3 ), "parameter3" ) );
+
+        final List<Parameter> parameters = _etherService.getAllParametersByPlateformId( plateformId );
+        final JSONObject result = new JSONObject();
+        result.put( "parameters", getJsonHelper().toJSON( parameters ) );
+        return result;
+    }
+
+    @Required
+    public void setEtherService( @NotNull final EtherService etherService )
+    {
+        _etherService = etherService;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( Controller.class );
+
+    private static final String VIEW_VISUALIZATION = "visualization/visu";
+    private static final String VIEW_VISUALIZATION_PLATEFORM = "visualization/visu_plateform";
+
+    private EtherService _etherService;
+}
Index: /ether_2012/web/src/com/ether/ControllerEther.java
===================================================================
--- /ether_2012/web/src/com/ether/ControllerEther.java	(revision 319)
+++ /ether_2012/web/src/com/ether/ControllerEther.java	(revision 319)
@@ -0,0 +1,252 @@
+package com.ether;
+
+import java.io.UnsupportedEncodingException;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.security.InvalidParameterException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import net.sf.json.JSON;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONNull;
+import net.sf.json.JSONObject;
+import net.sf.json.util.JSONUtils;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.beans.factory.annotation.Required;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.AbstractController;
+import org.springframework.web.servlet.mvc.multiaction.MethodNameResolver;
+import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;
+
+import com.ether.annotation.ControllerMethod;
+import com.ether.annotation.Mandatory;
+import com.ether.annotation.ParamName;
+import com.ether.annotation.UseJSON;
+
+public class ControllerEther extends AbstractController
+{
+	@Override
+	@Nullable
+	protected ModelAndView handleRequestInternal(@NotNull final HttpServletRequest request, @NotNull final HttpServletResponse response)
+		throws WebException
+	{
+		try {
+			if (!_initialized)
+				initialize();
+
+			request.setCharacterEncoding(UTF8Charset.getEncoding());
+			
+			// Get method to call
+			final String methodName = _methodNameResolver.getHandlerMethodName(request);
+
+			final MethodDescription methodDescription = _methods.get(methodName);
+			if (null == methodDescription) {
+				WebHelper.displayAjaxError(response, methodName);
+				if (LOGGER.isWarnEnabled())
+					LOGGER.warn(String.format("Controller=%1$s Method=%2$s METHOD NOT FOUND", getClass().getSimpleName(), methodName));
+				return null;
+			}
+
+			return invokeMethod(methodDescription, request, response);
+
+		} catch (UnsupportedEncodingException e) {
+			throw new WebException(WebException.WebCode.ERROR_UNSUPPORTED_UTF8_ENCODING, e);
+		} catch (NoSuchRequestHandlingMethodException e) {
+			throw new WebException(WebException.WebCode.ERROR_NO_REQUEST_HANDLING_METHOD, e);
+		}
+	}
+
+	@Nullable
+	private ModelAndView invokeMethod( @NotNull final MethodDescription methodDescription, @NotNull final HttpServletRequest request, @NotNull final HttpServletResponse response)
+		throws WebException 
+	{
+		try {
+			// Parse parameters
+			final Object[] params = buildParams(methodDescription, request);
+
+			// Invoke method (go to controller)
+			final Object result = methodDescription.getMethod().invoke(this, params);
+			
+			// Return result
+			if (!methodDescription.getView().isEmpty()) {
+				response.setStatus(HttpServletResponse.SC_OK);
+				if (result instanceof Map)
+					return new ModelAndView(methodDescription.getView(), (Map) result);
+				else
+					return new ModelAndView(methodDescription.getView(), "result", result);
+				
+			} else if (methodDescription.isJsonResult()) {
+				response.setStatus(HttpServletResponse.SC_OK);
+				final String jsonResult = convertToJson(result);
+				WebHelper.writeJsonToResponse(response, jsonResult);				
+				return null;
+			} else {
+				response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+				return null;
+			}
+			
+		} catch (Throwable e) {
+			throw new WebException(e);
+		}
+	}	
+	
+	@NotNull
+	private String convertToJson( @Nullable final Object object )
+    {
+        if( null == object)
+            return JSONNull.getInstance().toString();
+        if( object instanceof JSON )
+            return object.toString();
+        if( object instanceof Collection )
+            return _jsonHelper.toJSON( (Collection) object ).toString();
+        if( object.getClass().isArray() )
+            return _jsonHelper.toJSON( object ).toString();
+        if( object instanceof Number || object instanceof Boolean || object instanceof String )
+            return JSONUtils.valueToString( object );
+        return _jsonHelper.toJSON( object ).toString();
+    }
+
+	@NotNull
+	private Object[] buildParams(@NotNull final MethodDescription methodDescription, @NotNull final HttpServletRequest request) 
+		throws InvalidParameterException 
+	{
+		final List<Object> params = new ArrayList<Object>();
+		for (final ParamDescription paramDescription : methodDescription.getParams()) {
+			if (null == paramDescription) {
+				params.add(null);
+				continue;
+			}
+			final boolean canBeNull = !paramDescription.isPrimitive() && !paramDescription.isMandatory();
+			final String paramValue = WebHelper.getRequestParameter(request, paramDescription.getName(), null, canBeNull);
+			final boolean useJSON = paramDescription.isUsingJSON();
+			params.add(convertParameter(paramDescription.getType(), paramValue, useJSON));
+		}
+		return params.toArray(new Object[params.size()]);
+	}
+	
+	@Nullable
+	private Object convertParameter( @NotNull final Class paramType, @Nullable final String paramValue, final boolean useJSON )
+    {
+        if( null == paramValue )
+            return null;
+        if( useJSON )
+            return _jsonHelper.fromJSON( _jsonHelper.toJSON( paramValue ), paramType );
+        if( JSONObject.class.equals( paramType ) )
+            return _jsonHelper.toJSON( paramValue );
+        if( JSONArray.class.equals( paramType ) )
+            return _jsonHelper.toJSON( paramValue );
+        if( String.class .equals( paramType ) )
+            return paramValue;
+        if( Boolean.TYPE.equals( paramType ) || Boolean.class.equals( paramType ) )
+            return Boolean.valueOf( paramValue );
+        if( Integer.TYPE.equals( paramType ) || Integer.class.equals( paramType ) )
+            return Integer.valueOf( paramValue );
+        if( Long.TYPE.equals( paramType ) || Long.class.equals( paramType ) )
+            return Long.valueOf( paramValue );
+        if( Float.TYPE.equals( paramType ) || Float.class.equals( paramType ) )
+            return Float.valueOf( paramValue );
+        if( Double.TYPE.equals( paramType ) || Double.class.equals( paramType ) )
+            return Double.valueOf( paramValue );
+        if( Date.class.isAssignableFrom( paramType ) )
+            return new Date( Long.valueOf( paramValue ) );
+        if( paramType.isEnum() )
+            return Enum.valueOf( paramType, paramValue );
+        if( Map.class.isAssignableFrom( paramType ) )
+            return JSONObject.fromObject( paramValue );
+
+        throw new UnsupportedOperationException( "Unsupported: cast parameter to " + paramType.getName() );
+    }
+
+    private void initialize() 
+    	throws WebException
+    {
+        for( final Method method : getClass().getMethods() )
+        {
+            final ControllerMethod annotation = method.getAnnotation( ControllerMethod.class );
+            if( null != annotation )
+            {
+            	final MethodDescription methodDescription = new MethodDescription( method, annotation );
+            	fillMethodDescription( method, methodDescription );
+            	_methods.put( method.getName(), methodDescription );
+            }
+        }
+
+        _initialized = true;
+    }
+
+    private void fillMethodDescription( @NotNull final Method method, @NotNull final MethodDescription methodDescription ) 
+    	throws WebException
+    {
+        final Class<?>[] paramTypes = method.getParameterTypes();
+        final Annotation[][] paramAnnotations = method.getParameterAnnotations();
+
+        if(paramTypes.length != paramAnnotations.length)
+        	throw new WebException(WebException.WebCode.ERROR_NUMBER_OF_PARAM_TYPES_NOT_EQUAL_TO_PARAM_ANNOTATIONS, paramTypes.length+" "+paramAnnotations.length);
+         
+        for( int i = 0; i < paramTypes.length; ++i )
+        {
+            ParamName paramNameAnnotation = null;
+            Mandatory mandatoryAnnotation = null;
+            UseJSON useJSONAnnotation = null;
+            for( final Annotation paramAnnotation : paramAnnotations[i] )
+            {
+                if( paramAnnotation instanceof ParamName )
+                    paramNameAnnotation = (ParamName) paramAnnotation;
+                if( paramAnnotation instanceof Mandatory )
+                    mandatoryAnnotation = (Mandatory) paramAnnotation;
+                if( paramAnnotation instanceof UseJSON )
+                    useJSONAnnotation = (UseJSON) paramAnnotation;
+            }
+            if( null == paramNameAnnotation )
+                methodDescription.addNullParam();
+            else
+            {
+                final boolean mandatory = ( null != mandatoryAnnotation );
+                final boolean useJSON = ( null != useJSONAnnotation );
+                methodDescription.addParam( paramNameAnnotation.value(), paramTypes[i], mandatory, useJSON );
+            }
+        }
+    }    
+
+    
+    @Required
+    public void setMethodNameResolver( final MethodNameResolver methodNameResolver )
+    {
+        _methodNameResolver = methodNameResolver;
+    }
+
+    protected JSONHelper getJsonHelper()
+    {
+        return _jsonHelper;
+    }
+
+    @Required
+    public void setJsonHelper( final JSONHelper jsonHelper )
+    {
+    	_jsonHelper = jsonHelper;
+    }
+
+    protected Map<String, MethodDescription> getMethods()
+    {
+        return _methods;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( ControllerEther.class );
+   
+    private JSONHelper _jsonHelper;
+    private MethodNameResolver _methodNameResolver;
+    private Map<String, MethodDescription> _methods = new HashMap<String, MethodDescription>();
+    private boolean _initialized; /*=false*/
+}
Index: /ether_2012/web/src/com/ether/WebException.java
===================================================================
--- /ether_2012/web/src/com/ether/WebException.java	(revision 319)
+++ /ether_2012/web/src/com/ether/WebException.java	(revision 319)
@@ -0,0 +1,41 @@
+package com.ether;
+
+/**
+ * @author vmipsl
+ * @date 02 feb 2011 
+ */
+public class WebException 
+	extends FormattedException
+{
+    public WebException(final Enum<? extends Code> code) {
+    	super(code);
+	}
+
+	public WebException(final Enum<? extends Code> code, final Throwable cause, final Object... parameters) {
+    	this(code, cause.getMessage(), cause, parameters);
+    }
+
+    protected WebException(final Enum<? extends Code> code, final String message, final Throwable cause, final Object... parameters) {
+    	super(prefix(code, message), cause, parameters);
+    }
+
+	public WebException(final Throwable cause) {
+		super(cause);
+	}
+
+	public WebException( final Enum<? extends Code> code, final String string) {
+		super(code, string);
+	}
+
+	public static enum WebCode implements Code 
+    {
+		UNKNOWN, 
+		PERSISTENCE, 
+		SERVICE_PROBLEM,
+		PLATEFORME_ID_NOT_FOUND,
+		IO_EXCEPTION_ERROR_TO_GET_OUTPUTSTREAM,
+		ERROR_UNSUPPORTED_UTF8_ENCODING,
+		ERROR_NO_REQUEST_HANDLING_METHOD,
+		ERROR_NUMBER_OF_PARAM_TYPES_NOT_EQUAL_TO_PARAM_ANNOTATIONS,
+    }
+}
Index: /ether_2012/web/src/json/json-context.xml
===================================================================
--- /ether_2012/web/src/json/json-context.xml	(revision 319)
+++ /ether_2012/web/src/json/json-context.xml	(revision 319)
@@ -0,0 +1,17 @@
+<?com.medias.xml version="1.0" encoding="UTF-8" ?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
+
+    <bean id="jsonHelper" class="com.ether.JSONHelperImpl">
+        <property name="mapping">
+            <map>
+                <entry key="com.ether.Plateform" value-ref="plateformJsonSerializer"/>
+                <entry key="com.ether.Parameter" value-ref="parameterJsonSerializer"/>
+            </map>
+        </property>
+    </bean>
+
+    <bean id="parameterJsonSerializer" class="json.serializers.ParameterJsonSerializer"/>
+    <bean id="plateformJsonSerializer" class="json.serializers.PlateformJsonSerializer"/>
+</beans>
Index: /ether_2012/web/src/json/serializers/AbstractJsonSerializer.java
===================================================================
--- /ether_2012/web/src/json/serializers/AbstractJsonSerializer.java	(revision 319)
+++ /ether_2012/web/src/json/serializers/AbstractJsonSerializer.java	(revision 319)
@@ -0,0 +1,65 @@
+package json.serializers;
+
+import java.lang.reflect.Type;
+import java.util.Locale;
+
+import net.sf.json.JSON;
+import net.sf.json.JSONObject;
+import net.sf.json.JSONSerializer;
+import net.sf.json.JsonConfig;
+import net.sf.json.processors.JsonBeanProcessor;
+
+import org.hibernate.Hibernate;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.i18n.LocaleContextHolder;
+
+public abstract class AbstractJsonSerializer<T>
+        implements JsonBeanProcessor, ApplicationContextAware
+{
+    public abstract JSONObject process( final T t, final JsonConfig jsonConfig );
+    
+	public void setApplicationContext( final ApplicationContext applicationContext ){}
+
+    public final JSONObject processBean( final Object o, final JsonConfig jsonConfig )
+    {
+        //noinspection unchecked
+        return process( (T) o, jsonConfig );
+    }
+
+    protected void serialize( final JSONObject json, final String key, final Object value, final JsonConfig jsonConfig )
+    {
+        if( value == null )
+            return;
+
+        if( value instanceof String )
+            putString( json, key, (String) value );
+        else if( value instanceof Number || value instanceof Boolean )
+            json.put( key, value );
+        else if( value instanceof Class<?> )
+            json.put( key, ( (Class<?>) value ).getName() );
+        else if( value instanceof Type || value instanceof Enum<?> )
+            json.put( key, value.toString() );
+        else if( Hibernate.isInitialized( value ) )
+            json.put( key, JSONSerializer.toJSON( value, jsonConfig ) );
+    }
+
+    /**
+     * Strings vaguely looking like json are automatically evaluated and converted to a JSONObject. We dont want that.
+     * E.g.: without this function, {lua: "{npc='toto'}"} is added as : {lua: {npc: "toto"}}.
+     * <p/>
+     * See: http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONObject.html
+     * > Keys can be followed by = or => as well as by :
+     */
+    private void putString( final JSONObject json, final String key, final String value )
+    {
+        json.put( key, value );
+        if( json.get( key ) instanceof JSON )
+            json.put( key, '\'' + value + '\'' );
+    }
+
+    protected final Locale getLocale()
+    {
+        return LocaleContextHolder.getLocale();
+    }
+}
Index: /ether_2012/web/src/json/serializers/ParameterJsonSerializer.java
===================================================================
--- /ether_2012/web/src/json/serializers/ParameterJsonSerializer.java	(revision 319)
+++ /ether_2012/web/src/json/serializers/ParameterJsonSerializer.java	(revision 319)
@@ -0,0 +1,19 @@
+package json.serializers;
+
+import com.ether.Parameter;
+import com.ether.Plateform;
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
+
+public class ParameterJsonSerializer extends AbstractJsonSerializer<Parameter>
+{
+    public JSONObject process( final Parameter parameter, final JsonConfig jsonConfig )
+    {
+        final JSONObject result = new JSONObject();
+
+        serialize( result, "id", parameter.getId(), jsonConfig );
+        serialize( result, "name", parameter.getName(), jsonConfig );
+
+        return result;
+    }
+}
Index: /ether_2012/web/src/json/serializers/PlateformJsonSerializer.java
===================================================================
--- /ether_2012/web/src/json/serializers/PlateformJsonSerializer.java	(revision 319)
+++ /ether_2012/web/src/json/serializers/PlateformJsonSerializer.java	(revision 319)
@@ -0,0 +1,19 @@
+package json.serializers;
+
+import com.ether.Plateform;
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
+
+public class PlateformJsonSerializer
+        extends AbstractJsonSerializer<Plateform>
+{
+    public JSONObject process( final Plateform plateform, final JsonConfig jsonConfig )
+    {
+        final JSONObject result = new JSONObject();
+
+        serialize( result, "id", plateform.getId(), jsonConfig );
+        serialize( result, "name", plateform.getName(), jsonConfig );
+
+        return result;
+    }
+}
Index: /ether_2012/web/src/messages_en.properties
===================================================================
--- /ether_2012/web/src/messages_en.properties	(revision 319)
+++ /ether_2012/web/src/messages_en.properties	(revision 319)
@@ -0,0 +1,35 @@
+inWork=Work in progress..
+language=English
+label.language.fr=French
+label.language.en=English
+label.language=Language
+label.index=Back to index
+
+titre.visu=Simple visualization page
+titre.visu.pf=Visualization page for all plateforms and parameters
+titre.init=Init
+
+text.visu.pf=Load of the method "viewAllPlateforms" from the controller wich returns results to page "visu_plateform.jsp"
+text.visu.pf.href=Plateforms viex
+
+text.visu=Load of the method "view" from the controller which returns results to page visu.jsp
+text.visu.href=Simple view
+
+text.results=Results from controller :
+text.change.language=Switch language (use of labels from messages_en.properties)
+
+data.visualization=Data visualization
+data.visualization.pf=View plateforms
+data.visualization.noPf=No plateform
+data.visualization.selectPf=Plateforms
+data.visualization.noParameter=No parameter
+data.visualization.selectParameter=Parameters
+data.visualization.selectTime=Periode
+data.visualization.selectDate=Select a date
+data.visualization.BeginDate=Begin date
+data.visualization.EndDate=End date
+data.visualization.Unvalid_Period=Unvalid period !
+data.visualization.button.visualize=Visualization
+data.visualization.button.download=Download
+data.visualization.loading.data=Data loading
+
Index: /ether_2012/web/src/messages_fr.properties
===================================================================
--- /ether_2012/web/src/messages_fr.properties	(revision 319)
+++ /ether_2012/web/src/messages_fr.properties	(revision 319)
@@ -0,0 +1,35 @@
+inWork=Page en cours de construction..
+language=FRANCAIS
+label.language.fr=FranÃ§ais
+label.language.en=Anglais
+label.language=Langue
+label.index=Retour Ã  l'index
+
+titre.visu=Page de visualisation simple
+titre.visu.pf=Page de visualisation de toutes les plateformes/paramÃštres
+titre.init=Init
+
+text.visu.pf=Appel de la mÃ©thode viewAllPlateforms du controller qui renvoit vers la page visu_plateform.jsp
+text.visu.pf.href=vue plateforms
+
+text.visu=Appel de la mÃ©thode "view" du controller qui renvoit vers la page visu.jsp
+text.visu.href=vue simple
+
+text.results=RÃ©sultats retournÃ©s par le controller :
+text.change.language=Changement de langue (utilisation des labels de messages_en.properties)
+
+
+data.visualization=Visualisation des donnÃ©es
+data.visualization.pf=Voir les plateformes
+data.visualization.noPf=Pas de plateforme
+data.visualization.selectPf=Plateformes
+data.visualization.noParameter=Pas de param\u00E8tre
+data.visualization.selectParameter=Param\u00E8tres
+data.visualization.selectTime=P\u00E9riode
+data.visualization.selectDate=Choisissez une date
+data.visualization.BeginDate=Date de d\u00E9but :
+data.visualization.EndDate=Date de fin :
+data.visualization.Unvalid_Period=P\u00E9riode non valide !
+data.visualization.button.visualize=Visualisation
+data.visualization.button.download=T\u00E9l\u00E9chargement
+data.visualization.loading.data=Chargement des donn\u00E9es
Index: /ether_2012/web/visualization/visu.jsp
===================================================================
--- /ether_2012/web/visualization/visu.jsp	(revision 319)
+++ /ether_2012/web/visualization/visu.jsp	(revision 319)
@@ -0,0 +1,36 @@
+<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
+
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+<html>
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+    <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
+
+    <title>Project source</title>
+</head>
+
+<body>
+
+<spring:message code="label.language" htmlEscape="true"/> : <spring:message code="language" htmlEscape="true"/>
+
+<br/><br/>
+
+<a href="visualization?"><spring:message code="label.index" htmlEscape="true"/></a>
+
+<hr>
+<h3><spring:message code="titre.visu" htmlEscape="true"/></h3>
+<hr>
+
+<table width="100%">
+    <tr>
+        <td>
+            <a href="visualization?methodName=viewAllPlateforms"><spring:message code="text.visu.pf.href" htmlEscape="true"/></a>
+        </td>
+        <td><spring:message code="text.visu.pf" htmlEscape="true"/></td>
+    </tr>
+
+</table>
+
+</body>
+</html>
Index: /ether_2012/web/visualization/visu_plateform-classes.jsp
===================================================================
--- /ether_2012/web/visualization/visu_plateform-classes.jsp	(revision 319)
+++ /ether_2012/web/visualization/visu_plateform-classes.jsp	(revision 319)
@@ -0,0 +1,67 @@
+<script type="text/javascript">
+/* ************************************************** */
+/* ****************** LISTS ************************* */
+/* ************************************************** */
+
+var ListPlatforms = Class.create(ListItem, {
+
+    createItemDiv: function( itemHash, objectParameter )
+    {
+        return new Plateform(itemHash, objectParameter);
+    }
+});
+
+var ListParameters = Class.create(ListItem, {
+
+    createItemDiv: function( itemHash, objectParameter )
+    {
+        return new Parameter(itemHash, objectParameter);
+    }
+});
+
+
+/* ***************************************************** */
+/* ****************** ELEMENTS ************************* */
+/* ***************************************************** */
+var Plateform = Class.create(Item, {
+
+    display : function( parentNode, className )
+    {
+        this.createContainer("containerPlateform","containerPlateform "+className);
+        this.addName("plateform_name");
+        this.appendContainer(parentNode);
+        this.addObservers();
+    },
+
+    select: function()
+    {
+        this.selectWithParameter("plateform_selected");
+    },
+
+    unselect: function()
+    {
+        this.unselectWithParameter("plateform_selected");
+    }
+});
+
+var Parameter = Class.create(Item, {
+
+    display : function( parentNode, className )
+    {
+        this.createContainer("containerParameter","containerParameter "+className);
+        this.addName("parameter_name");
+        this.appendContainer(parentNode);
+        this.addObservers();
+    },
+
+    select: function()
+    {
+        this.selectWithParameter("parameter_selected");
+    },
+
+    unselect: function()
+    {
+        this.unselectWithParameter("parameter_selected");
+    }
+});
+</script>
Index: /ether_2012/web/visualization/visu_plateform-script.jsp
===================================================================
--- /ether_2012/web/visualization/visu_plateform-script.jsp	(revision 319)
+++ /ether_2012/web/visualization/visu_plateform-script.jsp	(revision 319)
@@ -0,0 +1,297 @@
+<script type="text/javascript">
+var InterfaceVisualization = Class.create({
+	
+    initialize: function( jsonPlateforms )
+    {
+        // Values
+        this.parent  = $("txt");
+        this.superParent = $("pageContent"); // need to resize in function of containerParameters
+        this.generalContainerPlateforms = $("generalContainerPlateforms");
+        this.generalContainerParameters = $("generalContainerParameters");
+        this.generalContainerCalendar = $("generalContainerCalendar");
+        this.jsonPlateforms = jsonPlateforms || null;
+		this.selectedPlateform = false;
+		this.selectedParameter = false;
+		this.beginDate = false;
+		this.endDate = false;
+		this.notice = Dom.getContainer("notice");
+
+		/** *********** CONTAINERS *********** **/
+       	// Create container for plateforms
+       	this.containerPlateforms = Dom.getContainer("containerPlateforms");
+		this.containerParameters = Dom.getContainer("containerParameters");
+		this.containerButtons = Dom.getContainer("containerButtons");
+		
+		/** *********** LOADING *********** **/
+        // Create loading object for plateforms
+        var param = new Object();
+        param.id = "loadingForPlateforms";
+        param.parent = this.containerPlateforms;
+        this.loadingPlateforms = new Loading(param);
+        this.loadingPlateforms.display();
+
+        // Create loading object for parameters
+        var param = new Object();
+        param.id = "loadingForParameters";
+        param.parent = this.containerParameters;
+        this.loadingParameters = new Loading(param);
+        this.loadingParameters.display();        
+
+		/** *********** BUTTONS *********** **/
+        this.visualizeButton = new Button({value:interfaceTexts["data.visualization.button.visualize"], parent:this.containerButtons, id:"button_visualize", onClick:this.onClickVisualize.bind(this)});
+        this.visualizeButton.disable();
+        this.downloadButton = new Button({value:interfaceTexts["data.visualization.button.download"], parent:this.containerButtons, id:"button_download", onClick:this.onClickDownload.bind(this)});
+        this.downloadButton.disable();
+        
+        this.createCalendar();
+        this.displayPlateforms();
+    },
+    
+    // REQUESTS ********************************************************
+	requestParametersByPlateform: function()
+    {
+        if(this.selectedPlateform)
+			new Ajax.Request("visualization?methodName=searchParametersByPlateform&id=" + this.selectedPlateform.getId(),
+        	{
+	            onSuccess:this.handleParametersBySelectedPlateform.bind(this)
+        	});
+    },
+
+	requestValuesByPlateformByParameterByPeriod: function()
+    {
+        if(this.selectedPlateform)
+			new Ajax.Request("visualization?methodName=searchDatasByPlateformByParameterByPeriod" +
+					"&plateformId=" + this.selectedPlateform.getId() + 
+					"&parameterId=" + this.selectedParameter.getId() +
+					"&dateBegin=" + this.beginDate +
+					"&dateEnd=" + this.endDate,
+        	{
+	            onSuccess:this.handleValuesByPlateformByParameterByPeriod.bind(this)
+        	});
+    },
+
+    // HANDLES ********************************************************
+    handleParametersBySelectedPlateform: function( result )
+    {
+        this.jsonParameters = result.responseText.evalJSON().parameters;
+        this.displayParameters();
+    },
+    
+    handleValuesByPlateformByParameterByPeriod: function( result )
+    {
+//		this.notice.style.visibility = "hidden";    	
+
+        this.jsonValues = result.responseText.evalJSON().values;
+        alert("values : "+this.jsonValues.size());
+    },
+
+    // DISPLAYS ********************************************************
+    createCalendar: function()
+    {
+   	    // Embedded Calendar
+		this.calendar = Calendar.setup(
+    	{
+    		dateField: 'embeddedDateField',
+    	    endDateField: 'embeddedEndDateField',
+    	    parentElement: 'embeddedCalendar',
+    	    clickToDateField: true,
+    	    selectHandler: this.onClickCalendar.bind(this)
+		})
+    },
+    
+    displayPlateforms: function()
+    {
+    	this.plateforms = new ListPlatforms(this.jsonPlateforms, new Object());
+
+    	this.plateforms.addOpenListener(this.onSelectPlateform.bind(this));
+        this.loadingPlateforms.hide();
+        this.plateforms.displayWithPairImpair(this.containerPlateforms, "NoPlateform", interfaceTexts["data.visualization.noPlateform"]);
+    			
+        // Select the first plateform by default
+        if( this.jsonPlateforms && this.jsonPlateforms[0] )
+        {
+            var plateformToSelect = this.plateforms.getItemById(this.jsonPlateforms[0].id);
+            this.onSelectPlateform(plateformToSelect.divItem);
+            this.selectedPlateform = plateformToSelect.divItem;            
+        }
+    },
+
+    displayParameters: function()
+    {
+    	this.parameters = new ListParameters(this.jsonParameters, new Object());
+      	
+		this.parameters.addOpenListener(this.onSelectParameter.bind(this));
+        this.loadingParameters.hide();
+        this.parameters.displayWithPairImpair(this.containerParameters, "NoParameter", interfaceTexts["data.visualization.noParameter"]);
+        
+        this.resizeContainers();
+    },
+    
+    // EVENTS ********************************************************
+    onSelectPlateform: function( objPlateform )
+    {
+        if( this.selectedPlateform && objPlateform.getId() == this.selectedPlateform.getId() )
+            return;
+
+        // Unselect old plateform
+        if( this.selectedPlateform )
+        	this.selectedPlateform.unselect();
+
+        this.selectedPlateform = objPlateform;
+        this.selectedPlateform.select();
+
+        // Unselect old parameter
+        if( this.selectedParameter )
+        	this.selectedParameter = false;
+        
+		this.requestParametersByPlateform();        
+		this.testAllFields();
+    },
+    
+    onSelectParameter: function( objParameter )
+    {
+        if( this.selectedParameter && objParameter.getId() == this.selectedParameter.getId() )
+            return;
+
+        // Unselect old parameter
+        if( this.selectedParameter )
+        	this.selectedParameter.unselect();
+
+        this.selectedParameter = objParameter;
+        this.selectedParameter.select();
+        this.testAllFields();
+    },
+    
+    onClickCalendar: function(calendar)
+    {
+		if (!calendar.dateField) return false
+
+		if(calendar.clickToDateField)
+		{
+			Element.update(calendar.dateField, calendar.date.print(calendar.dateFormat))
+			this.beginDate = calendar.date.print(calendar.dateFormat);
+		} else {
+			Element.update(calendar.endDateField, calendar.date.print(calendar.dateFormat))
+			this.endDate = calendar.date.print(calendar.dateFormat);
+		}
+		calendar.setClickToDateField(!calendar.clickToDateField);
+		this.testCalendarPeriod(calendar.dateField.innerHTML,calendar.endDateField.innerHTML);
+
+		// Call the close handler, if necessary
+		if (calendar.shouldClose) calendar.callCloseHandler()
+    },
+
+    onClickVisualize: function()
+    {
+    	this.displayLoading();
+   		this.requestValuesByPlateformByParameterByPeriod();
+    },
+
+    onClickDownload: function()
+    {
+    	if(this.testAllFields())
+    		alert("ok");
+    	else
+    		alert("non ok");
+    },
+
+    // OTHERS ********************************************************
+    resizeContainers: function()
+    {
+    	var titleSize = 85;
+		var parentHeight = this.superParent.offsetHeight - titleSize;
+    	var containerPlateformsHeight = this.generalContainerParameters.offsetHeight;
+    	var containerParametersHeight = this.generalContainerParameters.offsetHeight;
+		
+    	var containerPlateforms = this.containerPlateforms.offsetHeight;
+    	var containerParameters = this.containerParameters.offsetHeight;
+    	var containerCalendarHeight = this.generalContainerCalendar.offsetHeight;
+    	
+    	var maxHeight = Math.max(containerPlateforms, containerParameters, containerCalendarHeight);
+
+    	
+    	if(maxHeight > parentHeight)
+    	{
+    		this.superParent.style.height = maxHeight + 110 + "px";
+        	this.generalContainerPlateforms.style.height = maxHeight + 10 + "px";
+	        this.generalContainerParameters.style.height = maxHeight + 10 + "px";
+    	} else if(maxHeight == containerCalendarHeight) {
+    		this.superParent.style.height = containerCalendarHeight + titleSize + 25 + "px";
+        	this.generalContainerPlateforms.style.height = containerCalendarHeight + "px";
+	        this.generalContainerParameters.style.height = containerCalendarHeight + "px";
+    	}
+    },
+    
+	testCalendarPeriod: function(beginDate, endDate)
+	{	
+		if(!beginDate || !endDate)
+			return false;
+
+		var matchFormat = /^(\d{4})-(\d{2})-(\d{2})$/i;
+		var testBeginDate = beginDate.match(matchFormat);
+		var testEndDate = endDate.match(matchFormat);
+		if(!testEndDate || !testEndDate)
+			return;
+
+		this.resizeContainers();
+
+		var datesOk = beginDate <= endDate; 
+		if(!datesOk)
+			this.displayNotice();
+		else
+			this.hideNotice();
+		
+		if(!datesOk || !this.selectedPlateform || !this.selectedParameter){
+			this.visualizeButton.disable();
+			this.downloadButton.disable();
+			return false;
+		} else {
+			this.visualizeButton.enable();
+        	this.downloadButton.enable();
+        	return true;
+		}
+	},
+	
+	testAllFields: function()
+	{
+		if(!this.selectedPlateform || !this.selectedParameter || !this.beginDate || !this.endDate)
+		{
+			this.visualizeButton.disable();
+			this.downloadButton.disable();
+		}
+
+		return this.testCalendarPeriod(this.beginDate, this.endDate);
+	},
+	
+	displayNotice: function()
+	{
+		this.notice.innerHTML = "&nbsp";
+    	this.notice.removeClassName("loading");
+		this.notice.addClassName("error");
+		this.notice.innerHTML = interfaceTexts["data.visualization.Unvalid_Period"];
+		this.notice.style.visibility = "visible";
+	},
+	
+	hideNotice: function()
+	{
+		this.notice.innerHTML = "&nbsp";
+		this.notice.style.visibility = "hidden";
+	},
+	
+	displayLoading: function()
+	{
+		this.notice.innerHTML = "&nbsp";
+    	this.notice.removeClassName("error");
+		this.notice.style.visibility = "visible";    	
+    	this.notice.addClassName("loading");
+        var image = new Element('img', {src: 'resources/icons/loading_datas.gif'});
+    	this.notice.appendChild(image);
+	},
+	
+	hideLoading: function()
+	{
+		this.notice.innerHTML = "&nbsp";
+	}
+});
+
+</script>
Index: /ether_2012/web/visualization/visu_plateform.jsp
===================================================================
--- /ether_2012/web/visualization/visu_plateform.jsp	(revision 319)
+++ /ether_2012/web/visualization/visu_plateform.jsp	(revision 319)
@@ -0,0 +1,116 @@
+<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+<html>
+<head>
+
+    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+    <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
+
+    <title>Project source</title>
+
+    <ether:htmlCss cssFile="ether"/>
+    <ether:htmlCss cssFile="button"/>
+    <ether:htmlCss cssFile="blueprint-css/blueprint/src/grid"/>
+    <ether:htmlCss cssFile="calendarview-1.2/calendarview"/>
+    <ether:htmlCss cssFile="visu_plateform"/>
+
+    <ether:htmlResourceJsp jspFile="etherHead"/>
+    <ether:htmlJsp jspFile="visu_plateform-script"/>
+    <ether:htmlJsp jspFile="visu_plateform-classes"/>
+    <ether:htmlJs jsFile="calendarview-1.2/javascripts/calendarview"/>
+    <ether:htmlJs jsFile="Button"/>
+    <ether:htmlJs jsFile="maj"/>
+
+</head>
+
+<body>
+
+
+<spring:message code="label.language" htmlEscape="true"/> : <spring:message code="language" htmlEscape="true"/>
+
+<br/><br/>
+
+<a href="visualization?"><spring:message code="label.index" htmlEscape="true"/></a>
+
+<hr>
+<h3><spring:message code="titre.visu.pf" htmlEscape="true"/></h3>
+<hr>
+
+<table width="100%">
+    <tr>
+        <td>
+            <a href="visualization?methodName=view"><spring:message code="text.visu.href" htmlEscape="true"/></a>
+        </td>
+        <td><spring:message code="text.visu" htmlEscape="true"/></td>
+    </tr>
+
+</table>
+
+<hr>
+<spring:message code="text.results" htmlEscape="true"/><br/>
+ ${plateforms}
+ <br/><br/>
+<hr>
+
+
+<div class="span-24" id="pageContent">
+    <div id="generalContainerPlateforms" class="span-7 colborder">
+        <div id="messages">
+            <spring:message code="data.visualization.selectPf" htmlEscape="true"/>
+        </div>
+
+        <div id="containerPlateforms"></div>
+    </div>
+
+    <div id="generalContainerParameters" class="span-7 colborder">
+        <div id="messages">
+            <spring:message code="data.visualization.selectParameter" htmlEscape="true"/>
+        </div>
+
+        <div id="containerParameters"></div>
+    </div>
+
+    <div id="generalContainerCalendar" class="span-9 last">
+        <div id="messages">
+            <spring:message code="data.visualization.selectDate" htmlEscape="true"/>
+        </div>
+            <div id="embeddedCalendar" class="embeddedCalendar"></div>
+            <div class="dateField leftField">
+                   <spring:message code="data.visualization.BeginDate" htmlEscape="true"/>
+            </div>
+            <div id="embeddedDateField" class="dateField rightField">
+                <spring:message code="data.visualization.selectDate" htmlEscape="true"/>
+            </div>
+            <div class="dateField leftField">
+                <spring:message code="data.visualization.EndDate" htmlEscape="true"/>
+            </div>
+            <div id="embeddedEndDateField" class="dateField rightField">
+                <spring:message code="data.visualization.selectDate" htmlEscape="true"/>
+            </div>
+
+            <div class="errorAndButtons">
+                <div id="notice" style="visibility:hidden" class="error span-6">&nbsp;</div>
+                <div id="containerButtons" class="buttons span-7"></div>
+            </div>
+    </div>
+
+</div>
+
+<script type="text/javascript">
+    var interfaceTexts = $A();
+    interfaceTexts["data.visualization.noPlateform"] = '<spring:message code="data.visualization.noPf" htmlEscape="true"/>';
+    interfaceTexts["data.visualization.noParameter"] = '<spring:message code="data.visualization.noParameter" htmlEscape="true"/>';
+    interfaceTexts["data.visualization.button.visualize"] = '<spring:message code="data.visualization.button.visualize" htmlEscape="true"/>';
+    interfaceTexts["data.visualization.button.download"] = '<spring:message code="data.visualization.button.download" htmlEscape="true"/>';
+    interfaceTexts["data.visualization.loading.data"] = '<spring:message code="data.visualization.loading.data" htmlEscape="true"/>';
+    interfaceTexts["data.visualization.Unvalid_Period"] = "<spring:message code="data.visualization.Unvalid_Period" htmlEscape="true"/>";
+
+    var interfaceVisualization = new InterfaceVisualization( ${plateforms} );
+</script>
+
+</body>
+</html>
+<!-- /*** ****************** FIN VISU ******************** **/ -->
Index: /ether_2012/work/org/apache/jsp/cathy/visu_005fcathy_002dscript_jsp.java
===================================================================
--- /ether_2012/work/org/apache/jsp/cathy/visu_005fcathy_002dscript_jsp.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/cathy/visu_005fcathy_002dscript_jsp.java	(revision 319)
@@ -0,0 +1,162 @@
+package org.apache.jsp.cathy;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+
+public final class visu_005fcathy_002dscript_jsp extends org.apache.jasper.runtime.HttpJspBase
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  public void _jspInit() {
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+  }
+
+  public void _jspService(HttpServletRequest request, HttpServletResponse response)
+        throws java.io.IOException, ServletException {
+
+    PageContext pageContext = null;
+    HttpSession session = null;
+    ServletContext application = null;
+    ServletConfig config = null;
+    JspWriter out = null;
+    Object page = this;
+    JspWriter _jspx_out = null;
+    PageContext _jspx_page_context = null;
+
+
+    try {
+      response.setContentType("text/html");
+      pageContext = _jspxFactory.getPageContext(this, request, response,
+      			null, true, 8192, true);
+      _jspx_page_context = pageContext;
+      application = pageContext.getServletContext();
+      config = pageContext.getServletConfig();
+      session = pageContext.getSession();
+      out = pageContext.getOut();
+      _jspx_out = out;
+
+      out.write("<script type=\"text/javascript\">\n");
+      out.write("    var InterfaceC = Class.create( {\n");
+      out.write("\n");
+      out.write("        initialize: function()\n");
+      out.write("        {\n");
+      out.write("            // Container\n");
+      out.write("            this.generalContainerResults = $( \"containerResults\" );\n");
+      out.write("            this.generalContainerResult = $( \"containerResult\" );\n");
+      out.write("            this.containerSelect = $( 'containerSelect' );\n");
+      out.write("            this.containerCalendar = $( \"containerCalendar\" );\n");
+      out.write("            this.containerRadio = $( 'containerRadio' );\n");
+      out.write("\n");
+      out.write("            /** *********** LOADING *********** **/\n");
+      out.write("            // Create loading object for plateforms\n");
+      out.write("            var param = new Object();\n");
+      out.write("            param.id = \"loadingForContent\";\n");
+      out.write("            param.parent = this.generalContainerResults;\n");
+      out.write("            this.loadingPlateforms = new Loading( param );\n");
+      out.write("            this.loadingPlateforms.hide();\n");
+      out.write("\n");
+      out.write("            /** *********** CREATE *********** **/\n");
+      out.write("            this.createSelect();\n");
+      out.write("            this.createRadio();\n");
+      out.write("            this.createCalendar();\n");
+      out.write("\n");
+      out.write("            /** *********** BUTTON *********** **/\n");
+      out.write("            this.addPlotButton = new Button( {value:\"Download\", parent:this.generalContainerResults, id:\"button_download\", onClick:this.onClickDownload.bind( this )} );\n");
+      out.write("            this.addPlotButton.enable();\n");
+      out.write("        },\n");
+      out.write("\n");
+      out.write("        // DISPLAYS ********************************************************\n");
+      out.write("        createSelect: function()\n");
+      out.write("        {\n");
+      out.write("            var paramSelect = new Object();\n");
+      out.write("            paramSelect.id = \"selectStations\";\n");
+      out.write("            paramSelect.parent = this.containerSelect;\n");
+      out.write("            this.selectStations = new Select( paramSelect );\n");
+      out.write("            this.selectStations.add( \"0\", \"station 0\", this.onClickSelect.bind( this ) );\n");
+      out.write("            this.selectStations.add( \"1\", \"station 1\", this.onClickSelect.bind( this ) );\n");
+      out.write("            this.selectStations.add( \"2\", \"station 2\", this.onClickSelect.bind( this ) );\n");
+      out.write("            this.selectStations.selectFirst();\n");
+      out.write("        },\n");
+      out.write("\n");
+      out.write("        createRadio: function()\n");
+      out.write("        {\n");
+      out.write("            var paramRadio = new Object();\n");
+      out.write("            paramRadio.id = \"radios\";\n");
+      out.write("            paramRadio.parent = this.containerRadio;\n");
+      out.write("            this.radio = new Radio( paramRadio );\n");
+      out.write("            this.radio.add( \"P\", \"Profil\", this.onClicKRadio.bind( this ) );\n");
+      out.write("            this.radio.add( \"C\", \"Column\", this.onClicKRadio.bind( this ) );\n");
+      out.write("        },\n");
+      out.write("\n");
+      out.write("        createCalendar: function()\n");
+      out.write("        {\n");
+      out.write("            this.calendarFormat = \"%Y-%m-%d %H:%i\";\n");
+      out.write("            this.calendarConverter = new AnyTime.Converter( { format: this.calendarFormat } );\n");
+      out.write("\n");
+      out.write("            AnyTime.picker( \"beginDate\", { format: this.calendarFormat, firstDOW: 1,\n");
+      out.write("                labelTitle: \"Select a date\", labelYear: \"Select a year\", labelMonth: \"Select a month\", labelDayOfMonth: \"Select a day\",\n");
+      out.write("                labelHour: \"Select an hour\", labelMinute: \"Select a minute\",\n");
+      out.write("                methodToCall: this.onClickDate.bindAsEventListener( this )\n");
+      out.write("            } );\n");
+      out.write("\n");
+      out.write("            this.clearCalendarButton = new Button( {value:\"Clear\", parent:this.containerCalendar, id:\"button_clear_calendar\", className:\"small\", onClick:this.onClickClear.bind( this )} );\n");
+      out.write("        },\n");
+      out.write("\n");
+      out.write("        // EVENTS ********************************************************\n");
+      out.write("        onClickSelect: function()\n");
+      out.write("        {\n");
+      out.write("            this.generalContainerResult.innerHTML += this.selectStations.getName();\n");
+      out.write("        },\n");
+      out.write("\n");
+      out.write("        onClickDate: function()\n");
+      out.write("        {\n");
+      out.write("            this.beginDate = this.calendarConverter.parse( $( \"beginDate\" ).value ).getTime();\n");
+      out.write("            this.generalContainerResult.innerHTML += this.beginDate;\n");
+      out.write("            this.generalContainerResult.innerHTML += $( \"beginDate\" ).value;\n");
+      out.write("        },\n");
+      out.write("\n");
+      out.write("        onClickClear: function()\n");
+      out.write("        {\n");
+      out.write("            $( \"beginDate\" ).value = \"\";\n");
+      out.write("            this.beginDate = false;\n");
+      out.write("        },\n");
+      out.write("\n");
+      out.write("        onClicKRadio: function()\n");
+      out.write("        {\n");
+      out.write("            this.generalContainerResult.innerHTML += this.radio.getName();\n");
+      out.write("        },\n");
+      out.write("\n");
+      out.write("        onClickDownload: function()\n");
+      out.write("        {\n");
+      out.write("            this.loadingPlateforms.display();\n");
+      out.write("        }\n");
+      out.write("    } );\n");
+      out.write("\n");
+      out.write("</script>");
+    } catch (Throwable t) {
+      if (!(t instanceof SkipPageException)){
+        out = _jspx_out;
+        if (out != null && out.getBufferSize() != 0)
+          try { out.clearBuffer(); } catch (java.io.IOException e) {}
+        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
+      }
+    } finally {
+      _jspxFactory.releasePageContext(_jspx_page_context);
+    }
+  }
+}
Index: /ether_2012/work/org/apache/jsp/cathy/visu_005fcathy_jsp.java
===================================================================
--- /ether_2012/work/org/apache/jsp/cathy/visu_005fcathy_jsp.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/cathy/visu_005fcathy_jsp.java	(revision 319)
@@ -0,0 +1,121 @@
+package org.apache.jsp.cathy;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+
+public final class visu_005fcathy_jsp extends org.apache.jasper.runtime.HttpJspBase
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  public void _jspInit() {
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+  }
+
+  public void _jspService(HttpServletRequest request, HttpServletResponse response)
+        throws java.io.IOException, ServletException {
+
+    PageContext pageContext = null;
+    HttpSession session = null;
+    ServletContext application = null;
+    ServletConfig config = null;
+    JspWriter out = null;
+    Object page = this;
+    JspWriter _jspx_out = null;
+    PageContext _jspx_page_context = null;
+
+
+    try {
+      response.setContentType("text/html;charset=UTF-8");
+      pageContext = _jspxFactory.getPageContext(this, request, response,
+      			null, true, 8192, true);
+      _jspx_page_context = pageContext;
+      application = pageContext.getServletContext();
+      config = pageContext.getServletConfig();
+      session = pageContext.getSession();
+      out = pageContext.getOut();
+      _jspx_out = out;
+
+      out.write("\n");
+      out.write("\n");
+      out.write("<HTML>\n");
+      out.write("<HEAD>\n");
+      out.write("\n");
+      out.write("    <meta http-equiv=\"content-type\" content=\"text/html; charset=iso-8859-1\">\n");
+      out.write("    <META HTTP-EQUIV=\"PRAGMA\" CONTENT=\"NO-CACHE\">\n");
+      out.write("\n");
+      out.write("    <title>Page Cathy</title>\n");
+      out.write("\n");
+      out.write("    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/ether.css\"/>\n");
+      out.write("    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/select.css\"/>\n");
+      out.write("    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/button.css\"/>\n");
+      out.write("    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/radio.css\"/>\n");
+      out.write("    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/blueprint-css/blueprint/src/grid.css\"/>\n");
+      out.write("    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/anytime.css\"/>\n");
+      out.write("\n");
+      out.write("    <script type=\"text/javascript\" src=\"js/jquery-1.4.2.min.js\"></script>\n");
+      out.write("    <script type=\"text/javascript\" src=\"js/prototype.js\"></script>\n");
+      out.write("    <script type=\"text/javascript\" src=\"js/Select.js\"></script>\n");
+      out.write("    <script type=\"text/javascript\" src=\"js/Button.js\"></script>\n");
+      out.write("    <script type=\"text/javascript\" src=\"js/Radio.js\"></script>\n");
+      out.write("    <script type=\"text/javascript\" src=\"js/Loading.js\"></script>\n");
+      out.write("    <script type=\"text/javascript\" src=\"js/anytime.js\"></script>\n");
+      out.write("\n");
+      out.write("    ");
+      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "visu_cathy-script.jsp", out, false);
+      out.write("\n");
+      out.write("</HEAD>\n");
+      out.write("\n");
+      out.write("<BODY>\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("<div id=\"containerMenu\" class=\"span-10 border\"> Menu\n");
+      out.write("    <br/><br/>\n");
+      out.write("\n");
+      out.write("    <div id=\"containerSelect\" class=\"containerSelect span-9\"></div>\n");
+      out.write("\n");
+      out.write("    <div id=\"containerCalendar\" class=\"containerCalendar span-9\">\n");
+      out.write("        <input type=\"text\" id=\"beginDate\" size=\"15\"/>\n");
+      out.write("    </div>\n");
+      out.write("\n");
+      out.write("    <div id=\"containerRadio\" class=\"containerRadio span-9\"></div>\n");
+      out.write("</div>\n");
+      out.write("\n");
+      out.write("<div id=\"containerResults\" class=\"span-10\"> RÃ©sultat\n");
+      out.write("    <br/><br/>\n");
+      out.write("\n");
+      out.write("    <div id=\"containerResult\" class=\"containerResult\"></div>\n");
+      out.write("</div>\n");
+      out.write("\n");
+      out.write("<script type=\"text/javascript\">\n");
+      out.write("    var interface = new InterfaceC();\n");
+      out.write("</script>\n");
+      out.write("\n");
+      out.write("</BODY>\n");
+      out.write("</HTML>\n");
+    } catch (Throwable t) {
+      if (!(t instanceof SkipPageException)){
+        out = _jspx_out;
+        if (out != null && out.getBufferSize() != 0)
+          try { out.clearBuffer(); } catch (java.io.IOException e) {}
+        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
+      }
+    } finally {
+      _jspxFactory.releasePageContext(_jspx_page_context);
+    }
+  }
+}
Index: /ether_2012/work/org/apache/jsp/index_jsp.java
===================================================================
--- /ether_2012/work/org/apache/jsp/index_jsp.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/index_jsp.java	(revision 319)
@@ -0,0 +1,69 @@
+package org.apache.jsp;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+
+public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  public void _jspInit() {
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+  }
+
+  public void _jspService(HttpServletRequest request, HttpServletResponse response)
+        throws java.io.IOException, ServletException {
+
+    PageContext pageContext = null;
+    HttpSession session = null;
+    ServletContext application = null;
+    ServletConfig config = null;
+    JspWriter out = null;
+    Object page = this;
+    JspWriter _jspx_out = null;
+    PageContext _jspx_page_context = null;
+
+
+    try {
+      response.setContentType("text/html");
+      pageContext = _jspxFactory.getPageContext(this, request, response,
+      			null, true, 8192, true);
+      _jspx_page_context = pageContext;
+      application = pageContext.getServletContext();
+      config = pageContext.getServletConfig();
+      session = pageContext.getSession();
+      out = pageContext.getOut();
+      _jspx_out = out;
+
+      out.write('\n');
+      if (true) {
+        _jspx_page_context.forward("visualization?methodName=home");
+        return;
+      }
+    } catch (Throwable t) {
+      if (!(t instanceof SkipPageException)){
+        out = _jspx_out;
+        if (out != null && out.getBufferSize() != 0)
+          try { out.clearBuffer(); } catch (java.io.IOException e) {}
+        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
+      }
+    } finally {
+      _jspxFactory.releasePageContext(_jspx_page_context);
+    }
+  }
+}
Index: /ether_2012/work/org/apache/jsp/init_jsp.java
===================================================================
--- /ether_2012/work/org/apache/jsp/init_jsp.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/init_jsp.java	(revision 319)
@@ -0,0 +1,497 @@
+package org.apache.jsp;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+import com.ether.Context;
+
+public final class init_jsp extends org.apache.jasper.runtime.HttpJspBase
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  public void _jspInit() {
+    _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+    _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.release();
+  }
+
+  public void _jspService(HttpServletRequest request, HttpServletResponse response)
+        throws java.io.IOException, ServletException {
+
+    PageContext pageContext = null;
+    HttpSession session = null;
+    ServletContext application = null;
+    ServletConfig config = null;
+    JspWriter out = null;
+    Object page = this;
+    JspWriter _jspx_out = null;
+    PageContext _jspx_page_context = null;
+
+
+    try {
+      response.setContentType("text/html;charset=UTF-8");
+      pageContext = _jspxFactory.getPageContext(this, request, response,
+      			null, true, 8192, true);
+      _jspx_page_context = pageContext;
+      application = pageContext.getServletContext();
+      config = pageContext.getServletConfig();
+      session = pageContext.getSession();
+      out = pageContext.getOut();
+      _jspx_out = out;
+
+      out.write("\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("<html>\n");
+      out.write("<head>\n");
+      out.write("    <meta http-equiv=\"content-type\" content=\"text/html; charset=iso-8859-1\">\n");
+      out.write("    <META HTTP-EQUIV=\"PRAGMA\" CONTENT=\"NO-CACHE\">\n");
+      out.write("\n");
+      out.write("    <script src=\"resources/js/autocomplete/javascript/prototype.js\" type=\"text/javascript\"></script>\n");
+      out.write("    <script src=\"resources/js/autocomplete/javascript/effects.js\" type=\"text/javascript\"></script>\n");
+      out.write("    <script src=\"resources/js/autocomplete/javascript/controls.js\" type=\"text/javascript\"></script>\n");
+      out.write("    <link rel=\"stylesheet\" href=\"resources/css/autocomplete/style.css\" type=\"text/css\"/>\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("    <title>Project source</title>\n");
+      out.write("</head>\n");
+      out.write("\n");
+      out.write("<body>\n");
+      out.write("\n");
+      out.write("\n");
+      out.print(Context.getLocale( request ));
+      out.write('\n');
+      out.write('\n');
+      if (_jspx_meth_spring_005fmessage_005f0(_jspx_page_context))
+        return;
+      out.write(' ');
+      out.write(':');
+      out.write(' ');
+      if (_jspx_meth_spring_005fmessage_005f1(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("\n");
+      out.write("<br/><br/>\n");
+      out.write("\n");
+      if (_jspx_meth_spring_005fmessage_005f2(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("<br/>\n");
+      if (_jspx_meth_spring_005fmessage_005f3(_jspx_page_context))
+        return;
+      out.write(" : <a\n");
+      out.write("        href=\"visualization?methodName=home&language=en\">");
+      if (_jspx_meth_spring_005fmessage_005f4(_jspx_page_context))
+        return;
+      out.write("</a>\n");
+      out.write("| <a href=\"visualization?methodName=home&language=fr\">");
+      if (_jspx_meth_spring_005fmessage_005f5(_jspx_page_context))
+        return;
+      out.write("</a>\n");
+      out.write("\n");
+      out.write("<hr>\n");
+      out.write("<h3>");
+      if (_jspx_meth_spring_005fmessage_005f6(_jspx_page_context))
+        return;
+      out.write("</h3>\n");
+      out.write("<hr>\n");
+      out.write("\n");
+      out.write("<table width=\"100%\">\n");
+      out.write("    <tr>\n");
+      out.write("        <td>\n");
+      out.write("            <a href=\"visualization?methodName=view\">");
+      if (_jspx_meth_spring_005fmessage_005f7(_jspx_page_context))
+        return;
+      out.write("</a>\n");
+      out.write("        </td>\n");
+      out.write("        <td>");
+      if (_jspx_meth_spring_005fmessage_005f8(_jspx_page_context))
+        return;
+      out.write("</td>\n");
+      out.write("    </tr>\n");
+      out.write("\n");
+      out.write("    <tr>\n");
+      out.write("        <td>\n");
+      out.write("            <a href=\"visualization?methodName=viewAllPlateforms\">");
+      if (_jspx_meth_spring_005fmessage_005f9(_jspx_page_context))
+        return;
+      out.write("</a>\n");
+      out.write("        </td>\n");
+      out.write("        <td>");
+      if (_jspx_meth_spring_005fmessage_005f10(_jspx_page_context))
+        return;
+      out.write("</td>\n");
+      out.write("    </tr>\n");
+      out.write("\n");
+      out.write("</table>\n");
+      out.write("\n");
+      out.write("<BR/><BR/>\n");
+      out.write("<hr>\n");
+      out.write("<h3>Auto-completion</h3>\n");
+      out.write("<hr>\n");
+      out.write("\n");
+      out.write("<div id=\"container\">\n");
+      out.write("    <form method=\"get\" action=\"\">\n");
+      out.write("        <label for=\"testinput\">Search for a country name</label><br/>\n");
+      out.write("        <input type=\"text\" id=\"search\" name=\"search\" autocomplete=\"off\" class=\"input\" value=\"\"/><br/>\n");
+      out.write("\n");
+      out.write("        <div id=\"update\" style=\"display: none; position:relative;\"></div>\n");
+      out.write("        <input type=\"image\" name=\"register\" class=\"submit-btn\" src=\"http://www.roscripts.com/images/btn.gif\"\n");
+      out.write("               alt=\"submit\" title=\"submit\"/>\n");
+      out.write("    </form>\n");
+      out.write("\n");
+      out.write("    <script type=\"text/javascript\">\n");
+      out.write("        new Ajax.Autocompleter( 'search', 'update', 'response.php', { tokens: ','} );\n");
+      out.write("    </script>\n");
+      out.write("</div>\n");
+      out.write("\n");
+      out.write("</body>\n");
+      out.write("</html>");
+    } catch (Throwable t) {
+      if (!(t instanceof SkipPageException)){
+        out = _jspx_out;
+        if (out != null && out.getBufferSize() != 0)
+          try { out.clearBuffer(); } catch (java.io.IOException e) {}
+        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
+      }
+    } finally {
+      _jspxFactory.releasePageContext(_jspx_page_context);
+    }
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f0(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f0 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f0.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f0.setParent(null);
+    // /init.jsp(24,0) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f0.setCode("label.language");
+    // /init.jsp(24,0) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f0.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f0 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f0 = _jspx_th_spring_005fmessage_005f0.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f0[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f0.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f0.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f0);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f1(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f1 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f1.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f1.setParent(null);
+    // /init.jsp(24,60) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f1.setCode("language");
+    // /init.jsp(24,60) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f1.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f1 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f1 = _jspx_th_spring_005fmessage_005f1.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f1.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f1[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f1.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f1.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f1);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f2(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f2 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f2.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f2.setParent(null);
+    // /init.jsp(28,0) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f2.setCode("text.change.language");
+    // /init.jsp(28,0) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f2.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f2 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f2 = _jspx_th_spring_005fmessage_005f2.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f2.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f2[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f2.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f2.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f2);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f3(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f3 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f3.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f3.setParent(null);
+    // /init.jsp(30,0) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f3.setCode("label.language");
+    // /init.jsp(30,0) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f3.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f3 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f3 = _jspx_th_spring_005fmessage_005f3.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f3.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f3[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f3.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f3.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f3);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f4(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f4 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f4.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f4.setParent(null);
+    // /init.jsp(31,57) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f4.setCode("label.language.en");
+    // /init.jsp(31,57) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f4.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f4 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f4 = _jspx_th_spring_005fmessage_005f4.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f4.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f4[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f4.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f4.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f4);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f5(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f5 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f5.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f5.setParent(null);
+    // /init.jsp(33,54) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f5.setCode("label.language.fr");
+    // /init.jsp(33,54) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f5.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f5 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f5 = _jspx_th_spring_005fmessage_005f5.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f5.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f5[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f5.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f5.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f5);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f6(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f6 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f6.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f6.setParent(null);
+    // /init.jsp(36,4) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f6.setCode("titre.init");
+    // /init.jsp(36,4) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f6.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f6 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f6 = _jspx_th_spring_005fmessage_005f6.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f6.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f6[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f6.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f6.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f6);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f7(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f7 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f7.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f7.setParent(null);
+    // /init.jsp(42,52) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f7.setCode("text.visu.href");
+    // /init.jsp(42,52) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f7.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f7 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f7 = _jspx_th_spring_005fmessage_005f7.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f7.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f7[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f7.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f7.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f7);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f8(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f8 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f8.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f8.setParent(null);
+    // /init.jsp(44,12) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f8.setCode("text.visu");
+    // /init.jsp(44,12) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f8.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f8 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f8 = _jspx_th_spring_005fmessage_005f8.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f8.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f8[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f8.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f8.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f8);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f9(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f9 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f9.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f9.setParent(null);
+    // /init.jsp(49,65) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f9.setCode("text.visu.pf.href");
+    // /init.jsp(49,65) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f9.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f9 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f9 = _jspx_th_spring_005fmessage_005f9.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f9.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f9[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f9.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f9.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f9);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f10(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f10 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f10.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f10.setParent(null);
+    // /init.jsp(52,12) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f10.setCode("text.visu.pf");
+    // /init.jsp(52,12) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f10.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f10 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f10 = _jspx_th_spring_005fmessage_005f10.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f10.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f10[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f10.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f10.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f10);
+    }
+    return false;
+  }
+}
Index: /ether_2012/work/org/apache/jsp/resources/jsp/etherHead_jsp.java
===================================================================
--- /ether_2012/work/org/apache/jsp/resources/jsp/etherHead_jsp.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/resources/jsp/etherHead_jsp.java	(revision 319)
@@ -0,0 +1,180 @@
+package org.apache.jsp.resources.jsp;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+
+public final class etherHead_jsp extends org.apache.jasper.runtime.HttpJspBase
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  static {
+    _jspx_dependants = new java.util.ArrayList(1);
+    _jspx_dependants.add("/WEB-INF/tags/htmlJs.tag");
+  }
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  public void _jspInit() {
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+  }
+
+  public void _jspService(HttpServletRequest request, HttpServletResponse response)
+        throws java.io.IOException, ServletException {
+
+    PageContext pageContext = null;
+    HttpSession session = null;
+    ServletContext application = null;
+    ServletConfig config = null;
+    JspWriter out = null;
+    Object page = this;
+    JspWriter _jspx_out = null;
+    PageContext _jspx_page_context = null;
+
+
+    try {
+      response.setContentType("text/html");
+      pageContext = _jspxFactory.getPageContext(this, request, response,
+      			null, true, 8192, true);
+      _jspx_page_context = pageContext;
+      application = pageContext.getServletContext();
+      config = pageContext.getServletConfig();
+      session = pageContext.getSession();
+      out = pageContext.getOut();
+      _jspx_out = out;
+
+      out.write('\n');
+      out.write('\n');
+      if (_jspx_meth_ether_005fhtmlJs_005f0(_jspx_page_context))
+        return;
+      out.write('\n');
+      if (_jspx_meth_ether_005fhtmlJs_005f1(_jspx_page_context))
+        return;
+      out.write('\n');
+      if (_jspx_meth_ether_005fhtmlJs_005f2(_jspx_page_context))
+        return;
+      out.write('\n');
+      if (_jspx_meth_ether_005fhtmlJs_005f3(_jspx_page_context))
+        return;
+      out.write('\n');
+      if (_jspx_meth_ether_005fhtmlJs_005f4(_jspx_page_context))
+        return;
+      out.write('\n');
+      if (_jspx_meth_ether_005fhtmlJs_005f5(_jspx_page_context))
+        return;
+      out.write('\n');
+      out.write('\n');
+    } catch (Throwable t) {
+      if (!(t instanceof SkipPageException)){
+        out = _jspx_out;
+        if (out != null && out.getBufferSize() != 0)
+          try { out.clearBuffer(); } catch (java.io.IOException e) {}
+        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
+      }
+    } finally {
+      _jspxFactory.releasePageContext(_jspx_page_context);
+    }
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlJs_005f0(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlJs
+    org.apache.jsp.tag.web.htmlJs_tag _jspx_th_ether_005fhtmlJs_005f0 = new org.apache.jsp.tag.web.htmlJs_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f0);
+    _jspx_th_ether_005fhtmlJs_005f0.setJspContext(_jspx_page_context);
+    // /resources/jsp/etherHead.jsp(3,0) name = jsFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlJs_005f0.setJsFile("library/prototype/prototype");
+    _jspx_th_ether_005fhtmlJs_005f0.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f0);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlJs_005f1(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlJs
+    org.apache.jsp.tag.web.htmlJs_tag _jspx_th_ether_005fhtmlJs_005f1 = new org.apache.jsp.tag.web.htmlJs_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f1);
+    _jspx_th_ether_005fhtmlJs_005f1.setJspContext(_jspx_page_context);
+    // /resources/jsp/etherHead.jsp(4,0) name = jsFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlJs_005f1.setJsFile("Request");
+    _jspx_th_ether_005fhtmlJs_005f1.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f1);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlJs_005f2(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlJs
+    org.apache.jsp.tag.web.htmlJs_tag _jspx_th_ether_005fhtmlJs_005f2 = new org.apache.jsp.tag.web.htmlJs_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f2);
+    _jspx_th_ether_005fhtmlJs_005f2.setJspContext(_jspx_page_context);
+    // /resources/jsp/etherHead.jsp(5,0) name = jsFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlJs_005f2.setJsFile("DomHelper");
+    _jspx_th_ether_005fhtmlJs_005f2.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f2);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlJs_005f3(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlJs
+    org.apache.jsp.tag.web.htmlJs_tag _jspx_th_ether_005fhtmlJs_005f3 = new org.apache.jsp.tag.web.htmlJs_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f3);
+    _jspx_th_ether_005fhtmlJs_005f3.setJspContext(_jspx_page_context);
+    // /resources/jsp/etherHead.jsp(6,0) name = jsFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlJs_005f3.setJsFile("etherHelper");
+    _jspx_th_ether_005fhtmlJs_005f3.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f3);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlJs_005f4(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlJs
+    org.apache.jsp.tag.web.htmlJs_tag _jspx_th_ether_005fhtmlJs_005f4 = new org.apache.jsp.tag.web.htmlJs_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f4);
+    _jspx_th_ether_005fhtmlJs_005f4.setJspContext(_jspx_page_context);
+    // /resources/jsp/etherHead.jsp(7,0) name = jsFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlJs_005f4.setJsFile("etherClasses");
+    _jspx_th_ether_005fhtmlJs_005f4.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f4);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlJs_005f5(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlJs
+    org.apache.jsp.tag.web.htmlJs_tag _jspx_th_ether_005fhtmlJs_005f5 = new org.apache.jsp.tag.web.htmlJs_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f5);
+    _jspx_th_ether_005fhtmlJs_005f5.setJspContext(_jspx_page_context);
+    // /resources/jsp/etherHead.jsp(8,0) name = jsFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlJs_005f5.setJsFile("Loading");
+    _jspx_th_ether_005fhtmlJs_005f5.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f5);
+    return false;
+  }
+}
Index: /ether_2012/work/org/apache/jsp/tag/web/htmlCss_tag.java
===================================================================
--- /ether_2012/work/org/apache/jsp/tag/web/htmlCss_tag.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/tag/web/htmlCss_tag.java	(revision 319)
@@ -0,0 +1,122 @@
+package org.apache.jsp.tag.web;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+
+public final class htmlCss_tag
+    extends javax.servlet.jsp.tagext.SimpleTagSupport
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  private JspContext jspContext;
+  private java.io.Writer _jspx_sout;
+  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fc_005fif_0026_005ftest;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public void setJspContext(JspContext ctx) {
+    super.setJspContext(ctx);
+    java.util.ArrayList _jspx_nested = null;
+    java.util.ArrayList _jspx_at_begin = null;
+    java.util.ArrayList _jspx_at_end = null;
+    this.jspContext = new org.apache.jasper.runtime.JspContextWrapper(ctx, _jspx_nested, _jspx_at_begin, _jspx_at_end, null);
+  }
+
+  public JspContext getJspContext() {
+    return this.jspContext;
+  }
+  private java.lang.String cssFile;
+
+  public java.lang.String getCssFile() {
+    return this.cssFile;
+  }
+
+  public void setCssFile(java.lang.String cssFile) {
+    this.cssFile = cssFile;
+    jspContext.setAttribute("cssFile", cssFile);
+  }
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  private void _jspInit(ServletConfig config) {
+    _005fjspx_005ftagPool_005fc_005fif_0026_005ftest = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config);
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(config.getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) config.getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+    _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.release();
+  }
+
+  public void doTag() throws JspException, java.io.IOException {
+    PageContext _jspx_page_context = (PageContext)jspContext;
+    HttpServletRequest request = (HttpServletRequest) _jspx_page_context.getRequest();
+    HttpServletResponse response = (HttpServletResponse) _jspx_page_context.getResponse();
+    HttpSession session = _jspx_page_context.getSession();
+    ServletContext application = _jspx_page_context.getServletContext();
+    ServletConfig config = _jspx_page_context.getServletConfig();
+    JspWriter out = jspContext.getOut();
+    _jspInit(config);
+    jspContext.getELContext().putContext(JspContext.class,jspContext);
+    if( getCssFile() != null ) 
+      _jspx_page_context.setAttribute("cssFile", getCssFile());
+
+    try {
+      out.write('\n');
+      out.write('\n');
+      out.write('\n');
+      if (_jspx_meth_c_005fif_005f0(_jspx_page_context))
+        return;
+    } catch( Throwable t ) {
+      if( t instanceof SkipPageException )
+          throw (SkipPageException) t;
+      if( t instanceof java.io.IOException )
+          throw (java.io.IOException) t;
+      if( t instanceof IllegalStateException )
+          throw (IllegalStateException) t;
+      if( t instanceof JspException )
+          throw (JspException) t;
+      throw new JspException(t);
+    } finally {
+      jspContext.getELContext().putContext(JspContext.class,super.getJspContext());
+      ((org.apache.jasper.runtime.JspContextWrapper) jspContext).syncEndTagFile();
+      _jspDestroy();
+    }
+  }
+
+  private boolean _jspx_meth_c_005fif_005f0(PageContext _jspx_page_context)
+          throws Throwable {
+    JspWriter out = _jspx_page_context.getOut();
+    //  c:if
+    org.apache.taglibs.standard.tag.rt.core.IfTag _jspx_th_c_005fif_005f0 = (org.apache.taglibs.standard.tag.rt.core.IfTag) _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.get(org.apache.taglibs.standard.tag.rt.core.IfTag.class);
+    _jspx_th_c_005fif_005f0.setPageContext(_jspx_page_context);
+    _jspx_th_c_005fif_005f0.setParent(new javax.servlet.jsp.tagext.TagAdapter((javax.servlet.jsp.tagext.SimpleTag) this ));    // /WEB-INF/tags/htmlCss.tag(4,0) name = test type = boolean reqTime = true required = true fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_c_005fif_005f0.setTest(((java.lang.Boolean) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${not empty cssFile}", java.lang.Boolean.class, (PageContext)this.getJspContext(), null, false)).booleanValue());
+    int _jspx_eval_c_005fif_005f0 = _jspx_th_c_005fif_005f0.doStartTag();
+    if (_jspx_eval_c_005fif_005f0 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
+      do {
+        out.write("\n");
+        out.write("    <link rel=\"stylesheet\" type=\"text/css\" href=\"resources/css/");
+        out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${cssFile}", java.lang.String.class, (PageContext)this.getJspContext(), null, false));
+        out.write(".css\"/>\n");
+        int evalDoAfterBody = _jspx_th_c_005fif_005f0.doAfterBody();
+        if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)
+          break;
+      } while (true);
+    }
+    if (_jspx_th_c_005fif_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+      _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.reuse(_jspx_th_c_005fif_005f0);
+      throw new SkipPageException();
+    }
+    _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.reuse(_jspx_th_c_005fif_005f0);
+    return false;
+  }
+}
Index: /ether_2012/work/org/apache/jsp/tag/web/htmlJs_tag.java
===================================================================
--- /ether_2012/work/org/apache/jsp/tag/web/htmlJs_tag.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/tag/web/htmlJs_tag.java	(revision 319)
@@ -0,0 +1,123 @@
+package org.apache.jsp.tag.web;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+
+public final class htmlJs_tag
+    extends javax.servlet.jsp.tagext.SimpleTagSupport
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  private JspContext jspContext;
+  private java.io.Writer _jspx_sout;
+  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fc_005fif_0026_005ftest;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public void setJspContext(JspContext ctx) {
+    super.setJspContext(ctx);
+    java.util.ArrayList _jspx_nested = null;
+    java.util.ArrayList _jspx_at_begin = null;
+    java.util.ArrayList _jspx_at_end = null;
+    this.jspContext = new org.apache.jasper.runtime.JspContextWrapper(ctx, _jspx_nested, _jspx_at_begin, _jspx_at_end, null);
+  }
+
+  public JspContext getJspContext() {
+    return this.jspContext;
+  }
+  private java.lang.String jsFile;
+
+  public java.lang.String getJsFile() {
+    return this.jsFile;
+  }
+
+  public void setJsFile(java.lang.String jsFile) {
+    this.jsFile = jsFile;
+    jspContext.setAttribute("jsFile", jsFile);
+  }
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  private void _jspInit(ServletConfig config) {
+    _005fjspx_005ftagPool_005fc_005fif_0026_005ftest = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config);
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(config.getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) config.getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+    _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.release();
+  }
+
+  public void doTag() throws JspException, java.io.IOException {
+    PageContext _jspx_page_context = (PageContext)jspContext;
+    HttpServletRequest request = (HttpServletRequest) _jspx_page_context.getRequest();
+    HttpServletResponse response = (HttpServletResponse) _jspx_page_context.getResponse();
+    HttpSession session = _jspx_page_context.getSession();
+    ServletContext application = _jspx_page_context.getServletContext();
+    ServletConfig config = _jspx_page_context.getServletConfig();
+    JspWriter out = jspContext.getOut();
+    _jspInit(config);
+    jspContext.getELContext().putContext(JspContext.class,jspContext);
+    if( getJsFile() != null ) 
+      _jspx_page_context.setAttribute("jsFile", getJsFile());
+
+    try {
+      out.write('\n');
+      out.write('\n');
+      out.write('\n');
+      if (_jspx_meth_c_005fif_005f0(_jspx_page_context))
+        return;
+      out.write('\n');
+    } catch( Throwable t ) {
+      if( t instanceof SkipPageException )
+          throw (SkipPageException) t;
+      if( t instanceof java.io.IOException )
+          throw (java.io.IOException) t;
+      if( t instanceof IllegalStateException )
+          throw (IllegalStateException) t;
+      if( t instanceof JspException )
+          throw (JspException) t;
+      throw new JspException(t);
+    } finally {
+      jspContext.getELContext().putContext(JspContext.class,super.getJspContext());
+      ((org.apache.jasper.runtime.JspContextWrapper) jspContext).syncEndTagFile();
+      _jspDestroy();
+    }
+  }
+
+  private boolean _jspx_meth_c_005fif_005f0(PageContext _jspx_page_context)
+          throws Throwable {
+    JspWriter out = _jspx_page_context.getOut();
+    //  c:if
+    org.apache.taglibs.standard.tag.rt.core.IfTag _jspx_th_c_005fif_005f0 = (org.apache.taglibs.standard.tag.rt.core.IfTag) _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.get(org.apache.taglibs.standard.tag.rt.core.IfTag.class);
+    _jspx_th_c_005fif_005f0.setPageContext(_jspx_page_context);
+    _jspx_th_c_005fif_005f0.setParent(new javax.servlet.jsp.tagext.TagAdapter((javax.servlet.jsp.tagext.SimpleTag) this ));    // /WEB-INF/tags/htmlJs.tag(4,0) name = test type = boolean reqTime = true required = true fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_c_005fif_005f0.setTest(((java.lang.Boolean) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${not empty jsFile}", java.lang.Boolean.class, (PageContext)this.getJspContext(), null, false)).booleanValue());
+    int _jspx_eval_c_005fif_005f0 = _jspx_th_c_005fif_005f0.doStartTag();
+    if (_jspx_eval_c_005fif_005f0 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
+      do {
+        out.write("\n");
+        out.write("\t<script type=\"text/javascript\" src=\"resources/js/");
+        out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${jsFile}", java.lang.String.class, (PageContext)this.getJspContext(), null, false));
+        out.write(".js\"></script>\n");
+        int evalDoAfterBody = _jspx_th_c_005fif_005f0.doAfterBody();
+        if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)
+          break;
+      } while (true);
+    }
+    if (_jspx_th_c_005fif_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+      _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.reuse(_jspx_th_c_005fif_005f0);
+      throw new SkipPageException();
+    }
+    _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.reuse(_jspx_th_c_005fif_005f0);
+    return false;
+  }
+}
Index: /ether_2012/work/org/apache/jsp/tag/web/htmlJsp_tag.java
===================================================================
--- /ether_2012/work/org/apache/jsp/tag/web/htmlJsp_tag.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/tag/web/htmlJsp_tag.java	(revision 319)
@@ -0,0 +1,125 @@
+package org.apache.jsp.tag.web;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+
+public final class htmlJsp_tag
+    extends javax.servlet.jsp.tagext.SimpleTagSupport
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  private JspContext jspContext;
+  private java.io.Writer _jspx_sout;
+  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fc_005fif_0026_005ftest;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public void setJspContext(JspContext ctx) {
+    super.setJspContext(ctx);
+    java.util.ArrayList _jspx_nested = null;
+    java.util.ArrayList _jspx_at_begin = null;
+    java.util.ArrayList _jspx_at_end = null;
+    this.jspContext = new org.apache.jasper.runtime.JspContextWrapper(ctx, _jspx_nested, _jspx_at_begin, _jspx_at_end, null);
+  }
+
+  public JspContext getJspContext() {
+    return this.jspContext;
+  }
+  private java.lang.String jspFile;
+
+  public java.lang.String getJspFile() {
+    return this.jspFile;
+  }
+
+  public void setJspFile(java.lang.String jspFile) {
+    this.jspFile = jspFile;
+    jspContext.setAttribute("jspFile", jspFile);
+  }
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  private void _jspInit(ServletConfig config) {
+    _005fjspx_005ftagPool_005fc_005fif_0026_005ftest = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config);
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(config.getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) config.getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+    _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.release();
+  }
+
+  public void doTag() throws JspException, java.io.IOException {
+    PageContext _jspx_page_context = (PageContext)jspContext;
+    HttpServletRequest request = (HttpServletRequest) _jspx_page_context.getRequest();
+    HttpServletResponse response = (HttpServletResponse) _jspx_page_context.getResponse();
+    HttpSession session = _jspx_page_context.getSession();
+    ServletContext application = _jspx_page_context.getServletContext();
+    ServletConfig config = _jspx_page_context.getServletConfig();
+    JspWriter out = jspContext.getOut();
+    _jspInit(config);
+    jspContext.getELContext().putContext(JspContext.class,jspContext);
+    if( getJspFile() != null ) 
+      _jspx_page_context.setAttribute("jspFile", getJspFile());
+
+    try {
+      out.write('\n');
+      out.write('\n');
+      out.write('\n');
+      if (_jspx_meth_c_005fif_005f0(_jspx_page_context))
+        return;
+      out.write('\n');
+    } catch( Throwable t ) {
+      if( t instanceof SkipPageException )
+          throw (SkipPageException) t;
+      if( t instanceof java.io.IOException )
+          throw (java.io.IOException) t;
+      if( t instanceof IllegalStateException )
+          throw (IllegalStateException) t;
+      if( t instanceof JspException )
+          throw (JspException) t;
+      throw new JspException(t);
+    } finally {
+      jspContext.getELContext().putContext(JspContext.class,super.getJspContext());
+      ((org.apache.jasper.runtime.JspContextWrapper) jspContext).syncEndTagFile();
+      _jspDestroy();
+    }
+  }
+
+  private boolean _jspx_meth_c_005fif_005f0(PageContext _jspx_page_context)
+          throws Throwable {
+    JspWriter out = _jspx_page_context.getOut();
+    HttpServletRequest request = (HttpServletRequest)_jspx_page_context.getRequest();
+    HttpServletResponse response = (HttpServletResponse)_jspx_page_context.getResponse();
+    //  c:if
+    org.apache.taglibs.standard.tag.rt.core.IfTag _jspx_th_c_005fif_005f0 = (org.apache.taglibs.standard.tag.rt.core.IfTag) _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.get(org.apache.taglibs.standard.tag.rt.core.IfTag.class);
+    _jspx_th_c_005fif_005f0.setPageContext(_jspx_page_context);
+    _jspx_th_c_005fif_005f0.setParent(new javax.servlet.jsp.tagext.TagAdapter((javax.servlet.jsp.tagext.SimpleTag) this ));    // /WEB-INF/tags/htmlJsp.tag(4,0) name = test type = boolean reqTime = true required = true fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_c_005fif_005f0.setTest(((java.lang.Boolean) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${not empty jspFile}", java.lang.Boolean.class, (PageContext)this.getJspContext(), null, false)).booleanValue());
+    int _jspx_eval_c_005fif_005f0 = _jspx_th_c_005fif_005f0.doStartTag();
+    if (_jspx_eval_c_005fif_005f0 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
+      do {
+        out.write('\n');
+        out.write('	');
+        org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, (java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${jspFile}.jsp", java.lang.String.class, (PageContext)this.getJspContext(), null, false), out, false);
+        out.write('\n');
+        int evalDoAfterBody = _jspx_th_c_005fif_005f0.doAfterBody();
+        if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)
+          break;
+      } while (true);
+    }
+    if (_jspx_th_c_005fif_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+      _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.reuse(_jspx_th_c_005fif_005f0);
+      throw new SkipPageException();
+    }
+    _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.reuse(_jspx_th_c_005fif_005f0);
+    return false;
+  }
+}
Index: /ether_2012/work/org/apache/jsp/tag/web/htmlResourceJsp_tag.java
===================================================================
--- /ether_2012/work/org/apache/jsp/tag/web/htmlResourceJsp_tag.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/tag/web/htmlResourceJsp_tag.java	(revision 319)
@@ -0,0 +1,125 @@
+package org.apache.jsp.tag.web;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+
+public final class htmlResourceJsp_tag
+    extends javax.servlet.jsp.tagext.SimpleTagSupport
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  private JspContext jspContext;
+  private java.io.Writer _jspx_sout;
+  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fc_005fif_0026_005ftest;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public void setJspContext(JspContext ctx) {
+    super.setJspContext(ctx);
+    java.util.ArrayList _jspx_nested = null;
+    java.util.ArrayList _jspx_at_begin = null;
+    java.util.ArrayList _jspx_at_end = null;
+    this.jspContext = new org.apache.jasper.runtime.JspContextWrapper(ctx, _jspx_nested, _jspx_at_begin, _jspx_at_end, null);
+  }
+
+  public JspContext getJspContext() {
+    return this.jspContext;
+  }
+  private java.lang.String jspFile;
+
+  public java.lang.String getJspFile() {
+    return this.jspFile;
+  }
+
+  public void setJspFile(java.lang.String jspFile) {
+    this.jspFile = jspFile;
+    jspContext.setAttribute("jspFile", jspFile);
+  }
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  private void _jspInit(ServletConfig config) {
+    _005fjspx_005ftagPool_005fc_005fif_0026_005ftest = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config);
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(config.getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) config.getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+    _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.release();
+  }
+
+  public void doTag() throws JspException, java.io.IOException {
+    PageContext _jspx_page_context = (PageContext)jspContext;
+    HttpServletRequest request = (HttpServletRequest) _jspx_page_context.getRequest();
+    HttpServletResponse response = (HttpServletResponse) _jspx_page_context.getResponse();
+    HttpSession session = _jspx_page_context.getSession();
+    ServletContext application = _jspx_page_context.getServletContext();
+    ServletConfig config = _jspx_page_context.getServletConfig();
+    JspWriter out = jspContext.getOut();
+    _jspInit(config);
+    jspContext.getELContext().putContext(JspContext.class,jspContext);
+    if( getJspFile() != null ) 
+      _jspx_page_context.setAttribute("jspFile", getJspFile());
+
+    try {
+      out.write('\n');
+      out.write('\n');
+      out.write('\n');
+      if (_jspx_meth_c_005fif_005f0(_jspx_page_context))
+        return;
+      out.write('\n');
+    } catch( Throwable t ) {
+      if( t instanceof SkipPageException )
+          throw (SkipPageException) t;
+      if( t instanceof java.io.IOException )
+          throw (java.io.IOException) t;
+      if( t instanceof IllegalStateException )
+          throw (IllegalStateException) t;
+      if( t instanceof JspException )
+          throw (JspException) t;
+      throw new JspException(t);
+    } finally {
+      jspContext.getELContext().putContext(JspContext.class,super.getJspContext());
+      ((org.apache.jasper.runtime.JspContextWrapper) jspContext).syncEndTagFile();
+      _jspDestroy();
+    }
+  }
+
+  private boolean _jspx_meth_c_005fif_005f0(PageContext _jspx_page_context)
+          throws Throwable {
+    JspWriter out = _jspx_page_context.getOut();
+    HttpServletRequest request = (HttpServletRequest)_jspx_page_context.getRequest();
+    HttpServletResponse response = (HttpServletResponse)_jspx_page_context.getResponse();
+    //  c:if
+    org.apache.taglibs.standard.tag.rt.core.IfTag _jspx_th_c_005fif_005f0 = (org.apache.taglibs.standard.tag.rt.core.IfTag) _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.get(org.apache.taglibs.standard.tag.rt.core.IfTag.class);
+    _jspx_th_c_005fif_005f0.setPageContext(_jspx_page_context);
+    _jspx_th_c_005fif_005f0.setParent(new javax.servlet.jsp.tagext.TagAdapter((javax.servlet.jsp.tagext.SimpleTag) this ));    // /WEB-INF/tags/htmlResourceJsp.tag(4,0) name = test type = boolean reqTime = true required = true fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_c_005fif_005f0.setTest(((java.lang.Boolean) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${not empty jspFile}", java.lang.Boolean.class, (PageContext)this.getJspContext(), null, false)).booleanValue());
+    int _jspx_eval_c_005fif_005f0 = _jspx_th_c_005fif_005f0.doStartTag();
+    if (_jspx_eval_c_005fif_005f0 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
+      do {
+        out.write('\n');
+        out.write('	');
+        org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, (java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("/resources/jsp/${jspFile}.jsp", java.lang.String.class, (PageContext)this.getJspContext(), null, false), out, false);
+        out.write('\n');
+        int evalDoAfterBody = _jspx_th_c_005fif_005f0.doAfterBody();
+        if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)
+          break;
+      } while (true);
+    }
+    if (_jspx_th_c_005fif_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+      _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.reuse(_jspx_th_c_005fif_005f0);
+      throw new SkipPageException();
+    }
+    _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.reuse(_jspx_th_c_005fif_005f0);
+    return false;
+  }
+}
Index: /ether_2012/work/org/apache/jsp/visualization/visu_005fcathy_002dscript_jsp.java
===================================================================
--- /ether_2012/work/org/apache/jsp/visualization/visu_005fcathy_002dscript_jsp.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/visualization/visu_005fcathy_002dscript_jsp.java	(revision 319)
@@ -0,0 +1,164 @@
+package org.apache.jsp.visualization;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+
+public final class visu_005fcathy_002dscript_jsp extends org.apache.jasper.runtime.HttpJspBase
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  public void _jspInit() {
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+  }
+
+  public void _jspService(HttpServletRequest request, HttpServletResponse response)
+        throws java.io.IOException, ServletException {
+
+    PageContext pageContext = null;
+    HttpSession session = null;
+    ServletContext application = null;
+    ServletConfig config = null;
+    JspWriter out = null;
+    Object page = this;
+    JspWriter _jspx_out = null;
+    PageContext _jspx_page_context = null;
+
+
+    try {
+      response.setContentType("text/html");
+      pageContext = _jspxFactory.getPageContext(this, request, response,
+      			null, true, 8192, true);
+      _jspx_page_context = pageContext;
+      application = pageContext.getServletContext();
+      config = pageContext.getServletConfig();
+      session = pageContext.getSession();
+      out = pageContext.getOut();
+      _jspx_out = out;
+
+      out.write("<script type=\"text/javascript\">\n");
+      out.write("    var InterfaceC = Class.create( {\n");
+      out.write("\n");
+      out.write("        initialize: function()\n");
+      out.write("        {\n");
+      out.write("            // Values\n");
+      out.write("            this.generalContainerLeftMenu = $( \"leftMenu\" );\n");
+      out.write("            this.generalContainerContent = $( \"content\" );\n");
+      out.write("\n");
+      out.write("            /** *********** LOADING *********** **/\n");
+      out.write("            // Create loading object for plateforms\n");
+      out.write("            var param = new Object();\n");
+      out.write("            param.id = \"loadingForContent\";\n");
+      out.write("            param.parent = this.generalContainerContent;\n");
+      out.write("            this.loadingPlateforms = new Loading( param );\n");
+      out.write("            this.loadingPlateforms.display();\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("            /** *********** SELECT *********** **/\n");
+      out.write("            var paramSelect = new Object();\n");
+      out.write("            paramSelect.id = \"selectStations\";\n");
+      out.write("            paramSelect.parent = this.generalContainerLeftMenu;\n");
+      out.write("            this.selectAxes = new Select( paramSelect );\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("            /** *********** RADIO *********** **/\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("            /** *********** CALENDAR *********** **/\n");
+      out.write("//            this.createCalendar();\n");
+      out.write("\n");
+      out.write("            /** *********** BUTTON *********** **/\n");
+      out.write("        },\n");
+      out.write("\n");
+      out.write("        // DISPLAYS ********************************************************\n");
+      out.write("        createCalendar: function()\n");
+      out.write("        {\n");
+      out.write("            // Embedded Calendar\n");
+      out.write("            this.calendar = Calendar.setup(\n");
+      out.write("            {\n");
+      out.write("                dateField: 'embeddedDateField',\n");
+      out.write("                endDateField: 'embeddedEndDateField',\n");
+      out.write("                parentElement: 'embeddedCalendar',\n");
+      out.write("                clickToDateField: true,\n");
+      out.write("                selectHandler: this.onClickCalendar.bind( this )\n");
+      out.write("            } )\n");
+      out.write("        },\n");
+      out.write("\n");
+      out.write("        // EVENTS ********************************************************\n");
+      out.write("        onSelectPlateform: function( objPlateform )\n");
+      out.write("        {\n");
+      out.write("            if( this.selectedPlateform && objPlateform.getId() == this.selectedPlateform.getId() )\n");
+      out.write("                return;\n");
+      out.write("\n");
+      out.write("            // Unselect old plateform\n");
+      out.write("            if( this.selectedPlateform )\n");
+      out.write("                this.selectedPlateform.unselect();\n");
+      out.write("\n");
+      out.write("            this.selectedPlateform = objPlateform;\n");
+      out.write("            this.selectedPlateform.select();\n");
+      out.write("\n");
+      out.write("            // Unselect old parameter\n");
+      out.write("            if( this.selectedParameter )\n");
+      out.write("                this.selectedParameter = false;\n");
+      out.write("\n");
+      out.write("            this.requestParametersByPlateform();\n");
+      out.write("            this.testAllFields();\n");
+      out.write("        },\n");
+      out.write("\n");
+      out.write("        onClickCalendar: function( calendar )\n");
+      out.write("        {\n");
+      out.write("            if( !calendar.dateField ) return false\n");
+      out.write("\n");
+      out.write("            if( calendar.clickToDateField )\n");
+      out.write("            {\n");
+      out.write("                Element.update( calendar.dateField, calendar.date.print( calendar.dateFormat ) )\n");
+      out.write("                this.beginDate = calendar.date.print( calendar.dateFormat );\n");
+      out.write("            }\n");
+      out.write("            else\n");
+      out.write("            {\n");
+      out.write("                Element.update( calendar.endDateField, calendar.date.print( calendar.dateFormat ) )\n");
+      out.write("                this.endDate = calendar.date.print( calendar.dateFormat );\n");
+      out.write("            }\n");
+      out.write("            calendar.setClickToDateField( !calendar.clickToDateField );\n");
+      out.write("            this.testCalendarPeriod( calendar.dateField.innerHTML, calendar.endDateField.innerHTML );\n");
+      out.write("\n");
+      out.write("            // Call the close handler, if necessary\n");
+      out.write("            if( calendar.shouldClose ) calendar.callCloseHandler()\n");
+      out.write("        },\n");
+      out.write("\n");
+      out.write("        onClickVisualize: function()\n");
+      out.write("        {\n");
+      out.write("            this.displayLoading();\n");
+      out.write("            this.requestValuesByPlateformByParameterByPeriod();\n");
+      out.write("        }\n");
+      out.write("\n");
+      out.write("        // OTHERS ********************************************************\n");
+      out.write("    } );\n");
+      out.write("\n");
+      out.write("</script>");
+    } catch (Throwable t) {
+      if (!(t instanceof SkipPageException)){
+        out = _jspx_out;
+        if (out != null && out.getBufferSize() != 0)
+          try { out.clearBuffer(); } catch (java.io.IOException e) {}
+        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
+      }
+    } finally {
+      _jspxFactory.releasePageContext(_jspx_page_context);
+    }
+  }
+}
Index: /ether_2012/work/org/apache/jsp/visualization/visu_005fcathy_jsp.java
===================================================================
--- /ether_2012/work/org/apache/jsp/visualization/visu_005fcathy_jsp.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/visualization/visu_005fcathy_jsp.java	(revision 319)
@@ -0,0 +1,109 @@
+package org.apache.jsp.visualization;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+
+public final class visu_005fcathy_jsp extends org.apache.jasper.runtime.HttpJspBase
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  public void _jspInit() {
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+  }
+
+  public void _jspService(HttpServletRequest request, HttpServletResponse response)
+        throws java.io.IOException, ServletException {
+
+    PageContext pageContext = null;
+    HttpSession session = null;
+    ServletContext application = null;
+    ServletConfig config = null;
+    JspWriter out = null;
+    Object page = this;
+    JspWriter _jspx_out = null;
+    PageContext _jspx_page_context = null;
+
+
+    try {
+      response.setContentType("text/html;charset=UTF-8");
+      pageContext = _jspxFactory.getPageContext(this, request, response,
+      			null, true, 8192, true);
+      _jspx_page_context = pageContext;
+      application = pageContext.getServletContext();
+      config = pageContext.getServletConfig();
+      session = pageContext.getSession();
+      out = pageContext.getOut();
+      _jspx_out = out;
+
+      out.write("\n");
+      out.write("\n");
+      out.write("<html>\n");
+      out.write("<head>\n");
+      out.write("\n");
+      out.write("    <meta http-equiv=\"content-type\" content=\"text/html; charset=iso-8859-1\">\n");
+      out.write("    <META HTTP-EQUIV=\"PRAGMA\" CONTENT=\"NO-CACHE\">\n");
+      out.write("\n");
+      out.write("    <title>Page Cathy</title>\n");
+      out.write("\n");
+      out.write("    <link rel=\"stylesheet\" type=\"text/css\" href=\"../resources/css/ether.css\"/>\n");
+      out.write("    <link rel=\"stylesheet\" type=\"text/css\" href=\"../resources/css/button.css\"/>\n");
+      out.write("    <link rel=\"stylesheet\" type=\"text/css\" href=\"../resources/css/blueprint-css/blueprint/src/grid.css\"/>\n");
+      out.write("    <link rel=\"stylesheet\" type=\"text/css\" href=\"../resources/css/calendarview-1.2/calendarview.css\"/>\n");
+      out.write("\n");
+      out.write("    <script type=\"text/javascript\" src=\"../resources/js/library/prototype/prototype.js\"></script>\n");
+      out.write("    <script type=\"text/javascript\" src=\"../resources/js/DomHelper.js\"></script>\n");
+      out.write("    <script type=\"text/javascript\" src=\"../resources/js/Loading.js\"></script>\n");
+      out.write("\n");
+      out.write("    <script type=\"text/javascript\" src=\"../resources/js/calendarview-1.2/javascripts/calendarview.js\"></script>\n");
+      out.write("    <script type=\"text/javascript\" src=\"../resources/js/Button.js\"></script>\n");
+      out.write("\n");
+      out.write("    ");
+      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "visu_cathy-script.jsp", out, false);
+      out.write("\n");
+      out.write("</head>\n");
+      out.write("\n");
+      out.write("<body>\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("<div id=\"leftMenu\" class=\"span-5\">\n");
+      out.write("    <div id=\"selectStations\"></div>\n");
+      out.write("\n");
+      out.write("</div>\n");
+      out.write("\n");
+      out.write("<div id=\"content\" class=\"span-10\">\n");
+      out.write("\n");
+      out.write("</div>\n");
+      out.write("\n");
+      out.write("<script type=\"text/javascript\">\n");
+      out.write("    var interface = new InterfaceC();\n");
+      out.write("</script>\n");
+      out.write("\n");
+      out.write("</body>\n");
+      out.write("</html>\n");
+    } catch (Throwable t) {
+      if (!(t instanceof SkipPageException)){
+        out = _jspx_out;
+        if (out != null && out.getBufferSize() != 0)
+          try { out.clearBuffer(); } catch (java.io.IOException e) {}
+        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
+      }
+    } finally {
+      _jspxFactory.releasePageContext(_jspx_page_context);
+    }
+  }
+}
Index: /ether_2012/work/org/apache/jsp/visualization/visu_005fplateform_002dclasses_jsp.java
===================================================================
--- /ether_2012/work/org/apache/jsp/visualization/visu_005fplateform_002dclasses_jsp.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/visualization/visu_005fplateform_002dclasses_jsp.java	(revision 319)
@@ -0,0 +1,131 @@
+package org.apache.jsp.visualization;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+
+public final class visu_005fplateform_002dclasses_jsp extends org.apache.jasper.runtime.HttpJspBase
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  public void _jspInit() {
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+  }
+
+  public void _jspService(HttpServletRequest request, HttpServletResponse response)
+        throws java.io.IOException, ServletException {
+
+    PageContext pageContext = null;
+    HttpSession session = null;
+    ServletContext application = null;
+    ServletConfig config = null;
+    JspWriter out = null;
+    Object page = this;
+    JspWriter _jspx_out = null;
+    PageContext _jspx_page_context = null;
+
+
+    try {
+      response.setContentType("text/html");
+      pageContext = _jspxFactory.getPageContext(this, request, response,
+      			null, true, 8192, true);
+      _jspx_page_context = pageContext;
+      application = pageContext.getServletContext();
+      config = pageContext.getServletConfig();
+      session = pageContext.getSession();
+      out = pageContext.getOut();
+      _jspx_out = out;
+
+      out.write("<script type=\"text/javascript\">\n");
+      out.write("/* ************************************************** */\n");
+      out.write("/* ****************** LISTS ************************* */\n");
+      out.write("/* ************************************************** */\n");
+      out.write("\n");
+      out.write("var ListPlatforms = Class.create(ListItem, {\n");
+      out.write("\n");
+      out.write("    createItemDiv: function( itemHash, objectParameter )\n");
+      out.write("    {\n");
+      out.write("        return new Plateform(itemHash, objectParameter);\n");
+      out.write("    }\n");
+      out.write("});\n");
+      out.write("\n");
+      out.write("var ListParameters = Class.create(ListItem, {\n");
+      out.write("\n");
+      out.write("    createItemDiv: function( itemHash, objectParameter )\n");
+      out.write("    {\n");
+      out.write("        return new Parameter(itemHash, objectParameter);\n");
+      out.write("    }\n");
+      out.write("});\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("/* ***************************************************** */\n");
+      out.write("/* ****************** ELEMENTS ************************* */\n");
+      out.write("/* ***************************************************** */\n");
+      out.write("var Plateform = Class.create(Item, {\n");
+      out.write("\n");
+      out.write("    display : function( parentNode, className )\n");
+      out.write("    {\n");
+      out.write("        this.createContainer(\"containerPlateform\",\"containerPlateform \"+className);\n");
+      out.write("        this.addName(\"plateform_name\");\n");
+      out.write("        this.appendContainer(parentNode);\n");
+      out.write("        this.addObservers();\n");
+      out.write("    },\n");
+      out.write("\n");
+      out.write("    select: function()\n");
+      out.write("    {\n");
+      out.write("        this.selectWithParameter(\"plateform_selected\");\n");
+      out.write("    },\n");
+      out.write("\n");
+      out.write("    unselect: function()\n");
+      out.write("    {\n");
+      out.write("        this.unselectWithParameter(\"plateform_selected\");\n");
+      out.write("    }\n");
+      out.write("});\n");
+      out.write("\n");
+      out.write("var Parameter = Class.create(Item, {\n");
+      out.write("\n");
+      out.write("    display : function( parentNode, className )\n");
+      out.write("    {\n");
+      out.write("        this.createContainer(\"containerParameter\",\"containerParameter \"+className);\n");
+      out.write("        this.addName(\"parameter_name\");\n");
+      out.write("        this.appendContainer(parentNode);\n");
+      out.write("        this.addObservers();\n");
+      out.write("    },\n");
+      out.write("\n");
+      out.write("    select: function()\n");
+      out.write("    {\n");
+      out.write("        this.selectWithParameter(\"parameter_selected\");\n");
+      out.write("    },\n");
+      out.write("\n");
+      out.write("    unselect: function()\n");
+      out.write("    {\n");
+      out.write("        this.unselectWithParameter(\"parameter_selected\");\n");
+      out.write("    }\n");
+      out.write("});\n");
+      out.write("</script>");
+    } catch (Throwable t) {
+      if (!(t instanceof SkipPageException)){
+        out = _jspx_out;
+        if (out != null && out.getBufferSize() != 0)
+          try { out.clearBuffer(); } catch (java.io.IOException e) {}
+        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
+      }
+    } finally {
+      _jspxFactory.releasePageContext(_jspx_page_context);
+    }
+  }
+}
Index: /ether_2012/work/org/apache/jsp/visualization/visu_005fplateform_002dscript_jsp.java
===================================================================
--- /ether_2012/work/org/apache/jsp/visualization/visu_005fplateform_002dscript_jsp.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/visualization/visu_005fplateform_002dscript_jsp.java	(revision 319)
@@ -0,0 +1,361 @@
+package org.apache.jsp.visualization;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+
+public final class visu_005fplateform_002dscript_jsp extends org.apache.jasper.runtime.HttpJspBase
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  public void _jspInit() {
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+  }
+
+  public void _jspService(HttpServletRequest request, HttpServletResponse response)
+        throws java.io.IOException, ServletException {
+
+    PageContext pageContext = null;
+    HttpSession session = null;
+    ServletContext application = null;
+    ServletConfig config = null;
+    JspWriter out = null;
+    Object page = this;
+    JspWriter _jspx_out = null;
+    PageContext _jspx_page_context = null;
+
+
+    try {
+      response.setContentType("text/html");
+      pageContext = _jspxFactory.getPageContext(this, request, response,
+      			null, true, 8192, true);
+      _jspx_page_context = pageContext;
+      application = pageContext.getServletContext();
+      config = pageContext.getServletConfig();
+      session = pageContext.getSession();
+      out = pageContext.getOut();
+      _jspx_out = out;
+
+      out.write("<script type=\"text/javascript\">\n");
+      out.write("var InterfaceVisualization = Class.create({\n");
+      out.write("\t\n");
+      out.write("    initialize: function( jsonPlateforms )\n");
+      out.write("    {\n");
+      out.write("        // Values\n");
+      out.write("        this.parent  = $(\"txt\");\n");
+      out.write("        this.superParent = $(\"pageContent\"); // need to resize in function of containerParameters\n");
+      out.write("        this.generalContainerPlateforms = $(\"generalContainerPlateforms\");\n");
+      out.write("        this.generalContainerParameters = $(\"generalContainerParameters\");\n");
+      out.write("        this.generalContainerCalendar = $(\"generalContainerCalendar\");\n");
+      out.write("        this.jsonPlateforms = jsonPlateforms || null;\n");
+      out.write("\t\tthis.selectedPlateform = false;\n");
+      out.write("\t\tthis.selectedParameter = false;\n");
+      out.write("\t\tthis.beginDate = false;\n");
+      out.write("\t\tthis.endDate = false;\n");
+      out.write("\t\tthis.notice = Dom.getContainer(\"notice\");\n");
+      out.write("\n");
+      out.write("\t\t/** *********** CONTAINERS *********** **/\n");
+      out.write("       \t// Create container for plateforms\n");
+      out.write("       \tthis.containerPlateforms = Dom.getContainer(\"containerPlateforms\");\n");
+      out.write("\t\tthis.containerParameters = Dom.getContainer(\"containerParameters\");\n");
+      out.write("\t\tthis.containerButtons = Dom.getContainer(\"containerButtons\");\n");
+      out.write("\t\t\n");
+      out.write("\t\t/** *********** LOADING *********** **/\n");
+      out.write("        // Create loading object for plateforms\n");
+      out.write("        var param = new Object();\n");
+      out.write("        param.id = \"loadingForPlateforms\";\n");
+      out.write("        param.parent = this.containerPlateforms;\n");
+      out.write("        this.loadingPlateforms = new Loading(param);\n");
+      out.write("        this.loadingPlateforms.display();\n");
+      out.write("\n");
+      out.write("        // Create loading object for parameters\n");
+      out.write("        var param = new Object();\n");
+      out.write("        param.id = \"loadingForParameters\";\n");
+      out.write("        param.parent = this.containerParameters;\n");
+      out.write("        this.loadingParameters = new Loading(param);\n");
+      out.write("        this.loadingParameters.display();        \n");
+      out.write("\n");
+      out.write("\t\t/** *********** BUTTONS *********** **/\n");
+      out.write("        this.visualizeButton = new Button({value:interfaceTexts[\"data.visualization.button.visualize\"], parent:this.containerButtons, id:\"button_visualize\", onClick:this.onClickVisualize.bind(this)});\n");
+      out.write("        this.visualizeButton.disable();\n");
+      out.write("        this.downloadButton = new Button({value:interfaceTexts[\"data.visualization.button.download\"], parent:this.containerButtons, id:\"button_download\", onClick:this.onClickDownload.bind(this)});\n");
+      out.write("        this.downloadButton.disable();\n");
+      out.write("        \n");
+      out.write("        this.createCalendar();\n");
+      out.write("        this.displayPlateforms();\n");
+      out.write("    },\n");
+      out.write("    \n");
+      out.write("    // REQUESTS ********************************************************\n");
+      out.write("\trequestParametersByPlateform: function()\n");
+      out.write("    {\n");
+      out.write("        if(this.selectedPlateform)\n");
+      out.write("\t\t\tnew Ajax.Request(\"visualization?methodName=searchParametersByPlateform&id=\" + this.selectedPlateform.getId(),\n");
+      out.write("        \t{\n");
+      out.write("\t            onSuccess:this.handleParametersBySelectedPlateform.bind(this)\n");
+      out.write("        \t});\n");
+      out.write("    },\n");
+      out.write("\n");
+      out.write("\trequestValuesByPlateformByParameterByPeriod: function()\n");
+      out.write("    {\n");
+      out.write("        if(this.selectedPlateform)\n");
+      out.write("\t\t\tnew Ajax.Request(\"visualization?methodName=searchDatasByPlateformByParameterByPeriod\" +\n");
+      out.write("\t\t\t\t\t\"&plateformId=\" + this.selectedPlateform.getId() + \n");
+      out.write("\t\t\t\t\t\"&parameterId=\" + this.selectedParameter.getId() +\n");
+      out.write("\t\t\t\t\t\"&dateBegin=\" + this.beginDate +\n");
+      out.write("\t\t\t\t\t\"&dateEnd=\" + this.endDate,\n");
+      out.write("        \t{\n");
+      out.write("\t            onSuccess:this.handleValuesByPlateformByParameterByPeriod.bind(this)\n");
+      out.write("        \t});\n");
+      out.write("    },\n");
+      out.write("\n");
+      out.write("    // HANDLES ********************************************************\n");
+      out.write("    handleParametersBySelectedPlateform: function( result )\n");
+      out.write("    {\n");
+      out.write("        this.jsonParameters = result.responseText.evalJSON().parameters;\n");
+      out.write("        this.displayParameters();\n");
+      out.write("    },\n");
+      out.write("    \n");
+      out.write("    handleValuesByPlateformByParameterByPeriod: function( result )\n");
+      out.write("    {\n");
+      out.write("//\t\tthis.notice.style.visibility = \"hidden\";    \t\n");
+      out.write("\n");
+      out.write("        this.jsonValues = result.responseText.evalJSON().values;\n");
+      out.write("        alert(\"values : \"+this.jsonValues.size());\n");
+      out.write("    },\n");
+      out.write("\n");
+      out.write("    // DISPLAYS ********************************************************\n");
+      out.write("    createCalendar: function()\n");
+      out.write("    {\n");
+      out.write("   \t    // Embedded Calendar\n");
+      out.write("\t\tthis.calendar = Calendar.setup(\n");
+      out.write("    \t{\n");
+      out.write("    \t\tdateField: 'embeddedDateField',\n");
+      out.write("    \t    endDateField: 'embeddedEndDateField',\n");
+      out.write("    \t    parentElement: 'embeddedCalendar',\n");
+      out.write("    \t    clickToDateField: true,\n");
+      out.write("    \t    selectHandler: this.onClickCalendar.bind(this)\n");
+      out.write("\t\t})\n");
+      out.write("    },\n");
+      out.write("    \n");
+      out.write("    displayPlateforms: function()\n");
+      out.write("    {\n");
+      out.write("    \tthis.plateforms = new ListPlatforms(this.jsonPlateforms, new Object());\n");
+      out.write("\n");
+      out.write("    \tthis.plateforms.addOpenListener(this.onSelectPlateform.bind(this));\n");
+      out.write("        this.loadingPlateforms.hide();\n");
+      out.write("        this.plateforms.displayWithPairImpair(this.containerPlateforms, \"NoPlateform\", interfaceTexts[\"data.visualization.noPlateform\"]);\n");
+      out.write("    \t\t\t\n");
+      out.write("        // Select the first plateform by default\n");
+      out.write("        if( this.jsonPlateforms && this.jsonPlateforms[0] )\n");
+      out.write("        {\n");
+      out.write("            var plateformToSelect = this.plateforms.getItemById(this.jsonPlateforms[0].id);\n");
+      out.write("            this.onSelectPlateform(plateformToSelect.divItem);\n");
+      out.write("            this.selectedPlateform = plateformToSelect.divItem;            \n");
+      out.write("        }\n");
+      out.write("    },\n");
+      out.write("\n");
+      out.write("    displayParameters: function()\n");
+      out.write("    {\n");
+      out.write("    \tthis.parameters = new ListParameters(this.jsonParameters, new Object());\n");
+      out.write("      \t\n");
+      out.write("\t\tthis.parameters.addOpenListener(this.onSelectParameter.bind(this));\n");
+      out.write("        this.loadingParameters.hide();\n");
+      out.write("        this.parameters.displayWithPairImpair(this.containerParameters, \"NoParameter\", interfaceTexts[\"data.visualization.noParameter\"]);\n");
+      out.write("        \n");
+      out.write("        this.resizeContainers();\n");
+      out.write("    },\n");
+      out.write("    \n");
+      out.write("    // EVENTS ********************************************************\n");
+      out.write("    onSelectPlateform: function( objPlateform )\n");
+      out.write("    {\n");
+      out.write("        if( this.selectedPlateform && objPlateform.getId() == this.selectedPlateform.getId() )\n");
+      out.write("            return;\n");
+      out.write("\n");
+      out.write("        // Unselect old plateform\n");
+      out.write("        if( this.selectedPlateform )\n");
+      out.write("        \tthis.selectedPlateform.unselect();\n");
+      out.write("\n");
+      out.write("        this.selectedPlateform = objPlateform;\n");
+      out.write("        this.selectedPlateform.select();\n");
+      out.write("\n");
+      out.write("        // Unselect old parameter\n");
+      out.write("        if( this.selectedParameter )\n");
+      out.write("        \tthis.selectedParameter = false;\n");
+      out.write("        \n");
+      out.write("\t\tthis.requestParametersByPlateform();        \n");
+      out.write("\t\tthis.testAllFields();\n");
+      out.write("    },\n");
+      out.write("    \n");
+      out.write("    onSelectParameter: function( objParameter )\n");
+      out.write("    {\n");
+      out.write("        if( this.selectedParameter && objParameter.getId() == this.selectedParameter.getId() )\n");
+      out.write("            return;\n");
+      out.write("\n");
+      out.write("        // Unselect old parameter\n");
+      out.write("        if( this.selectedParameter )\n");
+      out.write("        \tthis.selectedParameter.unselect();\n");
+      out.write("\n");
+      out.write("        this.selectedParameter = objParameter;\n");
+      out.write("        this.selectedParameter.select();\n");
+      out.write("        this.testAllFields();\n");
+      out.write("    },\n");
+      out.write("    \n");
+      out.write("    onClickCalendar: function(calendar)\n");
+      out.write("    {\n");
+      out.write("\t\tif (!calendar.dateField) return false\n");
+      out.write("\n");
+      out.write("\t\tif(calendar.clickToDateField)\n");
+      out.write("\t\t{\n");
+      out.write("\t\t\tElement.update(calendar.dateField, calendar.date.print(calendar.dateFormat))\n");
+      out.write("\t\t\tthis.beginDate = calendar.date.print(calendar.dateFormat);\n");
+      out.write("\t\t} else {\n");
+      out.write("\t\t\tElement.update(calendar.endDateField, calendar.date.print(calendar.dateFormat))\n");
+      out.write("\t\t\tthis.endDate = calendar.date.print(calendar.dateFormat);\n");
+      out.write("\t\t}\n");
+      out.write("\t\tcalendar.setClickToDateField(!calendar.clickToDateField);\n");
+      out.write("\t\tthis.testCalendarPeriod(calendar.dateField.innerHTML,calendar.endDateField.innerHTML);\n");
+      out.write("\n");
+      out.write("\t\t// Call the close handler, if necessary\n");
+      out.write("\t\tif (calendar.shouldClose) calendar.callCloseHandler()\n");
+      out.write("    },\n");
+      out.write("\n");
+      out.write("    onClickVisualize: function()\n");
+      out.write("    {\n");
+      out.write("    \tthis.displayLoading();\n");
+      out.write("   \t\tthis.requestValuesByPlateformByParameterByPeriod();\n");
+      out.write("    },\n");
+      out.write("\n");
+      out.write("    onClickDownload: function()\n");
+      out.write("    {\n");
+      out.write("    \tif(this.testAllFields())\n");
+      out.write("    \t\talert(\"ok\");\n");
+      out.write("    \telse\n");
+      out.write("    \t\talert(\"non ok\");\n");
+      out.write("    },\n");
+      out.write("\n");
+      out.write("    // OTHERS ********************************************************\n");
+      out.write("    resizeContainers: function()\n");
+      out.write("    {\n");
+      out.write("    \tvar titleSize = 85;\n");
+      out.write("\t\tvar parentHeight = this.superParent.offsetHeight - titleSize;\n");
+      out.write("    \tvar containerPlateformsHeight = this.generalContainerParameters.offsetHeight;\n");
+      out.write("    \tvar containerParametersHeight = this.generalContainerParameters.offsetHeight;\n");
+      out.write("\t\t\n");
+      out.write("    \tvar containerPlateforms = this.containerPlateforms.offsetHeight;\n");
+      out.write("    \tvar containerParameters = this.containerParameters.offsetHeight;\n");
+      out.write("    \tvar containerCalendarHeight = this.generalContainerCalendar.offsetHeight;\n");
+      out.write("    \t\n");
+      out.write("    \tvar maxHeight = Math.max(containerPlateforms, containerParameters, containerCalendarHeight);\n");
+      out.write("\n");
+      out.write("    \t\n");
+      out.write("    \tif(maxHeight > parentHeight)\n");
+      out.write("    \t{\n");
+      out.write("    \t\tthis.superParent.style.height = maxHeight + 110 + \"px\";\n");
+      out.write("        \tthis.generalContainerPlateforms.style.height = maxHeight + 10 + \"px\";\n");
+      out.write("\t        this.generalContainerParameters.style.height = maxHeight + 10 + \"px\";\n");
+      out.write("    \t} else if(maxHeight == containerCalendarHeight) {\n");
+      out.write("    \t\tthis.superParent.style.height = containerCalendarHeight + titleSize + 25 + \"px\";\n");
+      out.write("        \tthis.generalContainerPlateforms.style.height = containerCalendarHeight + \"px\";\n");
+      out.write("\t        this.generalContainerParameters.style.height = containerCalendarHeight + \"px\";\n");
+      out.write("    \t}\n");
+      out.write("    },\n");
+      out.write("    \n");
+      out.write("\ttestCalendarPeriod: function(beginDate, endDate)\n");
+      out.write("\t{\t\n");
+      out.write("\t\tif(!beginDate || !endDate)\n");
+      out.write("\t\t\treturn false;\n");
+      out.write("\n");
+      out.write("\t\tvar matchFormat = /^(\\d{4})-(\\d{2})-(\\d{2})$/i;\n");
+      out.write("\t\tvar testBeginDate = beginDate.match(matchFormat);\n");
+      out.write("\t\tvar testEndDate = endDate.match(matchFormat);\n");
+      out.write("\t\tif(!testEndDate || !testEndDate)\n");
+      out.write("\t\t\treturn;\n");
+      out.write("\n");
+      out.write("\t\tthis.resizeContainers();\n");
+      out.write("\n");
+      out.write("\t\tvar datesOk = beginDate <= endDate; \n");
+      out.write("\t\tif(!datesOk)\n");
+      out.write("\t\t\tthis.displayNotice();\n");
+      out.write("\t\telse\n");
+      out.write("\t\t\tthis.hideNotice();\n");
+      out.write("\t\t\n");
+      out.write("\t\tif(!datesOk || !this.selectedPlateform || !this.selectedParameter){\n");
+      out.write("\t\t\tthis.visualizeButton.disable();\n");
+      out.write("\t\t\tthis.downloadButton.disable();\n");
+      out.write("\t\t\treturn false;\n");
+      out.write("\t\t} else {\n");
+      out.write("\t\t\tthis.visualizeButton.enable();\n");
+      out.write("        \tthis.downloadButton.enable();\n");
+      out.write("        \treturn true;\n");
+      out.write("\t\t}\n");
+      out.write("\t},\n");
+      out.write("\t\n");
+      out.write("\ttestAllFields: function()\n");
+      out.write("\t{\n");
+      out.write("\t\tif(!this.selectedPlateform || !this.selectedParameter || !this.beginDate || !this.endDate)\n");
+      out.write("\t\t{\n");
+      out.write("\t\t\tthis.visualizeButton.disable();\n");
+      out.write("\t\t\tthis.downloadButton.disable();\n");
+      out.write("\t\t}\n");
+      out.write("\n");
+      out.write("\t\treturn this.testCalendarPeriod(this.beginDate, this.endDate);\n");
+      out.write("\t},\n");
+      out.write("\t\n");
+      out.write("\tdisplayNotice: function()\n");
+      out.write("\t{\n");
+      out.write("\t\tthis.notice.innerHTML = \"&nbsp\";\n");
+      out.write("    \tthis.notice.removeClassName(\"loading\");\n");
+      out.write("\t\tthis.notice.addClassName(\"error\");\n");
+      out.write("\t\tthis.notice.innerHTML = interfaceTexts[\"data.visualization.Unvalid_Period\"];\n");
+      out.write("\t\tthis.notice.style.visibility = \"visible\";\n");
+      out.write("\t},\n");
+      out.write("\t\n");
+      out.write("\thideNotice: function()\n");
+      out.write("\t{\n");
+      out.write("\t\tthis.notice.innerHTML = \"&nbsp\";\n");
+      out.write("\t\tthis.notice.style.visibility = \"hidden\";\n");
+      out.write("\t},\n");
+      out.write("\t\n");
+      out.write("\tdisplayLoading: function()\n");
+      out.write("\t{\n");
+      out.write("\t\tthis.notice.innerHTML = \"&nbsp\";\n");
+      out.write("    \tthis.notice.removeClassName(\"error\");\n");
+      out.write("\t\tthis.notice.style.visibility = \"visible\";    \t\n");
+      out.write("    \tthis.notice.addClassName(\"loading\");\n");
+      out.write("        var image = new Element('img', {src: 'resources/icons/loading_datas.gif'});\n");
+      out.write("    \tthis.notice.appendChild(image);\n");
+      out.write("\t},\n");
+      out.write("\t\n");
+      out.write("\thideLoading: function()\n");
+      out.write("\t{\n");
+      out.write("\t\tthis.notice.innerHTML = \"&nbsp\";\n");
+      out.write("\t}\n");
+      out.write("});\n");
+      out.write("\n");
+      out.write("</script>");
+    } catch (Throwable t) {
+      if (!(t instanceof SkipPageException)){
+        out = _jspx_out;
+        if (out != null && out.getBufferSize() != 0)
+          try { out.clearBuffer(); } catch (java.io.IOException e) {}
+        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
+      }
+    } finally {
+      _jspxFactory.releasePageContext(_jspx_page_context);
+    }
+  }
+}
Index: /ether_2012/work/org/apache/jsp/visualization/visu_005fplateform_jsp.java
===================================================================
--- /ether_2012/work/org/apache/jsp/visualization/visu_005fplateform_jsp.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/visualization/visu_005fplateform_jsp.java	(revision 319)
@@ -0,0 +1,1034 @@
+package org.apache.jsp.visualization;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+
+public final class visu_005fplateform_jsp extends org.apache.jasper.runtime.HttpJspBase
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  static {
+    _jspx_dependants = new java.util.ArrayList(4);
+    _jspx_dependants.add("/WEB-INF/tags/htmlCss.tag");
+    _jspx_dependants.add("/WEB-INF/tags/htmlResourceJsp.tag");
+    _jspx_dependants.add("/WEB-INF/tags/htmlJsp.tag");
+    _jspx_dependants.add("/WEB-INF/tags/htmlJs.tag");
+  }
+
+  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  public void _jspInit() {
+    _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+    _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.release();
+  }
+
+  public void _jspService(HttpServletRequest request, HttpServletResponse response)
+        throws java.io.IOException, ServletException {
+
+    PageContext pageContext = null;
+    HttpSession session = null;
+    ServletContext application = null;
+    ServletConfig config = null;
+    JspWriter out = null;
+    Object page = this;
+    JspWriter _jspx_out = null;
+    PageContext _jspx_page_context = null;
+
+
+    try {
+      response.setContentType("text/html;charset=UTF-8");
+      pageContext = _jspxFactory.getPageContext(this, request, response,
+      			null, true, 8192, true);
+      _jspx_page_context = pageContext;
+      application = pageContext.getServletContext();
+      config = pageContext.getServletConfig();
+      session = pageContext.getSession();
+      out = pageContext.getOut();
+      _jspx_out = out;
+
+      out.write("\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("<html>\n");
+      out.write("<head>\n");
+      out.write("\n");
+      out.write("    <meta http-equiv=\"content-type\" content=\"text/html; charset=iso-8859-1\">\n");
+      out.write("    <META HTTP-EQUIV=\"PRAGMA\" CONTENT=\"NO-CACHE\">\n");
+      out.write("\n");
+      out.write("    <title>Project source</title>\n");
+      out.write("\n");
+      out.write("    ");
+      if (_jspx_meth_ether_005fhtmlCss_005f0(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("    ");
+      if (_jspx_meth_ether_005fhtmlCss_005f1(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("    ");
+      if (_jspx_meth_ether_005fhtmlCss_005f2(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("    ");
+      if (_jspx_meth_ether_005fhtmlCss_005f3(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("    ");
+      if (_jspx_meth_ether_005fhtmlCss_005f4(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("\n");
+      out.write("    ");
+      if (_jspx_meth_ether_005fhtmlResourceJsp_005f0(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("    ");
+      if (_jspx_meth_ether_005fhtmlJsp_005f0(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("    ");
+      if (_jspx_meth_ether_005fhtmlJsp_005f1(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("    ");
+      if (_jspx_meth_ether_005fhtmlJs_005f0(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("    ");
+      if (_jspx_meth_ether_005fhtmlJs_005f1(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("    ");
+      if (_jspx_meth_ether_005fhtmlJs_005f2(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("\n");
+      out.write("</head>\n");
+      out.write("\n");
+      out.write("<body>\n");
+      out.write("\n");
+      out.write("\n");
+      if (_jspx_meth_spring_005fmessage_005f0(_jspx_page_context))
+        return;
+      out.write(' ');
+      out.write(':');
+      out.write(' ');
+      if (_jspx_meth_spring_005fmessage_005f1(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("\n");
+      out.write("<br/><br/>\n");
+      out.write("\n");
+      out.write("<a href=\"visualization?\">");
+      if (_jspx_meth_spring_005fmessage_005f2(_jspx_page_context))
+        return;
+      out.write("</a>\n");
+      out.write("\n");
+      out.write("<hr>\n");
+      out.write("<h3>");
+      if (_jspx_meth_spring_005fmessage_005f3(_jspx_page_context))
+        return;
+      out.write("</h3>\n");
+      out.write("<hr>\n");
+      out.write("\n");
+      out.write("<table width=\"100%\">\n");
+      out.write("    <tr>\n");
+      out.write("        <td>\n");
+      out.write("            <a href=\"visualization?methodName=view\">");
+      if (_jspx_meth_spring_005fmessage_005f4(_jspx_page_context))
+        return;
+      out.write("</a>\n");
+      out.write("        </td>\n");
+      out.write("        <td>");
+      if (_jspx_meth_spring_005fmessage_005f5(_jspx_page_context))
+        return;
+      out.write("</td>\n");
+      out.write("    </tr>\n");
+      out.write("\n");
+      out.write("</table>\n");
+      out.write("\n");
+      out.write("<hr>\n");
+      if (_jspx_meth_spring_005fmessage_005f6(_jspx_page_context))
+        return;
+      out.write("<br/>\n");
+      out.write(" ");
+      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${plateforms}", java.lang.String.class, (PageContext)_jspx_page_context, null, false));
+      out.write("\n");
+      out.write(" <br/><br/>\n");
+      out.write("<hr>\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("<div class=\"span-24\" id=\"pageContent\">\n");
+      out.write("    <div id=\"generalContainerPlateforms\" class=\"span-7 colborder\">\n");
+      out.write("        <div id=\"messages\">\n");
+      out.write("            ");
+      if (_jspx_meth_spring_005fmessage_005f7(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("        </div>\n");
+      out.write("\n");
+      out.write("        <div id=\"containerPlateforms\"></div>\n");
+      out.write("    </div>\n");
+      out.write("\n");
+      out.write("    <div id=\"generalContainerParameters\" class=\"span-7 colborder\">\n");
+      out.write("        <div id=\"messages\">\n");
+      out.write("            ");
+      if (_jspx_meth_spring_005fmessage_005f8(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("        </div>\n");
+      out.write("\n");
+      out.write("        <div id=\"containerParameters\"></div>\n");
+      out.write("    </div>\n");
+      out.write("\n");
+      out.write("    <div id=\"generalContainerCalendar\" class=\"span-9 last\">\n");
+      out.write("        <div id=\"messages\">\n");
+      out.write("            ");
+      if (_jspx_meth_spring_005fmessage_005f9(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("        </div>\n");
+      out.write("            <div id=\"embeddedCalendar\" class=\"embeddedCalendar\"></div>\n");
+      out.write("            <div class=\"dateField leftField\">\n");
+      out.write("                   ");
+      if (_jspx_meth_spring_005fmessage_005f10(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("            </div>\n");
+      out.write("            <div id=\"embeddedDateField\" class=\"dateField rightField\">\n");
+      out.write("                ");
+      if (_jspx_meth_spring_005fmessage_005f11(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("            </div>\n");
+      out.write("            <div class=\"dateField leftField\">\n");
+      out.write("                ");
+      if (_jspx_meth_spring_005fmessage_005f12(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("            </div>\n");
+      out.write("            <div id=\"embeddedEndDateField\" class=\"dateField rightField\">\n");
+      out.write("                ");
+      if (_jspx_meth_spring_005fmessage_005f13(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("            </div>\n");
+      out.write("\n");
+      out.write("            <div class=\"errorAndButtons\">\n");
+      out.write("                <div id=\"notice\" style=\"visibility:hidden\" class=\"error span-6\">&nbsp;</div>\n");
+      out.write("                <div id=\"containerButtons\" class=\"buttons span-7\"></div>\n");
+      out.write("            </div>\n");
+      out.write("    </div>\n");
+      out.write("\n");
+      out.write("</div>\n");
+      out.write("\n");
+      out.write("<script type=\"text/javascript\">\n");
+      out.write("    var interfaceTexts = $A();\n");
+      out.write("    interfaceTexts[\"data.visualization.noPlateform\"] = '");
+      if (_jspx_meth_spring_005fmessage_005f14(_jspx_page_context))
+        return;
+      out.write("';\n");
+      out.write("    interfaceTexts[\"data.visualization.noParameter\"] = '");
+      if (_jspx_meth_spring_005fmessage_005f15(_jspx_page_context))
+        return;
+      out.write("';\n");
+      out.write("    interfaceTexts[\"data.visualization.button.visualize\"] = '");
+      if (_jspx_meth_spring_005fmessage_005f16(_jspx_page_context))
+        return;
+      out.write("';\n");
+      out.write("    interfaceTexts[\"data.visualization.button.download\"] = '");
+      if (_jspx_meth_spring_005fmessage_005f17(_jspx_page_context))
+        return;
+      out.write("';\n");
+      out.write("    interfaceTexts[\"data.visualization.loading.data\"] = '");
+      if (_jspx_meth_spring_005fmessage_005f18(_jspx_page_context))
+        return;
+      out.write("';\n");
+      out.write("    interfaceTexts[\"data.visualization.Unvalid_Period\"] = \"");
+      if (_jspx_meth_spring_005fmessage_005f19(_jspx_page_context))
+        return;
+      out.write("\";\n");
+      out.write("\n");
+      out.write("    var interfaceVisualization = new InterfaceVisualization( ");
+      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${plateforms}", java.lang.String.class, (PageContext)_jspx_page_context, null, false));
+      out.write(" );\n");
+      out.write("</script>\n");
+      out.write("\n");
+      out.write("</body>\n");
+      out.write("</html>\n");
+      out.write("<!-- /*** ****************** FIN VISU ******************** **/ -->");
+    } catch (Throwable t) {
+      if (!(t instanceof SkipPageException)){
+        out = _jspx_out;
+        if (out != null && out.getBufferSize() != 0)
+          try { out.clearBuffer(); } catch (java.io.IOException e) {}
+        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
+      }
+    } finally {
+      _jspxFactory.releasePageContext(_jspx_page_context);
+    }
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlCss_005f0(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlCss
+    org.apache.jsp.tag.web.htmlCss_tag _jspx_th_ether_005fhtmlCss_005f0 = new org.apache.jsp.tag.web.htmlCss_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlCss_005f0);
+    _jspx_th_ether_005fhtmlCss_005f0.setJspContext(_jspx_page_context);
+    // /visualization/visu_plateform.jsp(14,4) name = cssFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlCss_005f0.setCssFile("ether");
+    _jspx_th_ether_005fhtmlCss_005f0.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlCss_005f0);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlCss_005f1(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlCss
+    org.apache.jsp.tag.web.htmlCss_tag _jspx_th_ether_005fhtmlCss_005f1 = new org.apache.jsp.tag.web.htmlCss_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlCss_005f1);
+    _jspx_th_ether_005fhtmlCss_005f1.setJspContext(_jspx_page_context);
+    // /visualization/visu_plateform.jsp(15,4) name = cssFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlCss_005f1.setCssFile("button");
+    _jspx_th_ether_005fhtmlCss_005f1.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlCss_005f1);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlCss_005f2(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlCss
+    org.apache.jsp.tag.web.htmlCss_tag _jspx_th_ether_005fhtmlCss_005f2 = new org.apache.jsp.tag.web.htmlCss_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlCss_005f2);
+    _jspx_th_ether_005fhtmlCss_005f2.setJspContext(_jspx_page_context);
+    // /visualization/visu_plateform.jsp(16,4) name = cssFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlCss_005f2.setCssFile("blueprint-css/blueprint/src/grid");
+    _jspx_th_ether_005fhtmlCss_005f2.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlCss_005f2);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlCss_005f3(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlCss
+    org.apache.jsp.tag.web.htmlCss_tag _jspx_th_ether_005fhtmlCss_005f3 = new org.apache.jsp.tag.web.htmlCss_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlCss_005f3);
+    _jspx_th_ether_005fhtmlCss_005f3.setJspContext(_jspx_page_context);
+    // /visualization/visu_plateform.jsp(17,4) name = cssFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlCss_005f3.setCssFile("calendarview-1.2/calendarview");
+    _jspx_th_ether_005fhtmlCss_005f3.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlCss_005f3);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlCss_005f4(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlCss
+    org.apache.jsp.tag.web.htmlCss_tag _jspx_th_ether_005fhtmlCss_005f4 = new org.apache.jsp.tag.web.htmlCss_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlCss_005f4);
+    _jspx_th_ether_005fhtmlCss_005f4.setJspContext(_jspx_page_context);
+    // /visualization/visu_plateform.jsp(18,4) name = cssFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlCss_005f4.setCssFile("visu_plateform");
+    _jspx_th_ether_005fhtmlCss_005f4.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlCss_005f4);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlResourceJsp_005f0(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlResourceJsp
+    org.apache.jsp.tag.web.htmlResourceJsp_tag _jspx_th_ether_005fhtmlResourceJsp_005f0 = new org.apache.jsp.tag.web.htmlResourceJsp_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlResourceJsp_005f0);
+    _jspx_th_ether_005fhtmlResourceJsp_005f0.setJspContext(_jspx_page_context);
+    // /visualization/visu_plateform.jsp(20,4) name = jspFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlResourceJsp_005f0.setJspFile("etherHead");
+    _jspx_th_ether_005fhtmlResourceJsp_005f0.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlResourceJsp_005f0);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlJsp_005f0(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlJsp
+    org.apache.jsp.tag.web.htmlJsp_tag _jspx_th_ether_005fhtmlJsp_005f0 = new org.apache.jsp.tag.web.htmlJsp_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJsp_005f0);
+    _jspx_th_ether_005fhtmlJsp_005f0.setJspContext(_jspx_page_context);
+    // /visualization/visu_plateform.jsp(21,4) name = jspFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlJsp_005f0.setJspFile("visu_plateform-script");
+    _jspx_th_ether_005fhtmlJsp_005f0.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJsp_005f0);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlJsp_005f1(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlJsp
+    org.apache.jsp.tag.web.htmlJsp_tag _jspx_th_ether_005fhtmlJsp_005f1 = new org.apache.jsp.tag.web.htmlJsp_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJsp_005f1);
+    _jspx_th_ether_005fhtmlJsp_005f1.setJspContext(_jspx_page_context);
+    // /visualization/visu_plateform.jsp(22,4) name = jspFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlJsp_005f1.setJspFile("visu_plateform-classes");
+    _jspx_th_ether_005fhtmlJsp_005f1.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJsp_005f1);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlJs_005f0(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlJs
+    org.apache.jsp.tag.web.htmlJs_tag _jspx_th_ether_005fhtmlJs_005f0 = new org.apache.jsp.tag.web.htmlJs_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f0);
+    _jspx_th_ether_005fhtmlJs_005f0.setJspContext(_jspx_page_context);
+    // /visualization/visu_plateform.jsp(23,4) name = jsFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlJs_005f0.setJsFile("calendarview-1.2/javascripts/calendarview");
+    _jspx_th_ether_005fhtmlJs_005f0.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f0);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlJs_005f1(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlJs
+    org.apache.jsp.tag.web.htmlJs_tag _jspx_th_ether_005fhtmlJs_005f1 = new org.apache.jsp.tag.web.htmlJs_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f1);
+    _jspx_th_ether_005fhtmlJs_005f1.setJspContext(_jspx_page_context);
+    // /visualization/visu_plateform.jsp(24,4) name = jsFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlJs_005f1.setJsFile("Button");
+    _jspx_th_ether_005fhtmlJs_005f1.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f1);
+    return false;
+  }
+
+  private boolean _jspx_meth_ether_005fhtmlJs_005f2(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  ether:htmlJs
+    org.apache.jsp.tag.web.htmlJs_tag _jspx_th_ether_005fhtmlJs_005f2 = new org.apache.jsp.tag.web.htmlJs_tag();
+    org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f2);
+    _jspx_th_ether_005fhtmlJs_005f2.setJspContext(_jspx_page_context);
+    // /visualization/visu_plateform.jsp(25,4) name = jsFile type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
+    _jspx_th_ether_005fhtmlJs_005f2.setJsFile("maj");
+    _jspx_th_ether_005fhtmlJs_005f2.doTag();
+    org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_ether_005fhtmlJs_005f2);
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f0(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f0 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f0.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f0.setParent(null);
+    // /visualization/visu_plateform.jsp(32,0) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f0.setCode("label.language");
+    // /visualization/visu_plateform.jsp(32,0) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f0.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f0 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f0 = _jspx_th_spring_005fmessage_005f0.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f0[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f0.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f0.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f0);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f1(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f1 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f1.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f1.setParent(null);
+    // /visualization/visu_plateform.jsp(32,60) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f1.setCode("language");
+    // /visualization/visu_plateform.jsp(32,60) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f1.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f1 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f1 = _jspx_th_spring_005fmessage_005f1.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f1.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f1[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f1.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f1.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f1);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f2(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f2 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f2.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f2.setParent(null);
+    // /visualization/visu_plateform.jsp(36,25) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f2.setCode("label.index");
+    // /visualization/visu_plateform.jsp(36,25) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f2.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f2 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f2 = _jspx_th_spring_005fmessage_005f2.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f2.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f2[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f2.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f2.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f2);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f3(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f3 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f3.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f3.setParent(null);
+    // /visualization/visu_plateform.jsp(39,4) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f3.setCode("titre.visu.pf");
+    // /visualization/visu_plateform.jsp(39,4) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f3.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f3 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f3 = _jspx_th_spring_005fmessage_005f3.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f3.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f3[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f3.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f3.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f3);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f4(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f4 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f4.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f4.setParent(null);
+    // /visualization/visu_plateform.jsp(45,52) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f4.setCode("text.visu.href");
+    // /visualization/visu_plateform.jsp(45,52) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f4.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f4 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f4 = _jspx_th_spring_005fmessage_005f4.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f4.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f4[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f4.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f4.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f4);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f5(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f5 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f5.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f5.setParent(null);
+    // /visualization/visu_plateform.jsp(47,12) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f5.setCode("text.visu");
+    // /visualization/visu_plateform.jsp(47,12) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f5.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f5 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f5 = _jspx_th_spring_005fmessage_005f5.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f5.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f5[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f5.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f5.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f5);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f6(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f6 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f6.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f6.setParent(null);
+    // /visualization/visu_plateform.jsp(53,0) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f6.setCode("text.results");
+    // /visualization/visu_plateform.jsp(53,0) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f6.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f6 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f6 = _jspx_th_spring_005fmessage_005f6.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f6.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f6[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f6.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f6.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f6);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f7(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f7 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f7.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f7.setParent(null);
+    // /visualization/visu_plateform.jsp(62,12) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f7.setCode("data.visualization.selectPf");
+    // /visualization/visu_plateform.jsp(62,12) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f7.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f7 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f7 = _jspx_th_spring_005fmessage_005f7.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f7.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f7[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f7.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f7.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f7);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f8(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f8 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f8.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f8.setParent(null);
+    // /visualization/visu_plateform.jsp(70,12) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f8.setCode("data.visualization.selectParameter");
+    // /visualization/visu_plateform.jsp(70,12) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f8.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f8 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f8 = _jspx_th_spring_005fmessage_005f8.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f8.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f8[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f8.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f8.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f8);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f9(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f9 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f9.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f9.setParent(null);
+    // /visualization/visu_plateform.jsp(78,12) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f9.setCode("data.visualization.selectDate");
+    // /visualization/visu_plateform.jsp(78,12) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f9.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f9 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f9 = _jspx_th_spring_005fmessage_005f9.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f9.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f9[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f9.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f9.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f9);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f10(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f10 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f10.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f10.setParent(null);
+    // /visualization/visu_plateform.jsp(82,19) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f10.setCode("data.visualization.BeginDate");
+    // /visualization/visu_plateform.jsp(82,19) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f10.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f10 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f10 = _jspx_th_spring_005fmessage_005f10.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f10.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f10[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f10.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f10.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f10);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f11(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f11 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f11.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f11.setParent(null);
+    // /visualization/visu_plateform.jsp(85,16) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f11.setCode("data.visualization.selectDate");
+    // /visualization/visu_plateform.jsp(85,16) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f11.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f11 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f11 = _jspx_th_spring_005fmessage_005f11.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f11.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f11[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f11.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f11.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f11);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f12(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f12 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f12.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f12.setParent(null);
+    // /visualization/visu_plateform.jsp(88,16) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f12.setCode("data.visualization.EndDate");
+    // /visualization/visu_plateform.jsp(88,16) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f12.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f12 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f12 = _jspx_th_spring_005fmessage_005f12.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f12.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f12[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f12.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f12.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f12);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f13(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f13 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f13.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f13.setParent(null);
+    // /visualization/visu_plateform.jsp(91,16) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f13.setCode("data.visualization.selectDate");
+    // /visualization/visu_plateform.jsp(91,16) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f13.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f13 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f13 = _jspx_th_spring_005fmessage_005f13.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f13.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f13[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f13.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f13.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f13);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f14(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f14 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f14.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f14.setParent(null);
+    // /visualization/visu_plateform.jsp(104,56) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f14.setCode("data.visualization.noPf");
+    // /visualization/visu_plateform.jsp(104,56) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f14.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f14 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f14 = _jspx_th_spring_005fmessage_005f14.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f14.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f14[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f14.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f14.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f14);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f15(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f15 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f15.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f15.setParent(null);
+    // /visualization/visu_plateform.jsp(105,56) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f15.setCode("data.visualization.noParameter");
+    // /visualization/visu_plateform.jsp(105,56) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f15.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f15 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f15 = _jspx_th_spring_005fmessage_005f15.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f15.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f15[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f15.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f15.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f15);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f16(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f16 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f16.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f16.setParent(null);
+    // /visualization/visu_plateform.jsp(106,61) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f16.setCode("data.visualization.button.visualize");
+    // /visualization/visu_plateform.jsp(106,61) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f16.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f16 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f16 = _jspx_th_spring_005fmessage_005f16.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f16.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f16[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f16.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f16.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f16);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f17(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f17 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f17.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f17.setParent(null);
+    // /visualization/visu_plateform.jsp(107,60) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f17.setCode("data.visualization.button.download");
+    // /visualization/visu_plateform.jsp(107,60) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f17.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f17 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f17 = _jspx_th_spring_005fmessage_005f17.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f17.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f17[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f17.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f17.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f17);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f18(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f18 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f18.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f18.setParent(null);
+    // /visualization/visu_plateform.jsp(108,57) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f18.setCode("data.visualization.loading.data");
+    // /visualization/visu_plateform.jsp(108,57) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f18.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f18 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f18 = _jspx_th_spring_005fmessage_005f18.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f18.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f18[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f18.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f18.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f18);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f19(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f19 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f19.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f19.setParent(null);
+    // /visualization/visu_plateform.jsp(109,59) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f19.setCode("data.visualization.Unvalid_Period");
+    // /visualization/visu_plateform.jsp(109,59) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f19.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f19 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f19 = _jspx_th_spring_005fmessage_005f19.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f19.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f19[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f19.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f19.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f19);
+    }
+    return false;
+  }
+}
Index: /ether_2012/work/org/apache/jsp/visualization/visu_jsp.java
===================================================================
--- /ether_2012/work/org/apache/jsp/visualization/visu_jsp.java	(revision 319)
+++ /ether_2012/work/org/apache/jsp/visualization/visu_jsp.java	(revision 319)
@@ -0,0 +1,322 @@
+package org.apache.jsp.visualization;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+import com.ether.Context;
+
+public final class visu_jsp extends org.apache.jasper.runtime.HttpJspBase
+    implements org.apache.jasper.runtime.JspSourceDependent {
+
+  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
+
+  private static java.util.List _jspx_dependants;
+
+  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody;
+
+  private javax.el.ExpressionFactory _el_expressionfactory;
+  private org.apache.AnnotationProcessor _jsp_annotationprocessor;
+
+  public Object getDependants() {
+    return _jspx_dependants;
+  }
+
+  public void _jspInit() {
+    _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
+    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
+    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
+  }
+
+  public void _jspDestroy() {
+    _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.release();
+  }
+
+  public void _jspService(HttpServletRequest request, HttpServletResponse response)
+        throws java.io.IOException, ServletException {
+
+    PageContext pageContext = null;
+    HttpSession session = null;
+    ServletContext application = null;
+    ServletConfig config = null;
+    JspWriter out = null;
+    Object page = this;
+    JspWriter _jspx_out = null;
+    PageContext _jspx_page_context = null;
+
+
+    try {
+      response.setContentType("text/html;charset=UTF-8");
+      pageContext = _jspxFactory.getPageContext(this, request, response,
+      			null, true, 8192, true);
+      _jspx_page_context = pageContext;
+      application = pageContext.getServletContext();
+      config = pageContext.getServletConfig();
+      session = pageContext.getSession();
+      out = pageContext.getOut();
+      _jspx_out = out;
+
+      out.write("\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("\n");
+      out.write("<html>\n");
+      out.write("<head>\n");
+      out.write("    <meta http-equiv=\"content-type\" content=\"text/html; charset=iso-8859-1\">\n");
+      out.write("    <META HTTP-EQUIV=\"PRAGMA\" CONTENT=\"NO-CACHE\">\n");
+      out.write("\n");
+      out.write("    <script src=\"javascript/prototype.js\" type=\"text/javascript\"></script>\n");
+      out.write("    <script src=\"javascript/effects.js\" type=\"text/javascript\"></script>\n");
+      out.write("    <script src=\"javascript/controls.js\" type=\"text/javascript\"></script>\n");
+      out.write("    <link rel=\"stylesheet\" href=\"css/style.css\" type=\"text/css\"/>\n");
+      out.write("\n");
+      out.write("    <title>Project source</title>\n");
+      out.write("</head>\n");
+      out.write("\n");
+      out.write("<body>\n");
+      out.write("\n");
+      out.print(Context.getLocale( request ));
+      out.write('\n');
+      if (_jspx_meth_spring_005fmessage_005f0(_jspx_page_context))
+        return;
+      out.write(' ');
+      out.write(':');
+      out.write(' ');
+      if (_jspx_meth_spring_005fmessage_005f1(_jspx_page_context))
+        return;
+      out.write("\n");
+      out.write("\n");
+      out.write("<br/><br/>\n");
+      out.write("\n");
+      out.write("<a href=\"visualization?\">");
+      if (_jspx_meth_spring_005fmessage_005f2(_jspx_page_context))
+        return;
+      out.write("</a>\n");
+      out.write("\n");
+      out.write("<hr>\n");
+      out.write("<h3>");
+      if (_jspx_meth_spring_005fmessage_005f3(_jspx_page_context))
+        return;
+      out.write("</h3>\n");
+      out.write("<hr>\n");
+      out.write("\n");
+      out.write("<table width=\"100%\">\n");
+      out.write("    <tr>\n");
+      out.write("        <td>\n");
+      out.write("            <a href=\"visualization?methodName=viewAllPlateforms\">");
+      if (_jspx_meth_spring_005fmessage_005f4(_jspx_page_context))
+        return;
+      out.write("</a>\n");
+      out.write("        </td>\n");
+      out.write("        <td>");
+      if (_jspx_meth_spring_005fmessage_005f5(_jspx_page_context))
+        return;
+      out.write("</td>\n");
+      out.write("    </tr>\n");
+      out.write("\n");
+      out.write("</table>\n");
+      out.write("                         sssss\n");
+      out.write("<div id=\"container\">\n");
+      out.write("    <form method=\"get\" action=\"\">\n");
+      out.write("        <label for=\"testinput\">Search for a country name</label><br/>\n");
+      out.write("        <input type=\"text\" id=\"search\" name=\"search\" autocomplete=\"off\" class=\"input\" value=\"\"/><br/>\n");
+      out.write("\n");
+      out.write("        <div id=\"update\" style=\"display: none; position:relative;\"></div>\n");
+      out.write("        <input type=\"image\" name=\"register\" class=\"submit-btn\" src=\"http://www.roscripts.com/images/btn.gif\"\n");
+      out.write("               alt=\"submit\" title=\"submit\"/>\n");
+      out.write("    </form>\n");
+      out.write("    <script type=\"text/javascript\">\n");
+      out.write("        //alert('bau');\n");
+      out.write("        new Ajax.Autocompleter( 'search', 'update', 'response.php', { tokens: ','} );\n");
+      out.write("\n");
+      out.write("    </script>\n");
+      out.write("</div>\n");
+      out.write("\n");
+      out.write("</body>\n");
+      out.write("</html>");
+    } catch (Throwable t) {
+      if (!(t instanceof SkipPageException)){
+        out = _jspx_out;
+        if (out != null && out.getBufferSize() != 0)
+          try { out.clearBuffer(); } catch (java.io.IOException e) {}
+        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
+      }
+    } finally {
+      _jspxFactory.releasePageContext(_jspx_page_context);
+    }
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f0(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f0 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f0.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f0.setParent(null);
+    // /visualization/visu.jsp(22,0) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f0.setCode("label.language");
+    // /visualization/visu.jsp(22,0) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f0.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f0 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f0 = _jspx_th_spring_005fmessage_005f0.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f0[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f0.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f0.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f0);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f1(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f1 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f1.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f1.setParent(null);
+    // /visualization/visu.jsp(22,60) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f1.setCode("language");
+    // /visualization/visu.jsp(22,60) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f1.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f1 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f1 = _jspx_th_spring_005fmessage_005f1.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f1.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f1[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f1.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f1.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f1);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f2(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f2 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f2.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f2.setParent(null);
+    // /visualization/visu.jsp(26,25) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f2.setCode("label.index");
+    // /visualization/visu.jsp(26,25) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f2.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f2 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f2 = _jspx_th_spring_005fmessage_005f2.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f2.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f2[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f2.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f2.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f2);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f3(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f3 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f3.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f3.setParent(null);
+    // /visualization/visu.jsp(29,4) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f3.setCode("titre.visu");
+    // /visualization/visu.jsp(29,4) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f3.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f3 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f3 = _jspx_th_spring_005fmessage_005f3.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f3.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f3[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f3.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f3.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f3);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f4(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f4 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f4.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f4.setParent(null);
+    // /visualization/visu.jsp(35,65) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f4.setCode("text.visu.pf.href");
+    // /visualization/visu.jsp(35,65) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f4.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f4 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f4 = _jspx_th_spring_005fmessage_005f4.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f4.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f4[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f4.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f4.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f4);
+    }
+    return false;
+  }
+
+  private boolean _jspx_meth_spring_005fmessage_005f5(PageContext _jspx_page_context)
+          throws Throwable {
+    PageContext pageContext = _jspx_page_context;
+    JspWriter out = _jspx_page_context.getOut();
+    //  spring:message
+    org.springframework.web.servlet.tags.MessageTag _jspx_th_spring_005fmessage_005f5 = (org.springframework.web.servlet.tags.MessageTag) _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.get(org.springframework.web.servlet.tags.MessageTag.class);
+    _jspx_th_spring_005fmessage_005f5.setPageContext(_jspx_page_context);
+    _jspx_th_spring_005fmessage_005f5.setParent(null);
+    // /visualization/visu.jsp(38,12) name = code type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f5.setCode("text.visu.pf");
+    // /visualization/visu.jsp(38,12) name = htmlEscape type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
+    _jspx_th_spring_005fmessage_005f5.setHtmlEscape("true");
+    int[] _jspx_push_body_count_spring_005fmessage_005f5 = new int[] { 0 };
+    try {
+      int _jspx_eval_spring_005fmessage_005f5 = _jspx_th_spring_005fmessage_005f5.doStartTag();
+      if (_jspx_th_spring_005fmessage_005f5.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
+        return true;
+      }
+    } catch (Throwable _jspx_exception) {
+      while (_jspx_push_body_count_spring_005fmessage_005f5[0]-- > 0)
+        out = _jspx_page_context.popBody();
+      _jspx_th_spring_005fmessage_005f5.doCatch(_jspx_exception);
+    } finally {
+      _jspx_th_spring_005fmessage_005f5.doFinally();
+      _005fjspx_005ftagPool_005fspring_005fmessage_0026_005fhtmlEscape_005fcode_005fnobody.reuse(_jspx_th_spring_005fmessage_005f5);
+    }
+    return false;
+  }
+}
