function Category() {
    this.initialize.apply(this, arguments);
}
Category.prototype = {
    hundle_category : '.gourmet_category',
    hundle_cancel   : '.gourmet_category_cancel',
    form_id : '',
    initialize: function(args) {
        var $self = this;
        if (typeof args == 'object') {
            $self.form_id = args.form_id;
        }
        $self.bind_selects();
        $self.bind_cancels();
    },
    bind_selects: function() {
        var $self = this;
        //var $parts = j$('#' + $self.form_id + ' > div >' + $self.hundle_category);
        var $parts = j$($self.hundle_category);
        for (var i=0; i < $parts.length; i++) {
            var $elem = j$( $parts[i] );
            $elem.bind("change", function() {
                var $selected = j$(this);
                $self.set( $selected );
            } );
        }
    },
    bind_cancels : function() {
        var $self = this;
        var $cancels = j$( $self.hundle_cancel );
        for (var i=0; i < $cancels.length; i++) {
            var $cancel = j$( $cancels[i] );
            $cancel.bind("click", function() {
                var $clicked = j$(this);
                $self.cancel( $clicked );
            });
        }
    },
    set: function( $selected, $callback ) {
        var $self = this;
        $selected.attr('name').match( /^(([a-zA-Z\_\-]+)(\d*?))\_(\d+)$/ );
        var base_name = RegExp.$1;
        var name      = RegExp.$2;
        var number    = RegExp.$3;
        var level     = RegExp.$4;

        $self.clear_child(base_name, level);

        if ( $selected.attr('value') == undefined || $selected.attr('value') == '' ) {
	   for (var i=Math.max(2,level),o;i<=3;i++) {
	       if ( o=document.getElementById("category_id_" + i + "_value") )
	       	  o.value = "";
	   }
	   return;
	}

        var next_level   = ( eval(level) + 1 );
        var _selected = $selected.children("option[selected]");
        
        if ( level == 3 ) {
            j$("#" + base_name).attr({ value:_selected.val() });
	    $self.set_value( $selected );
            return;
        }
        var next_item = j$("#" + base_name + '_' + next_level);
        
        var members = j$( eval('categories_' + next_level) );
        var children = j$.grep(members, function(obj) {
            return obj.parent_id == $selected.attr('value');
        });

        next_item.append(j$("<option>").html( '選択してください' ).attr( { value:'' } ));
        if ( children.length > 0 ) {
	    var next_value = j$( "#" + next_item.attr("name") + "_value" ).val();
            for (var i=0;i<children.length;i++) {
	        var id_value = children[i].id,
		    seled    = !!( id_value == next_value );
                var option = j$("<option>").html( children[i].name ).attr(
		    {
			value    : children[i].id,
			selected : seled
		    }
		);
                next_item.append( option );
            }
	    $self.set_value( next_item );
        }
        else {
            var option = j$("<option>").html( _selected.text() ).attr( { 
                value    : _selected.val(),
                selected : 'selected'
            } );
            j$("#" + base_name).attr({ value:_selected.val() });
            next_item.append( option );
	    $self.set_value( next_item );
        }
	// for backspace value.
	if ( level == 2 )
	   $self.set_value( $selected );
        next_item.parent().show();
	// callback
	if ( typeof $callback == 'function' )
	   $callback();
    },
    clear_child: function(base_name, level ) {
        j$("#" + base_name).attr({ value:'' });
        for (var i=3;i>level;i--) {
            var $obj = j$( "#" + base_name + '_' + i );
            $obj.children().remove();
            $obj.parent().hide();
        }
    },
    reset: function(base_name) {
        var $self = this;
        $self.clear_child(base_name, 1);

        var $root_category = j$("#" + base_name + '_' + 1 );
        $root_category.val('');
        $root_category.parent().show();
    },
    set_value: function ($selected) {
	var cv = "#" + $selected.attr("id") + "_value";
	j$( cv ).val( $selected.val() );        
    },
    cancel: function($clicked) {
        var $self = this;
        $clicked.attr('id').match( /^(([a-zA-Z\_\-]+)(\d*?))\_cancel\_link$/ );
        var base_name = RegExp.$1;
        var name      = RegExp.$2;
        var number    = RegExp.$3;
        $clicked.parent().remove();
        $self.reset(base_name);
    }
};

