/**
  * Get the list of parameters for this form.
  * @return array List of parameters that this form requires.
  */
 public static function get_parameters()
 {
     $r = array_merge(iform_report_get_report_parameters(), iform_map_get_map_parameters(), array(array('name' => 'indicia_species_layer_feature_type', 'caption' => 'Feature type for Indicia species layer', 'description' => 'Set to the name of a feature type on GeoServer that will be loaded to display the Indicia species data for the selected record. ' . 'Leave empty for no layer. Normally this should be set to a feature type that exposes the cache_occurrences table.', 'type' => 'text_input', 'required' => true, 'default' => 'indicia:cache_occurrences', 'group' => 'Other Map Settings'), array('name' => 'indicia_species_layer_filter_field', 'caption' => 'Field to filter on', 'description' => 'Set to the name of a field exposed by the feature type which contains the external key defined for the species ' . 'and can therefore be used to filter the layer. ', 'type' => 'text_input', 'required' => true, 'default' => 'taxa_taxon_list_external_key', 'group' => 'Other Map Settings'), array('name' => 'indicia_species_layer_slds', 'caption' => 'SLD files from GeoServer for Indicia species layer', 'description' => 'Set to the names of SLD files available on the GeoServer for the rendering of the Indicia species layer, or leave blank for default. ' . 'Provide one per species layer you are going to allow on the map. Layer styles will be cycled through.', 'type' => 'textarea', 'required' => false, 'default' => "dist_point_red\ndist_point_blue", 'group' => 'Other Map Settings')));
     foreach ($r as &$param) {
         if ($param['name'] === 'report_name') {
             $param['default'] = 'library/taxa/occurrence_counts_summary_by_external_key';
         } elseif ($param['name'] === 'indicia_species_layer_filter_field') {
             $param['default'] = 'taxa_taxon_list_external_key';
         } elseif ($param['name'] === 'param_presets') {
             $param['default'] = "date_from=\ndate_to=\nsurvey_id=\nquality=C\nlocation_id={profile_location}\ntaxon_groups={profile_taxon_groups}\ncurrentUser={profile_indicia_user_id}";
         }
     }
     return $r;
 }
