#*
 * $Id: Action.java 502296 2007-02-01 17:33:39Z niallp $
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *#
#set( $items = $parameters.list )
#if( $items )
    #set( $itemCount = 0 )
    #foreach( $item in $items )
        #set( $itemCount = $itemCount + 1)
        $stack.push($item)
        #if( $parameters.listKey )
            #set( $itemKey = $stack.findValue($parameters.listKey) )
        #else
            #set( $itemKey = $item )
        #end
        #if( $parameters.listValue )
            #set( $itemValue  = $stack.findValue($parameters.listValue) )
        #else
            #set( $itemValue = $item )
        #end
        <input type="checkbox" name="$!struts.htmlEncode($parameters.name)" value="$!struts.htmlEncode($itemKey)"
        #parse("/$parameters.templateDir/simple/scripting-events.vm")
        id="$!struts.htmlEncode($parameters.name)-$itemCount" #if( $tag.contains($parameters.nameValue, $itemKey) ) checked="checked" #end />
        <label for="$!struts.htmlEncode($parameters.name)-$itemCount" class="checkboxLabel">$!struts.htmlEncode($itemValue)</label><br />
        #set ($trash = $stack.pop())
    #end
#else
  &nbsp;
#end
