##############################################################################
#
# Copyright (c) 2002 Nexedi SARL and Contributors. All Rights Reserved.
#                    Jean-Paul Smets-Solanes <jp@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
#
##############################################################################
"""
    ERP5 is a set of components to implement an ERP
    with Zope
"""
from __future__ import absolute_import

# Update ERP5 Globals
from Products.ERP5Type.Utils import initializeProduct, updateGlobals
from AccessControl import ModuleSecurityInfo
import sys
from . import Permissions
from Products.PythonScripts.Utility import allow_class
from AccessControl.SecurityInfo import allow_module
this_module = sys.modules[ __name__ ]
document_classes = updateGlobals( this_module, globals(),
                                  permissions_module = Permissions)

# Define object classes and tools
from . import Form, FSForm, ListBox, ReportBox, MatrixBox
from .Tool import SelectionTool
from . import OOoChart, PDFTemplate, Report, ParallelListField
from . import PlanningBox, POSBox, FormBox, EditorField, ProxyField, DurationField
from . import RelationField, ImageField, MultiRelationField, MultiLinkField, InputButtonField
from . import CaptchaField
from . import PreferenceTool

from Products.Formulator.FieldRegistry import FieldRegistry
from Products.Formulator import StandardFields, HelperFields
from Products.CMFCore.utils import registerIcon


object_classes = ( Form.ERP5Form, FSForm.ERP5FSForm, PDFTemplate.PDFTemplate,
                   Report.ERP5Report)
portal_tools = ( SelectionTool.SelectionTool, PreferenceTool.PreferenceTool )
content_classes = ( )
content_constructors = ()

# Optimization
from Products.ERP5Type.PsycoWrapper import psyco
psyco.bind(ListBox.ListBoxWidget.render)
psyco.bind(ListBox.ListBoxValidator.validate)

# Finish installation
def initialize( context ):
    from . import Document
    initializeProduct(context, this_module, globals(),
                         document_module = Document,
                         document_classes = document_classes,
                         object_classes = object_classes,
                         portal_tools = portal_tools,
                         content_constructors = content_constructors,
                         content_classes = content_classes)

    # Initialise ERP5Form Formulator
    FieldRegistry.registerField(ProxyField.ProxyField,
                                'www/StringField.gif')
    FieldRegistry.registerField(DurationField.DurationField,
                                'www/StringField.gif')
    FieldRegistry.registerField(EditorField.EditorField,
                                'www/TextAreaField.gif')
    FieldRegistry.registerField(FormBox.FormBox,
                                'www/StringField.gif')
    FieldRegistry.registerField(POSBox.POSBox,
                                'www/StringField.gif')
    FieldRegistry.registerField(ListBox.ListBox,
                                'www/StringField.gif')
    FieldRegistry.registerField(ReportBox.ReportBox,
                                'www/StringField.gif')
    FieldRegistry.registerField(PlanningBox.PlanningBox,
                                'www/StringField.gif')
    FieldRegistry.registerField(MatrixBox.MatrixBox,
                                'www/StringField.gif')
    FieldRegistry.registerField(RelationField.RelationStringField,
                                'www/StringField.gif')
    FieldRegistry.registerField(MultiRelationField.MultiRelationStringField,
                                'www/StringField.gif')
    FieldRegistry.registerField(ImageField.ImageField,
                                'www/StringField.gif')
    FieldRegistry.registerField(StandardFields.StringField,
                                'www/StringField.gif')
    FieldRegistry.registerField(StandardFields.CheckBoxField,
                                'www/CheckBoxField.gif')
    FieldRegistry.registerField(StandardFields.IntegerField,
                                'www/IntegerField.gif')
    FieldRegistry.registerField(StandardFields.TextAreaField,
                                'www/TextAreaField.gif')
    FieldRegistry.registerField(StandardFields.RawTextAreaField,
                                'www/TextAreaField.gif')
    FieldRegistry.registerField(StandardFields.LinesField,
                                'www/LinesField.gif')
    FieldRegistry.registerField(StandardFields.ListField,
                                'www/ListField.gif')
    FieldRegistry.registerField(StandardFields.MultiListField,
                                'www/MultiListField.gif')
    FieldRegistry.registerField(ParallelListField.ParallelListField,
                                'www/MultiListField.gif')
    FieldRegistry.registerField(StandardFields.RadioField,
                                'www/RadioField.gif')
    FieldRegistry.registerField(StandardFields.MultiCheckBoxField,
                                'www/MultiCheckBoxField.gif')
    FieldRegistry.registerField(StandardFields.PasswordField,
                                'www/PasswordField.gif')
    FieldRegistry.registerField(StandardFields.EmailField,
                                'www/EmailField.gif')
    FieldRegistry.registerField(StandardFields.PatternField,
                                'www/PatternField.gif')
    FieldRegistry.registerField(StandardFields.FloatField,
                                'www/FloatField.gif')
    FieldRegistry.registerField(StandardFields.DateTimeField,
                                'www/DateTimeField.gif')
    FieldRegistry.registerField(StandardFields.FileField,
                                'www/FileField.gif')
    FieldRegistry.registerField(StandardFields.LinkField,
                                'www/LinkField.gif')
    FieldRegistry.registerField(StandardFields.LabelField,
                                'www/LabelField.gif')
    FieldRegistry.registerField(MultiLinkField.MultiLinkField,
                                'www/LinkField.gif')
    FieldRegistry.registerField(InputButtonField.InputButtonField,
                                'www/StringField.gif')
    FieldRegistry.registerField(OOoChart.OOoChart,
                                'www/StringField.gif')
    FieldRegistry.registerField(CaptchaField.CaptchaField,
                                'www/StringField.gif')

    # some helper fields
    FieldRegistry.registerField(HelperFields.ListTextAreaField)
    FieldRegistry.registerField(HelperFields.MethodField)
    FieldRegistry.registerField(HelperFields.TALESField)

    from . import HyperLinkField
    FieldRegistry.registerField(HyperLinkField.HyperLinkField,
                                'www/LinkField.gif')

    from . import VideoField
    FieldRegistry.registerField(VideoField.VideoField,
                                'www/StringField.gif')
    from . import AudioField
    FieldRegistry.registerField(AudioField.AudioField,
                                'www/StringField.gif')
    from . import GadgetField
    FieldRegistry.registerField(GadgetField.GadgetField,
                                'www/StringField.gif')
    from . import HoneypotField
    FieldRegistry.registerField(HoneypotField.HoneypotField,
                                'www/StringField.gif')

    # register help for the product
    context.registerHelp()
    # register field help for all fields
    FieldRegistry.registerFieldHelp(context)

    # make Dummy Fields into real fields
    FieldRegistry.initializeFields()

    # do initialization of Form class to make fields addable
    Form.initializeForm(FieldRegistry)
    Form.initializeForm(FieldRegistry, form_class=Report.ERP5Report)

    # Register FSPDFTemplate icon
    registerIcon(PDFTemplate.FSPDFTemplate,
                        'www/PDF.png', globals())
    # Register ProxyField icon
    registerIcon(ProxyField.ProxyField,
                        'www/ProxyField.png', globals())


## Initialize security ##
ModuleSecurityInfo('Products.ERP5Form.Report').declarePublic('ReportSection',)
ModuleSecurityInfo('Products.ERP5Form.MultiRelationField').declarePublic('SUB_FIELD_ID',)
allow_module('Products.ERP5Form.Selection')
from . import Selection
allow_class(Selection)

__module_aliases__ = ('Products.ERP5Form.SelectionTool', SelectionTool),