Ejemplo n.º 2
0
    /**
     * Get the list of parameters for this form.
     * @return array List of parameters that this form requires.
     * @todo: Implement this method
     */
    public static function get_parameters()
    {
        return array_merge(iform_report_get_report_parameters(), array(array('name' => 'header', 'caption' => 'Header', 'description' => 'HTML to insert into the header of the report output.', 'type' => 'textarea', 'required' => false, 'group' => 'Output templates'), array('name' => 'footer', 'caption' => 'Footer', 'description' => 'HTML to insert into the footer of the report output.', 'type' => 'textarea', 'required' => false, 'group' => 'Output templates'), array('name' => 'bands', 'caption' => 'Report Bands', 'description' => 'A list of bands which are output once per report row in the order provided. ' . 'Bands may also be configured to output as a header band, only when the value of a certain field changes between rows. ' . 'For example if a report is sorted by site name, then a band can be emmitted only when the site name value changes and can display ' . 'the new site name as a header.', 'group' => 'Output templates', 'required' => false, 'type' => 'jsonwidget', 'schema' => '{
  "type":"seq",
  "title":"Bands",
  "sequence":
  [
    {
      "type":"map",
      "title":"Band",
      "mapping": {
        "content":{"type":"str","desc":"Contains an HTML template for the output of the band. The ' . 'template can contain replacements for each field value in the row, e.g. the ' . 'replacement {survey} is replaced with the value of the field called survey. The actual replacements ' . 'available depends on the selected report\'s output fields."},
        "triggerFields":{"type":"seq","sequence":[{"type":"str"}]}
      }
    }
  ]
}')));
    }
Ejemplo n.º 3
0
    /**
     * Get the list of parameters for this form.
     * @return array List of parameters that this form requires.
     */
    public static function get_parameters()
    {
        return array_merge(iform_report_get_report_parameters(), array(array('name' => 'columns_config', 'caption' => 'Columns Configuration', 'description' => 'Define a list of columns with various configuration options when you want to override the ' . 'default output of the report.', 'type' => 'jsonwidget', 'schema' => '{
  "type":"seq",
  "title":"Columns List",
  "sequence":
  [
    {
      "type":"map",
      "title":"Column",
      "mapping": {
        "fieldname": {"type":"str","desc":"Name of the field to output in this column. Does not need to be specified when using the template option."},
        "display": {"type":"str","desc":"Caption of the column, which defaults to the fieldname if not specified."},
        "actions": {
          "type":"seq",
          "title":"Actions List",
          "sequence": [{
            "type":"map",
            "title":"Actions",
            "desc":"List of actions to make available for each row in the grid.",
            "mapping": {
              "caption": {"type":"str","desc":"Display caption for the action\'s link."},
              "visibility_field": {"type":"str","desc":"Optional name of a field in the data which contains true or false to define the visibility of this action."},
              "url": {"type":"str","desc":"A url that the action link will point to, unless overridden by JavaScript. The url can contain tokens which ' . 'will be subsituted for field values, e.g. for http://www.example.com/image/{id} the {id} is replaced with a field called id in the current row. ' . 'Can also use the subsitution {currentUrl} to link back to the current page, {rootFolder} to represent the folder on the server that the current PHP page is running from, and ' . '{imageFolder} for the image upload folder"},
              "urlParams": {
                "type":"map",
                "subtype":"str",
                "desc":"List of parameters to append to the URL link, with field value replacements such as {id} begin replaced ' . 'by the value of the id field for the current row."
              },
              "class": {"type":"str","desc":"CSS class to attach to the action link."},
              "javascript": {"type":"str","desc":"JavaScript that will be run when the link is clicked. Can contain field value substitutions ' . 'such as {id} which is replaced by the value of the id field for the current row. Because the javascript may pass the field values as parameters to functions, ' . 'there are escaped versions of each of the replacements available for the javascript action type. Add -escape-quote or ' . '-escape-dblquote to the fieldname. For example this would be valid in the action javascript: foo(\\"{bar-escape-dblquote}\\"); ' . 'even if the field value contains a double quote which would have broken the syntax."}
            }
          }]
        },
        "visible": {"type":"bool","desc":"Should this column be shown? Hidden columns can still be used in templates or actions."},
        "template": {"type":"txt","desc":"Allows you to create columns that contain dynamic content using a template, rather than just the output ' . 'of a field. The template text can contain fieldnames in braces, which will be replaced by the respective field values. ' . 'Note that template columns cannot be sorted by clicking grid headers." }
      }
    }
  ]
}', 'required' => false, 'group' => 'Report Settings'), array('name' => 'gallery_col_count', 'caption' => 'Gallery Column Count', 'description' => 'If set to a value greater than one, then each grid row will contain more than one record of data from the database, allowing ' . ' a gallery style view to be built.', 'type' => 'int', 'required' => false, 'default' => 1, 'group' => 'Report Settings'), array('name' => 'items_per_page', 'caption' => 'Items per page', 'description' => 'Maximum number of rows shown on each page of the table', 'type' => 'int', 'default' => 20, 'required' => true, 'group' => 'Report Settings'), array('name' => 'download_link', 'caption' => 'Download link', 'description' => 'Should a link be made available to download the report content as CSV?', 'type' => 'checkbox', 'default' => 1, 'required' => false, 'group' => 'Report Settings'), array('name' => 'footer', 'caption' => 'Footer', 'description' => 'Additional HTML to include in the report footer area.', 'type' => 'textarea', 'required' => false, 'group' => 'Report Settings')));
    }
Ejemplo n.º 4
0
    /**
     * Get the list of parameters for this form.
     * @return array List of parameters that this form requires.
     */
    public static function get_parameters()
    {
        return array_merge(iform_report_get_report_parameters(), array(array('name' => 'columns_config', 'caption' => 'Columns Configuration', 'description' => 'Define a list of columns with various configuration options when you want to override the ' . 'default output of the report.', 'type' => 'jsonwidget', 'schema' => '{
  "type":"seq",
  "title":"Columns List",
  "sequence":
  [
    {
      "type":"map",
      "title":"Column",
      "mapping": {
        "fieldname": {"type":"str","desc":"Name of the field to output in this column. Does not need to be specified when using the template option."},
        "display": {"type":"str","desc":"Caption of the column, which defaults to the fieldname if not specified."},
        "actions": {
          "type":"seq",
          "title":"Actions List",
          "sequence": [{
            "type":"map",
            "title":"Actions",
            "desc":"List of actions to make available for each row in the grid.",
            "mapping": {
              "caption": {"type":"str","desc":"Display caption for the action\'s link."},
              "img": {"type":"str","desc":"Set img to the path to an image to use an image for the action instead of a text caption - the caption ' . 'then becomes the image\'s title. The image path can contain {rootFolder} to be replaced by the root folder of the site, in this ' . 'case it excludes the path parameter used in Drupal when dirty URLs are used (since this is a direct link to a URL)."},
              "visibility_field": {"type":"str","desc":"Optional name of a field in the data which contains true or false to define the visibility of this action."},
              "url": {"type":"str","desc":"A url that the action link will point to, unless overridden by JavaScript. The url can contain tokens which ' . 'will be subsituted for field values, e.g. for http://www.example.com/image/{id} the {id} is replaced with a field called id in the current row. ' . 'Can also use the subsitution {currentUrl} to link back to the current page, {rootFolder} to represent the folder on the server that the current PHP page is running from, and ' . '{imageFolder} for the image upload folder"},
              "urlParams": {
                "type":"map",
                "subtype":"str",
                "desc":"List of parameters to append to the URL link, with field value replacements such as {id} begin replaced ' . 'by the value of the id field for the current row."
              },
              "class": {"type":"str","desc":"CSS class to attach to the action link."},
              "javascript": {"type":"str","desc":"JavaScript that will be run when the link is clicked. Can contain field value substitutions ' . 'such as {id} which is replaced by the value of the id field for the current row. Because the javascript may pass the field values as parameters to functions, ' . 'there are escaped versions of each of the replacements available for the javascript action type. Add -escape-quote or ' . '-escape-dblquote to the fieldname. For example this would be valid in the action javascript: foo(\\"{bar-escape-dblquote}\\"); ' . 'even if the field value contains a double quote which would have broken the syntax."}
            }
          }]
        },
        "visible": {"type":"bool","desc":"Should this column be shown? Hidden columns can still be used in templates or actions."},
        "template": {"type":"txt","desc":"Allows you to create columns that contain dynamic content using a template, rather than just the output ' . 'of a field. The template text can contain fieldnames in braces, which will be replaced by the respective field values. ' . 'Note that template columns cannot be sorted by clicking grid headers." },
        "json": {"type":"bool","desc":"Set to true if the column contains a json string object with properties that can be decoded to give strings that ' . 'can be used as replacements in a template."},
        "update": {
          "type":"map",
          "title":"Update Specification",
          "desc":"Defines the configuration to allow this field to update the database via AJAX. This assumes assume that we have access through iform_ajaxproxy.",
          "mapping": {
            "permission": {"type":"str","desc":"The CMS permission that the user must have in order for the field to be editable. If left blank then all users may update it."},
            "method": {"type":"str","desc":"Ajax proxy method, e.g. loc"},
            "tablename": {"type":"str","desc":"Submission table name: used to create the form field names from which the submission is built; e.g. location"},
            "fieldname": {"type":"str","desc":"Field name for this field in submission; e.g. code"},
            "website_id": {"type":"str","desc":"website_id"},
            "class": {"type":"str","desc":"Class name to apply to input control."},
            "parameters": {
              "type":"map",
              "subtype":"str",
              "desc":"List of parameters to copy from the report to the submission; with field value replacements such as {id} begin replaced ' . 'by the value of the id field for the current row."
            }
          }
        }
      }
    }
  ]
}', 'required' => false, 'group' => 'Report Settings'), array('name' => 'gallery_col_count', 'caption' => 'Gallery Column Count', 'description' => 'If set to a value greater than one, then each grid row will contain more than one record of data from the database, allowing ' . ' a gallery style view to be built.', 'type' => 'int', 'required' => false, 'default' => 1, 'group' => 'Report Settings'), array('name' => 'download_link', 'caption' => 'Download link', 'description' => 'Should a link be made available to download the report content as CSV?', 'type' => 'checkbox', 'default' => 1, 'required' => false, 'group' => 'Report Settings'), array('name' => 'footer', 'caption' => 'Footer', 'description' => 'Additional HTML to include in the report footer area. If using this to create internal links, the replacement {rootFolder} can be used to give the path to the root of the site.', 'type' => 'textarea', 'required' => false, 'group' => 'Report Settings')));
    }
Ejemplo n.º 5
0
 /**
  * Get the list of parameters for this form.
  * @return array List of parameters that this form requires.
  */
 public static function get_parameters()
 {
     return array_merge(iform_report_get_report_parameters(), iform_map_get_map_parameters(), array(array('name' => 'layer_picker', 'caption' => 'Include Layer Picker', 'description' => 'Choose whether to include a layer picker and where to include it. Use the ' . 'CSS id map-layer-picker for styling. Note that including the layer picker automatically removes the ' . 'layerSwitcher control from the map.', 'type' => 'select', 'required' => true, 'options' => array('none' => 'Exclude the layer picker', 'before' => 'Include the layer picker before the map.', 'after' => 'Include the layer picker after the map.'), 'default' => 'none', 'group' => 'Report Map Settings'), array('name' => 'legend', 'caption' => 'Include Legend', 'description' => 'Choose whether to include a legend and where to include it. Use the ' . 'CSS id map-legend for styling.', 'type' => 'select', 'required' => true, 'options' => array('none' => 'Exclude the legend', 'before' => 'Include the legend before the map.', 'after' => 'Include the legend after the map.'), 'default' => 'after', 'group' => 'Report Map Settings'), array('name' => 'map_toolbar_pos', 'caption' => 'Map Toolbar Position', 'description' => 'Specify the position of the map toolbar. Either use \'map\' to place it in the corner of the map, ' . '\\top\' to place it at the top, \'bottom\' to place it at the bottom, or provide the CSS ID of a div element on the page that the ' . 'toolbar should be added to.', 'type' => 'text_input', 'required' => true, 'default' => 'top', 'group' => 'Report Map Settings'), array('name' => 'click_on_map_mode', 'caption' => 'Click to query map', 'description' => 'Choose the behaviour you want when clicking on distribution points on the map. The output can display as a popup, ' . 'or can be loaded into the div specified in the next parameter. If you select to filter Indicia ' . 'report grids, then this assumes you have built a page containing other report grids e.g. by following ' . '<a href="http://code.google.com/p/indicia/wiki/DrupalDashboardReporting">this tutorial</a>. The report you are using must ' . 'have a parameter of type "idlist" which allows the report to filter to the selection on the map.', 'type' => 'select', 'options' => array('none' => 'No action', 'popup' => 'Display output in a popup', 'div' => 'Display output in a div', 'report' => 'Filter any Indicia report grids with the same report group setting'), 'default' => 'popup', 'group' => 'Report Map Settings'), array('name' => 'click_on_map_div', 'caption' => 'Click to query map output div', 'description' => 'If you choose to display a data grid when clicking on the map distribution points, specify the name of the div ' . 'to display the output in here. ', 'type' => 'text_input', 'required' => false, 'group' => 'Report Map Settings'), array('name' => 'click_on_map_columns', 'caption' => 'Columns displayed on click', 'description' => 'Specify each report column you want to output when clicking on the map on a separate line. Each column must be represented as a key=value pair ' . 'with the column name as the key and the display label as the value.', 'type' => 'textarea', 'required' => false, 'group' => 'Report Map Settings'), array('name' => 'geoserver_layer', 'caption' => 'GeoServer Layer', 'description' => 'For improved mapping performance, specify a layer on GeoServer which ' . 'has the same attributes and output as the report file. Then the report map can output ' . 'the contents of this layer filtered by the report parameters, rather than build a layer ' . 'from the report data.', 'type' => 'text_input', 'required' => false, 'group' => 'WMS Mapping'), array('name' => 'geoserver_layer_style', 'caption' => 'GeoServer Layer Style', 'description' => 'Optional name of the SLD file available on GeoServer which is to be applied to the GeoServer layer.', 'type' => 'text_input', 'required' => false, 'group' => 'WMS Mapping'), array('name' => 'cql_template', 'caption' => 'CQL Filter Template', 'description' => 'Use with the geoserver_layer to provide a template for the CQL to filter the layer ' . 'according to the parameters of the report. For example, if you are using the report called ' . '<em>map_occurrences_by_survey</em> then you can set the geoserver_layer to the indicia:detail_occurrences ' . 'layer and set this to <em>INTERSECTS(geom, #searchArea#) AND survey_id=#survey#</em>.', 'type' => 'textarea', 'required' => false, 'group' => 'WMS Mapping')));
 }
Ejemplo n.º 6
0
    /**
     * Get the list of parameters for this form.
     * @return array List of parameters that this form requires.
     */
    public static function get_parameters()
    {
        return array_merge(iform_report_get_report_parameters(), array(array('name' => 'chart_type', 'caption' => 'Chart Type', 'description' => 'Type of chart.', 'type' => 'select', 'lookupValues' => array('line' => lang::get('Line'), 'bar' => lang::get('bar'), 'pie' => lang::get('Pie')), 'required' => true, 'default' => 'line', 'group' => 'Basic Chart Options'), array('name' => 'width', 'caption' => 'Chart Width', 'description' => 'Width of the output chart in pixels.', 'type' => 'text_input', 'required' => true, 'default' => 500, 'group' => 'Basic Chart Options'), array('name' => 'height', 'caption' => 'Chart Height', 'description' => 'Height of the output chart in pixels.', 'type' => 'text_input', 'required' => true, 'default' => 500, 'group' => 'Basic Chart Options'), array('name' => 'y_values', 'caption' => 'Y Values', 'description' => 'Fields containing the y values or pie segment sizes, comma separated if this is a multi-series chart.', 'type' => 'text_input', 'required' => true, 'group' => 'Basic Chart Options'), array('name' => 'x_values', 'caption' => 'X Values', 'description' => 'Fields containing the x values when the x-axis contains numerical values rather than labels, ' . 'comma separated if this is a multi-series chart.', 'type' => 'text_input', 'required' => false, 'group' => 'Basic Chart Options'), array('name' => 'x_labels', 'caption' => 'X Labels', 'description' => 'Fields containing the x labels or pie segment titles when the x-axis contains arbitrary labels, ' . 'comma separated if this is a multi-series chart.', 'type' => 'text_input', 'required' => false, 'group' => 'Basic Chart Options'), array('name' => 'renderer_options', 'caption' => 'Renderer Options', 'description' => 'Editor for the renderer options to pass to the chart. For full details of the options available, ' . 'see <a href="http://www.jqplot.com/docs/files/plugins/jqplot-barRenderer-js.html">bar chart renderer options</a>, ' . '<a href="http://www.jqplot.com/docs/files/plugins/jqplot-lineRenderer-js.html">line charts rendered options<a/> or ' . '<a href="http://www.jqplot.com/docs/files/plugins/jqplot-pieRenderer-js.html">pie chart renderer options</a>.', 'type' => 'jsonwidget', 'schema' => '{
  "type":"map",
  "title":"Renderer Options",
  "mapping":{
    "barPadding":{"title":"Bar Padding", "type":"int","desc":"Number of pixels between adjacent bars at the same axis value."},
    "barMargin":{"title":"Bar Margin", "type":"int","desc":"Number of pixels between groups of bars at adjacent axis values."},
    "barDirection":{"title":"Bar Direction", "type":"str","desc":"Select vertical for up and down bars or horizontal for side to side bars","enum":["vertical","horizontal"]},
    "barWidth":{"title":"Bar Width", "type":"int","desc":"Width of the bar in pixels (auto by devaul)."},
    "shadowOffset":{"title":"Bar or Pie Slice Shadow Offset", "type":"number","desc":"Offset of the shadow from the slice and offset of each succesive stroke of the shadow from the last."},
    "shadowDepth":{"title":"Bar or Pie Slice Shadow Depth", "type":"int","desc":"Number of strokes to apply to the shadow, each stroke offset shadowOffset from the last."},
    "shadowAlpha":{"title":"Bar or Pie Slice Shadow Alpha", "type":"number","desc":"Transparency of the shadow (0 = transparent, 1 = opaque)"},
    "waterfall":{"title":"Bar Waterfall","type":"bool","desc":"Check to enable waterfall plot."},
    "groups":{"type":"int","desc":"Group bars into this many groups."},
    "varyBarColor":{"type":"bool","desc":"Check to color each bar of a series separately rather than have every bar of a given series the same color."},
    "highlightMouseOver":{"type":"bool","desc":"Check to highlight slice, bar or filled line plot when mouse over."},
    "highlightMouseDown":{"type":"bool","desc":"Check to highlight slice, bar or filled line plot when mouse down."},
    "highlightColors":{"type":"seq","desc":"An array of colors to use when highlighting a bar or pie slice.",
        "sequence":[{"type":"str"}]
    },
    "highlightColor":{"type":"str","desc":"A colour to use when highlighting an area on a filled line plot."},
    "diameter":{"title":"Pie Diameter","type":"int","desc":"Outer diameter of the pie, auto computed by default."},
    "padding":{"title":"Pie Padding","type":"int","desc":"padding between the pie and plot edges, legend, etc."},
    "sliceMargin":{"title":"Pie Slice Margin","type":"int","desc":"Angular spacing between pie slices in degrees."},
    "fill":{"title":"Pie Fill", "type":"bool","desc":"true or false, whether to fill the slices."},
    "dataLabels":{"title":"Pie Data Labels", "type":"str","desc":"Select what to display as labels on pie slices.",
      "enum":["label","value","percent"]
    },
    "showDataLabels":{"title":"Pie Show Data Labels", "type":"bool","desc":"Check to show data labels on pie slices."},
    "dataLabelFormatString":{"title":"Pie Data Label Format String", "type":"str","desc":"Format string for data labels. %s is replaced with the label, %d with the value, %d%% with the percentage."},
    "dataLabelThreshold":{"title":"Pie Data Label Threshold", "type":"int","desc":"Threshhold in percentage (0-100) of pie area, below which no label will be displayed.  This applies to all label types, not just to percentage labels."},
    "dataLabelPositionFactor":{"title":"Pie Data Label Position Factor", "type":"number","desc":"A Multiplier (0-1) of the pie radius which controls position of label on slice."},
    "dataLabelNudge":{"title":"Pie Data Label Nudge", "type":"number","desc":"Number of pixels to slide the label away from (+) or toward (-) the center of the pie."},
    "dataLabelCenterOn":{"title":"Pie Data Label Centre On", "type":"bool","desc":"Check to center the data label at its position."},
    "startAngle":{"title":"Pie Start Angle", "type":"int","desc":"Angle to start drawing pie in degrees."}
  }  
}', 'required' => false, 'group' => 'Advanced Chart Options'), array('name' => 'legend_options', 'caption' => 'Legend Options', 'description' => 'Editor for the legend options to pass to the chart. For full details of the options available, ' . 'see <a href="http://www.jqplot.com/docs/files/jqplot-core-js.html#Legend">chart legend options</a>. ' . 'For example, set the value to <em>{"show":true,"location":"ne"}</em> to show the legend in the top-right ' . '(north east) corner.', 'type' => 'jsonwidget', 'schema' => '{
  "type":"map",
  "title":"Legend Options",
  "mapping":{
    "show":{"type":"bool","desc":"Whether to display the legend on the graph."},
    "location":{"type":"str","desc":"Placement of the legend (compass direction).","enum":["nw","n","ne","e","se","s","sw","w"]},
    "labels":{"type":"seq","desc":"Array of labels to use. By default the renderer will look for labels on the series.  Labels specified in this array will override labels specified on the series.",
        "sequence":[{"type":"str"}]},
    "showLabels":{"type":"bool","desc":"Check to show the label text on the legend."},
    "showSwatch":{"type":"bool","desc":"Check to show the color swatches on the legend."},
    "placement":{"type":"str","desc":"insideGrid places legend inside the grid area of the plot. OutsideGrid places the legend outside the grid but inside the plot container, shrinking the ' . 'grid to accomodate the legend. Outside places the legend ouside the grid area, but does not shrink the grid which can cause the legend to overflow the plot container.",
        "enum":["insideGrid","outsideGrid","outside"]},
    "border":{"type":"str","desc":"CSS spec for the border around the legend box."},
    "background":{"type":"str","desc":"CSS spec for the background of the legend box."},
    "textColor":{"type":"str","desc":"CSS color spec for the legend text."},
    "fontFamily":{"type":"str","desc":"CSS font-family spec for the legend text."},
    "fontSize":{"type":"str","desc":"CSS font-size spec for the legend text."},
    "rowSpacing":{"type":"str","desc":"CSS padding-top spec for the rows in the legend."},
    "marginTop":{"type":"str","desc":"CSS margin for the legend DOM element."},
    "marginRight":{"type":"str","desc":"CSS margin for the legend DOM element."},
    "marginBottom":{"type":"str","desc":"CSS margin for the legend DOM element."},
    "marginLeft":{"type":"str","desc":"CSS margin for the legend DOM element."}
  }
}', 'required' => false, 'group' => 'Advanced Chart Options'), array('name' => 'series_options', 'caption' => 'Series Options', 'description' => 'A list of series options to pass to the chart with one entry per series. ' . 'Applies to line and bar charts only. For full details of the options available, see ' . '<a href="http://www.jqplot.com/docs/files/jqplot-core-js.html#Series">chart series options</a>. ', 'type' => 'jsonwidget', 'schema' => '{
  "type":"seq",
  "title":"Series List",
  "sequence":
  [
    {
      "type":"map",
      "title":"Series",
      "mapping":
      {
        "show": {"type":"bool"},
        "label": {"type":"str"},
        "showlabel": {"type":"bool"},
        "color": {"type":"str","desc":"Specify the colour using CSS format, e.g. #ffffff or a named colour."},
        "lineWidth": {"type":"number","desc":"Width of the line in pixels."},
        "shadow": {"type":"bool"},
        "shadowAngle": {"type":"int","desc":"Shadow angle in degrees."},
        "shadowOffset": {"type":"number","desc":"Shadow offset from line in pixels."},
        "shadowDepth": {"type":"int","desc":"Number of times shadow is stroked, each stroke offset shadowOffset from the last."},
        "shadowAlpha": {"type":"number","desc":"Alpha channel transparency of shadow.  0 = transparent."},
        "breakOnNull": {"type":"bool","desc":"Whether line segments should be be broken at null value.  False will join point on either side of line."},
        "showLine": {"type":"bool","desc":"Whether to actually draw the line or not.  Series will still be renderered, even if no line is drawn."},
        "showMarker": {"type":"bool","desc":"Whether or not to show the markers at the data points."},
        "rendererOptions": {"type":"map",
            "mapping": {
            }
        },
        "markerOptions": {"type":"map",
            "mapping": {
              "style": {"type":"str","enum":["diamond","circle","square","x","plus","dash","filledDiamond","filledCircle","filledSquare"]},
              "size": {"type":"int"},
              "color": {"type":"str"}
            }
        },
        "fill": {"type":"bool","desc":"True or false, wether to fill under lines or in bars.  May not be implemented in all renderers."},
        "fillColor": {"type":"str","desc":"CSS color spec to use for fill under line.  Defaults to line color."},
        "fillAlpha": {"type":"number","desc":"Alpha transparency to apply to the fill under the line (between 0 and 1).  Use this to adjust alpha separate from fill color."},
        "useNegativeColors": {"type":"bool","desc":"True to color negative values differently in filled and bar charts."},
        "trendline": {
          "type":"map",
          "mapping": {
            "show": {"type":"bool"},
            "color":{"type":"str","desc":"Specify the colour using CSS format, e.g. #ffffff or a named colour."}
          }
        }
      }
    }
  ]
}', 'required' => false, 'group' => 'Advanced Chart Options'), array('name' => 'axes_options', 'caption' => 'Axes Options', 'description' => 'Editor for axes options to pass to the chart. Provide entries for yaxis and xaxis as required. ' . 'Applies to line and bar charts only. For full details of the options available, see ' . '<a href="http://www.jqplot.com/docs/files/jqplot-core-js.html#Axis">chart axes options</a>. ' . 'For example, <em>{"yaxis":{"min":0,"max":100}}</em>.', 'type' => 'jsonwidget', 'required' => false, 'group' => 'Advanced Chart Options', 'schema' => '{
  "type":"map",
  "title":"Axis options",
  "mapping":{
    "xaxis":{
      "type":"map",
      "mapping":{
        "show":{"type":"bool"},
        "tickOptions":{"type":"map","mapping":{
          "mark":{"type":"str","desc":"Tick mark type on the axis.","enum":["inside","outside","cross"]},
          "showMark":{"type":"bool"},
          "showGridline":{"type":"bool"},
          "isMinorTick":{"type":"bool"},
          "markSize":{"type":"int","desc":"Length of the tick marks in pixels.  For ‘cross’ style, length will be stoked above and below axis, so total length will be twice this."},
          "show":{"type":"bool"},
          "showLabel":{"type":"bool"},
          "formatString":{"type":"bool","desc":"Text used to construct the tick labels, with %s being replaced by the label."},
          "fontFamily":{"type":"str","desc":"CSS spec for the font-family css attribute."},
          "fontSize":{"type":"str","desc":"CSS spec for the font-size css attribute."},
          "textColor":{"type":"str","desc":"CSS spec for the color attribute."},
        }},
        "labelOptions":{"type":"map","mapping":{
          "label":{"type":"str","desc":"Label for the axis."},
          "show":{"type":"bool","desc":"Check to show the axis label."},
          "escapeHTML":{"type":"bool","desc":"Check to escape HTML entities in the label."},
        }},
        "min":{"type":"number","desc":"minimum value of the axis (in data units, not pixels)."},
        "max":{"type":"number","desc":"maximum value of the axis (in data units, not pixels)."},
        "autoscale":{"type":"bool","desc":"Autoscale the axis min and max values to provide sensible tick spacing."},
        "pad":{"type":"number","desc":"Padding to extend the range above and below the data bounds.  The data range is multiplied by this factor to determine minimum ' . 'and maximum axis bounds.  A value of 0 will be interpreted to mean no padding, and pad will be set to 1.0."},
        "padMax":{"type":"number","desc":"Padding to extend the range above data bounds.  The top of the data range is multiplied by this factor to determine maximum ' . 'axis bounds.  A value of 0 will be interpreted to mean no padding, and padMax will be set to 1.0."},
        "padMin":{"type":"numer","desc":"Padding to extend the range below data bounds.  The bottom of the data range is multiplied by this factor to determine minimum ' . 'axis bounds.  A value of 0 will be interpreted to mean no padding, and padMin will be set to 1.0."},
        "numberTicks":{"type":"int","desc":"Desired number of ticks."},
        "tickInterval":{"type":"number","desc":"Number of units between ticks."},
        "showTicks":{"type":"bool","desc":"Whether to show the ticks (both marks and labels) or not."},
        "showTickMarks":{"type":"bool","desc":"Wether to show the tick marks (line crossing grid) or not."},
        "showMinorTicks":{"type":"bool","desc":"Wether or not to show minor ticks."},
        "useSeriesColor":{"type":"bool","desc":"Use the color of the first series associated with this axis for the tick marks and line bordering this axis."},
        "borderWidth":{"type":"int","desc":"Width of line stroked at the border of the axis."},
        "borderColor":{"type":"str","desc":"Color of the border adjacent to the axis."},
        "syncTicks":{"type":"bool","desc":"Check to try and synchronize tick spacing across multiple axes so that ticks and grid lines line up."},
        "tickSpacing":{"type":"","desc":"Approximate pixel spacing between ticks on graph.  Used during autoscaling.  This number will be an upper bound, actual spacing will be less."}
      }
    },
    "yaxis":{
      "type":"map",
      "mapping":{
        "show":{"type":"bool"},
        "tickOptions":{"type":"map","mapping":{
          "mark":{"type":"str","desc":"Tick mark type on the axis.","enum":["inside","outside","cross"]},
          "showMark":{"type":"bool"},
          "showGridline":{"type":"bool"},
          "isMinorTick":{"type":"bool"},
          "markSize":{"type":"int","desc":"Length of the tick marks in pixels.  For ‘cross’ style, length will be stoked above and below axis, so total length will be twice this."},
          "show":{"type":"bool"},
          "showLabel":{"type":"bool"},
          "formatString":{"type":"bool","desc":"Text used to construct the tick labels, with %s being replaced by the label."},
          "fontFamily":{"type":"str","desc":"CSS spec for the font-family css attribute."},
          "fontSize":{"type":"str","desc":"CSS spec for the font-size css attribute."},
          "textColor":{"type":"str","desc":"CSS spec for the color attribute."},
        }},
        "labelOptions":{"type":"map","mapping":{
          "label":{"type":"str","desc":"Label for the axis."},
          "show":{"type":"bool","desc":"Check to show the axis label."},
          "escapeHTML":{"type":"bool","desc":"Check to escape HTML entities in the label."},
        }},
        "min":{"type":"number","desc":"minimum value of the axis (in data units, not pixels)."},
        "max":{"type":"number","desc":"maximum value of the axis (in data units, not pixels)."},
        "autoscale":{"type":"bool","desc":"Autoscale the axis min and max values to provide sensible tick spacing."},
        "pad":{"type":"number","desc":"Padding to extend the range above and below the data bounds.  The data range is multiplied by this factor to determine minimum ' . 'and maximum axis bounds.  A value of 0 will be interpreted to mean no padding, and pad will be set to 1.0."},
        "padMax":{"type":"number","desc":"Padding to extend the range above data bounds.  The top of the data range is multiplied by this factor to determine maximum ' . 'axis bounds.  A value of 0 will be interpreted to mean no padding, and padMax will be set to 1.0."},
        "padMin":{"type":"numer","desc":"Padding to extend the range below data bounds.  The bottom of the data range is multiplied by this factor to determine minimum ' . 'axis bounds.  A value of 0 will be interpreted to mean no padding, and padMin will be set to 1.0."},
        "numberTicks":{"type":"int","desc":"Desired number of ticks."},
        "tickInterval":{"type":"number","desc":"Number of units between ticks."},
        "showTicks":{"type":"bool","desc":"Whether to show the ticks (both marks and labels) or not."},
        "showTickMarks":{"type":"bool","desc":"Wether to show the tick marks (line crossing grid) or not."},
        "showMinorTicks":{"type":"bool","desc":"Wether or not to show minor ticks."},
        "useSeriesColor":{"type":"bool","desc":"Use the color of the first series associated with this axis for the tick marks and line bordering this axis."},
        "borderWidth":{"type":"int","desc":"Width of line stroked at the border of the axis."},
        "borderColor":{"type":"str","desc":"Color of the border adjacent to the axis."},
        "syncTicks":{"type":"bool","desc":"Check to try and synchronize tick spacing across multiple axes so that ticks and grid lines line up."},
        "tickSpacing":{"type":"","desc":"Approximate pixel spacing between ticks on graph.  Used during autoscaling.  This number will be an upper bound, actual spacing will be less."}
      }
    }
  }
}')));
    }