var FancyForm = {
        start: function(elements, options){
                if($type(elements)!='array') elements = $$('input');
                if(!options) options = [];
                FancyForm.onclasses = ($type(options['onClasses']) == 'object') ? options['onClasses'] : {
                        checkbox: 'checked',
                        radio: 'selected'
                }
                FancyForm.offclasses = ($type(options['offClasses']) == 'object') ? options['offClasses'] : {
                        checkbox: 'unchecked',
                        radio: 'deselected'
                }
                if($type(options['extraClasses']) == 'object'){
                        FancyForm.extra = options['extraClasses'];
                } else if(options['extraClasses']){
                        FancyForm.extra = {
                                checkbox: 'f_checkbox',
                                radio: 'f_radio',
                                on: 'f_on',
                                off: 'f_off',
                                all: 'fancy'
                        }
                } else {
                        FancyForm.extra = {};
                }
                FancyForm.onSelect = $pick(options['onSelect'], function(el){});
                FancyForm.onDeselect = $pick(options['onDeselect'], function(el){});
                var keeps = new Array();
                FancyForm.chks = elements.filter(function(chk){
            if( $type(chk) != 'element' ) return false;
                        if( $(chk).getTag() == 'input'
              && (FancyForm.onclasses[chk.getProperty('type')]) ){
                                var el = chk.getParent();
                                if(el.getElement('input')==chk){
                                        el.type = chk.getProperty('type');
                                        el.inputElement = chk;
                                        this.push(el);
                                } else {
                                        chk.addEvent('click',function(ev){ev.stopPropagation();})
                                //      el = (new Element('div',{class:'hi'}).adopt(chk)).injectInside(el);
                                }
                        } else if( (chk.inputElement = chk.getElement('input')) && (FancyForm.onclasses[(chk.type = chk.inputElement.getProperty('type'))]) ){
                                return true;
                        }
                        return false;
                }.bind(keeps));
                FancyForm.chks = FancyForm.chks.merge(keeps);
                keeps = null;
                FancyForm.chks.each(function(chk){
                        chk.inputElement.setStyle('display', 'none');
                        chk.name = chk.inputElement.getProperty('name');
                        if(chk.inputElement.checked) FancyForm.select(chk);
                        else FancyForm.deselect(chk);
                        chk.addEvent('click', function(e){
                                if (typeof e.preventDefault == 'function')
                                        e.preventDefault(true);
                                else if (typeof e.returnValue == 'function')
                                        e.returnValue(true);
                                if (!chk.hasClass(FancyForm.onclasses[chk.type])) FancyForm.select(chk);
                                else if(chk.type != 'radio') FancyForm.deselect(chk);
                        });
                        if(extraclass = FancyForm.extra[chk.type])
                                chk.addClass(extraclass);
                        if(extraclass = FancyForm.extra['all'])
                                chk.addClass(extraclass);
                });
        },
        select: function(chk){
                chk.inputElement.checked = 'checked';
                chk.removeClass(FancyForm.offclasses[chk.type]);
                chk.addClass(FancyForm.onclasses[chk.type]);
                if (chk.type == 'radio'){
                        FancyForm.chks.each(function(other){
                                if (other.name != chk.name || other == chk) return;
                                FancyForm.deselect(other);
                        });
                }
                if(extraclass = FancyForm.extra['on'])
                        chk.addClass(extraclass);
                if(extraclass = FancyForm.extra['off'])
                        chk.removeClass(extraclass);
                FancyForm.onSelect(chk);
        },
        deselect: function(chk){
                chk.inputElement.checked = false;
                chk.removeClass(FancyForm.onclasses[chk.type]);
                chk.addClass(FancyForm.offclasses[chk.type]);
                if(extraclass = FancyForm.extra['off'])
                        chk.addClass(extraclass);
                if(extraclass = FancyForm.extra['on'])
                        chk.removeClass(extraclass);
                FancyForm.onDeselect(chk);
        },
        all: function(){
                FancyForm.chks.each(function(chk){
                        FancyForm.select(chk);
                });
        },
        none: function(){
                FancyForm.chks.each(function(chk){
                        FancyForm.deselect(chk);
                });
        }
}

window.addEvent('load', function(){
        FancyForm.start();
});
