@Override
 public void validate(Form<?> form) {
   final FormComponent<?> formComponent1 = components[0];
   final FormComponent<?> fecha = components[1];
   if (!(daoService.puedeEntrar(
       formComponent1.getInput(), (Date) fecha.getConvertedInput(), usuario, "10800000"))) {
     error(formComponent1, "a key", mensaje);
   }
 }
  public VistaHorasPage() {

    final Subject subject = SecurityUtils.getSubject();
    this.usuario = this.daoService.getUsuario(subject.getPrincipal().toString());

    this.labelDesdeModel =
        new LoadableDetachableModel<String>() {

          @Override
          protected String load() {
            return desde.toString();
          }
        };

    this.fechasModel =
        new LoadableDetachableModel<List<String>>() {

          @Override
          protected List<String> load() {

            List<String> fechas = new ArrayList<String>();

            for (int j = 2005; j < 2014; j++) {
              for (int i = 1; i < 13; i++) {
                fechas.add(i + "/" + j);
              }
            }

            return fechas;
          }
        };

    this.lstUsuariosModel =
        new LoadableDetachableModel<List<UsuarioListaHoras>>() {
          @Override
          protected List<UsuarioListaHoras> load() {
            return daoService.obtenerHorasUsuarios(desde, hasta, VistaHorasPage.this.sectorGlobal);
          }
        };

    this.lstUsuariosEnRojoModel =
        new LoadableDetachableModel<List<UsuarioListaHoras>>() {

          @Override
          protected List<UsuarioListaHoras> load() {
            //				List<UsuarioListaHoras> devolver = daoService.obtenerHorasUsuarios(desde,
            // hasta,VistaHorasPage.this.sectorGlobal);
            List<UsuarioListaHoras> devolver = VistaHorasPage.this.lstUsuariosModel.getObject();
            List<UsuarioListaHoras> itemsToRemove = new ArrayList<UsuarioListaHoras>();
            for (UsuarioListaHoras usuarioHoras : devolver) {
              if (!usuarioHoras.tieneDiaMenorDedicacion(VistaHorasPage.this.desde)) {
                itemsToRemove.add(usuarioHoras);
              }
            }
            devolver.removeAll(itemsToRemove);
            return devolver;
          }
        };

    VistaHorasForm form = new VistaHorasForm("form");
    form.setOutputMarkupId(true);
    add(form);

    List<Feriado> feriados = daoService.getFeriados();
    final List<Date> fechaFeriados = new ArrayList<Date>();
    for (Feriado feriado : feriados) {
      fechaFeriados.add(feriado.getFecha());
    }
    this.listViewContainer = new WebMarkupContainer("listViewContainer");
    this.listViewContainer.setOutputMarkupId(true);
    totales = new double[31];
    //		for (int i = 0; i < 32; i++) {
    //			totales[i]= new Double(0);
    //		}
    final PageableListView<UsuarioListaHoras> usuariosHorasListView =
        new PageableListView<UsuarioListaHoras>("tabla", this.lstUsuariosModel, 1000) {

          private static final long serialVersionUID = 1L;

          @Override
          protected void populateItem(ListItem<UsuarioListaHoras> item) {
            final UsuarioListaHoras usuarioHoras = item.getModel().getObject();
            //
            //	           	if((item.getIndex() % 2) == 0){
            //	           		item.add(new AttributeModifier("class","odd"));
            //	           	}
            String nombreCorregido =
                daoService
                    .getNombreApellido(usuarioHoras.getUsuario())
                    .replaceAll("ó", "ó")
                    .replaceAll("é", "é")
                    .replaceAll("ñ", "ñ")
                    .replaceAll("á", "á")
                    .replaceAll("í", "í");

            Label nombre = new Label("apellidoNombre", nombreCorregido);
            item.add(nombre);
            Map<Date, Double> colHoras = new HashMap<Date, Double>();
            colHoras.putAll(usuarioHoras.getDiaHoras());

            LocalDate diaActual = new LocalDate(VistaHorasPage.this.desde);
            Double totalHoras = new Double(0);
            for (int j = 1; j <= 31; j++) {
              Label lbHoras;
              Double horasDia = new Double(0);

              horasDia = colHoras.get(diaActual.toDate());
              if (horasDia != null) {
                totales[j - 1] = totales[j - 1] + horasDia;
                String mensaje = decimal.format(horasDia);
                totalHoras = totalHoras + horasDia;
                lbHoras = new Label("contenidoDia" + j, Model.of(mensaje));
                lbHoras.add(new AttributeModifier("style", Model.of("display: block; ")));
                if (fechaFeriados.contains(diaActual.toDate())
                    || diaActual.getDayOfWeek() == DateTimeConstants.SATURDAY
                    || diaActual.getDayOfWeek() == DateTimeConstants.SUNDAY) {
                  lbHoras.add(
                      new AttributeAppender(
                          "style", Model.of("background-color: rgb(223, 223, 223); height:100%;")));
                  // background-clip: border-box; background-color: blue; color: white; border: 5px
                  // solid blue; border-radius: 5px;
                }
                if (horasDia < usuarioHoras.getDedicacion()) {
                  lbHoras.add(new AttributeAppender("style", Model.of("color:red;")));
                }
              } else if (fechaFeriados.contains(diaActual.toDate())
                  || diaActual.getDayOfWeek() == DateTimeConstants.SATURDAY
                  || diaActual.getDayOfWeek() == DateTimeConstants.SUNDAY) {
                lbHoras = new Label("contenidoDia" + j, "0");
                lbHoras.add(
                    new AttributeModifier(
                        "style", Model.of("background-color:rgb(223, 223, 223); height:100%;")));
              } else {
                lbHoras = new Label("contenidoDia" + j, "0");
              }

              item.add(lbHoras);
              diaActual = diaActual.plusDays(1);
            }
            //            	System.out.println(totalHoras);
            // Model.of(totalHoras)
            item.add(new Label("totalPersona", Model.of(totalHoras)));
          };
        };
    // html dinamico
    this.titulos =
        new WebComponent("tituloHtml") {
          @Override
          public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) {
            Response response = getRequestCycle().getResponse();
            String respuesta = "";
            respuesta += "<th class='tablaTitulo' scope='col'>Usuarios</th>";
            LocalDate diaActual = new LocalDate(VistaHorasPage.this.desde);
            for (int i = 1; i < 32; i++) {

              respuesta +=
                  "<th class='tablaTitulo' scope='col' >" + diaActual.getDayOfMonth() + "</th>";
              diaActual = diaActual.plusDays(1);
            }
            respuesta += "<th class='tablaTitulo' scope='col' > Total </th>";
            response.write(respuesta);
          }
        };

    this.totalesHtml =
        new WebComponent("totalesHtml") {
          public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) {
            Response response = getRequestCycle().getResponse();
            String respuesta = "";
            respuesta += "<td class='tablaTitulo' scope='col'>Totales:</td>";
            LocalDate diaActual = new LocalDate(VistaHorasPage.this.desde);
            for (int i = 1; i < 32; i++) {

              respuesta +=
                  "<td class='tablaTitulo' scope='col' >"
                      + decimal.format(VistaHorasPage.this.totales[i - 1])
                      + "</td>";
              diaActual = diaActual.plusDays(1);
            }
            respuesta += "<td class='tablaTitulo' scope='col' >  </td>";
            response.write(respuesta);
            for (int i = 0; i < 31; i++) {
              totales[i] = new Double(0);
            }
          };
        };

    this.listViewContainer.add(titulos);
    this.listViewContainer.add(totalesHtml);
    this.listViewContainer.add(usuariosHorasListView);
    //		this.listViewContainer.add(new AjaxPagingNavigator("navigator", usuariosHorasListView));
    add(listViewContainer);

    radioContainer = new WebMarkupContainer("radioContainerUsuarios");
    radioContainer.setOutputMarkupId(true);

    RadioGroup<String> radiog = new RadioGroup<String>("radioGroup", new Model<String>());

    Radio<String> mostrarTodas = new Radio<String>("mostrarTodas", Model.of("Todos"));
    Radio<String> mostrarEnRojo =
        new Radio<String>("mostrarEnRojo", Model.of("Menor que dedicación"));

    mostrarTodas.add(
        new AjaxEventBehavior("onchange") {

          protected void onEvent(AjaxRequestTarget target) {
            VistaHorasPage.this.lstUsuariosModel.detach();
            VistaHorasPage.this.lstUsuariosEnRojoModel.detach();
            usuariosHorasListView.setModel(VistaHorasPage.this.lstUsuariosModel);
            target.add(VistaHorasPage.this.listViewContainer);
          }
        });

    mostrarEnRojo.add(
        new AjaxEventBehavior("onchange") {

          protected void onEvent(AjaxRequestTarget target) {
            VistaHorasPage.this.lstUsuariosModel.detach();
            VistaHorasPage.this.lstUsuariosEnRojoModel.detach();
            usuariosHorasListView.setModel(VistaHorasPage.this.lstUsuariosEnRojoModel);
            target.add(VistaHorasPage.this.listViewContainer);
          }
        });

    radiog.add(mostrarTodas);
    radiog.add(mostrarEnRojo);
    radioContainer.add(radiog);

    add(radioContainer);
  }