+ def destroy_with_elements
+ res = false
+ Panel.transaction do
+ self.parts_element.each do |element|
+ raise ActiveRecord::Rollback unless element.destroy
+ end
+ raise ActiveRecord::Rollback unless self.destroy
+ res = true
+ end
+ res
+ end
+
+ def copy
+ attr = self.copy_attributes
+ Panel.each_element_class_names do |n|
+ attr.merge! Panel.class_name_to_class(n).panelize(self.elements_by_class_name(n).map {|elm| elm.copy_attributes})
+ end
+ attr
+ end
+
+ def copy_attributes
+ r = self.attributes
+ r.delete 'id'
+ r.delete 'author_id'
+ r.delete 'created_at'
+ r.delete 'updated_at'
+ r
+ end
+
+ def self.panelize panel
+ attr = panel.attributes
+ attr.delete 'id'
+ attr
+ end
+
+
+=begin
+ def self.validate_id ary, pid
+ ary.map {|v|
+ if pid
+ (v == pid or v == nil) ? nil : false
+ else
+ v ? false : nil
+ end
+ }.compact.empty?
+ end
+
+ def self.validate_element_id elements, name, pid
+ Panel.validate_id(Panel.collect_element_value(elements, name), pid)
+ end
+
+ def self.validate_elements_id c
+ c.map {|conf|
+ Panel.validate_element_id(conf[:elements], conf[:name], conf[:parent_id]) ? nil : false
+ }.compact.empty?
+ end
+
+ def validate_id_list
+ r = self.speech_balloons.map {|sb|
+ {:elements => [sb.speeches, sb.balloons], :name => :speech_balloon_id, :parent_id => sb.id}
+ }
+ r.unshift({:elements => [self.panel_pictures, self.speech_balloons], :name => :panel_id, :parent_id => self.id})
+ r