Dynamic data for osTicket

*This is a major redesign / rework of the osTicket base*

This patch drops the concept of static ticket metadata and allows for an
admin-configurable arbitrary data that is attachable to tickets

The system is architected such that the base osTicket install now comes with
a "default" form that has fields for subject, name, email, and phone number.
This form is editable to allow for the addition of arbitrary other fields;
however, the basic fields must remain in order to be associated with a
help-topic and attached to a ticket.

This concept can be expanded to allow for arbitrary data associated with
registered clients or ticket thread items.

Forms are comprised of sections. Sections have a title and instructions
properties and a list of fields. Fields have various implementations to
represent different data such as text, long answer, phone number, datetime,
yes/no, and selections, and are configurable to define the look and feel and
interpretation of the respective form field.

Dropdown lists are represented as "Dynamic Lists", which are
admin-configurable lists of items. Dropdowns can be optionally represented
as Bootstrap typeahead fields.

This also adds the start of a simple ORM which will hopefully be expanded in
the future to support multiple database platforms. Currently, only MySQL is
implemented.
Better implementation of joins in ORM

Use an internal hash table of join information to prevent multiple joins
over the same path. Also use table aliases in order to support self joins or
otherwise multiple joins to the same table using different paths.
Rebase form sections to forms and remove form sets

Previously, form sections were grouped into form sets for reusability. This
patch drops the form sets and makes form sections the new "forms".
Eventually a section-header field will be added that technically does not
add any dynamic data to the form, but allows for the same feature as having
a form set with multiple sections.
Move client information to separate formset

This moves client information like name and email address out of the general
dynamic forms data for a ticket. It really paves the way for the first-class
user of the future.
Completion of dynamic forms concept

Moved to an initial form which specifies the ticket's priority and issue and
changed the rendering to render things properly. Now the user can decide
where priority shows on the client side, and the priority privacy setting is
placed in the dynamic form wizard.

The standard form is added to every ticket without option. Extra forms can
be defined and associated with help topics which can additionally be added
to tickets upon creation. This allows for standardization of the dynamic
data location for searches and filtering.

Implemented advanced search for dynamic data. Along with reinstating the
basic ticket search on keywords

Implemented ticket filtering on dynamic data for both keyword searches as
well as searches for special fields (drop-down lists, etc.)

Phone number for users is now completely optional
Fixup the installer

Fixup several minor bugs concerning initial experience
Fix bug when creating a new dynamic list
Fix changing and saving of client's name
Significant fixes made after final feature review
Fix the upgrade scripts
Rebase onto feature/html-thread
Add icons for custom forms
Adding support for database connection on a non-standard port.
Just add ":port" to the DBHOST during the installation.
Complete the upgrader
Fix insane performance issue on ticket page
Fix oops in html-thread migration script
Finish display of custom field content in tickets
Merge pull request #2 from greezybacon/feature/dynamic-forms

Dynamic data for osTicket

Sorta Reviewed-By: Peter Rotich <peter@osticket.com>
Merge remote branch 'infoza/develop' into feature/non-standard-port
Validate port during installation

Add help information about the non-standard port number to the popup tips in
the install screen.

Support MySQL 'localhost' connections using a non-standard port number.
Ordinarily, MySQL will ignore the port setting on *nix systems if the host
is specified as 'localhost'